{"version":3,"sources":["start.frag","lib/almond/almond.js","lib/es6-promise-polyfill/promise.js","polyfills.js","lib/aja/src/aja.js","requester/template.js","requester/json.js","requester/jsonp.js","requester/requester.js","lib/leaflet/dist/leaflet-src.js","display/svgIcon.js","display/imagePath.js","security/apiKeySecurity.js","display/layers/tileLayer.js","rest/utils.js","rest/trafficViewport.js","model/selector.js","model/traffic/trafficModelId.js","services/utils.js","services/chain.js","services/validators.js","services/trafficModelId.js","rest/trafficIncidents.js","model/arrayMerge.js","model/traffic/trafficIncidents.js","services/converters.js","services/worldEdge.js","services/trafficIncidents.js","lib/t.js/t.js","unitFormatConverter/unitFormatConverter.js","display/layers/defaultIncidentsLayer.js","display/layers/trafficLayer.js","display/layers/trafficFlowLayer.js","display/layers/labelsLayer.js","rest/copyright.js","model/copyright/copyrightCaption.js","services/copyrightCaption.js","model/copyright/copyright.js","services/copyright.js","display/messageBox.js","display/copyright.js","display/map.js","rest/geocode.js","model/geocode/geocode.js","services/geocode.js","rest/structuredGeocode.js","services/structuredGeocode.js","rest/reverseGeocode.js","model/reverseGeocode/reverseGeocode.js","services/reverseGeocode/reverseGeocodeBase.js","services/reverseGeocode/reverseGeocode.js","services/reverseGeocode/crossStreetLookup.js","rest/search.js","model/search/search.js","services/search/search.js","services/search/fuzzySearch.js","services/search/poiSearch.js","services/search/categorySearch.js","services/search/geometrySearch.js","services/search/nearbySearch.js","model/search/lowBandwidthSearch.js","services/search/lowBandwidthSearch.js","rest/routing.js","model/routing/routing.js","services/routing.js","widgets/controls/location.js","widgets/controls/searchBox.js","widgets/controls/routeInputs.js","widgets/controls/routeInstructions.js","lib/markercluster/dist/leaflet.markercluster-src.js","widgets/views/markers.js","widgets/views/routeOnMap.js","widgets/views/routeSummary.js","main.js","config.js","end.frag"],"names":["root","factory","define","amd","tomtom","this","requirejs","require","undef","hasProp","obj","prop","hasOwn","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","normalizedBaseParts","baseParts","split","map","config","starMap","length","nodeIdCompat","jsSuffixRegExp","test","replace","charAt","slice","concat","splice","join","makeRequire","relName","forceSync","args","aps","arguments","push","req","apply","makeNormalize","makeLoad","depName","value","defined","callDep","waiting","defining","main","Error","splitPrefix","prefix","index","indexOf","substring","makeConfig","makeMap","handlers","Object","prototype","hasOwnProperty","plugin","parts","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","jQuery","global","asyncFlush","asyncQueue","asyncTimer","asyncCall","arg","asyncSetTimer","invokeResolver","resolver","promise","resolvePromise","resolve","rejectPromise","reason","reject","invokeCallback","subscriber","owner","settled","state_","data_","then","FULFILLED","handleThenable","REJECTED","resolved","TypeError","val","fulfill","PENDING","SEALED","publishFulfillment","publishRejection","publish","then_","forEach","Promise","NativePromise","nativePromiseSupported","r","NOOP","setImmediate","constructor","onFulfillment","onRejection","fulfilled","rejected","catch","all","promises","Class","Array","isArray","remaining","results","race","window","self","String","trim","a","b","c","d","types","methods","aja","data","events","Aja","url","_chain","validators","string","sync","bool","cache","type","header","headers","auth","user","passwd","timeout","ms","positiveInteger","method","queryString","params","plainObject","body","content","FormData","JSON","stringify","into","selector","document","querySelectorAll","HTMLElement","jsonPaddingName","paramName","jsonPadding","padding","func","on","cb","off","trigger","eventCalls","event","statusPattern","triggerStatus","match","keys","eventName","listenerStatus","go","_buildQuery","ajaGo","json","_xhr","res","parse","html","elt","innerHTML","processRes","key","timeoutId","isUrlEncoded","openParams","async","request","XMLHttpRequest","_data","contentType","_dataInBody","encodeURIComponent","open","setRequestHeader","onprogress","lengthComputable","loaded","total","onload","response","responseText","clearTimeout","status","onerror","err","expiredAfter","abort","send","jsonp","script","head","querySelector","Date","getTime","Math","floor","random","paddingQuery","removeChild","appendQueryString","createElement","src","appendChild","validator","update","message","integer","parseInt","object","toLowerCase","kv","pair","decodeURIComponent","functionName","isUndefined","isFunction","template","values","addQueryParams","options","queryParameters","addFailHandler","fail","get","pathParameters","protocol","callbackFunction","errorResponse","prepareOptions","callbackParam","useJsonp","useHttp","use","oldL","L","version","noConflict","Util","extend","dest","len","sources","bind","fn","stamp","lastId","invokeEach","context","limitExecByInterval","time","lock","execOnUnlock","wrapperFn","falseFn","formatNum","num","digits","pow","round","str","splitWords","setOptions","getParamString","existingUrl","uppercase","toUpperCase","toString","emptyImageUrl","getPrefixed","prefixes","timeoutDefer","timeToCall","max","lastTime","requestFn","requestAnimationFrame","cancelFn","cancelAnimationFrame","requestAnimFrame","immediate","element","cancelAnimFrame","props","NewClass","initialize","_initHooks","callInitHooks","F","proto","statics","includes","parent","__super__","_initHooksCalled","include","mergeOptions","addInitHook","init","eventsKey","Mixin","Events","addEventListener","indexKey","indexLenKey","typeIndex","contextId","action","hasEventListeners","removeEventListener","clearAllEventListeners","listeners","removed","fireEvent","target","addOneTimeEventListener","handler","once","fire","ie","ielt9","ua","navigator","userAgent","webkit","chrome","phantomjs","android","android23","search","gecko","mobile","orientation","msPointer","PointerEvent","MSPointerEvent","pointer","pointerEnabled","retina","devicePixelRatio","matchMedia","matches","doc","documentElement","ie3d","style","webkit3d","WebKitCSSMatrix","gecko3d","opera3d","any3d","L_DISABLE_3D","touch","L_NO_TOUCH","DocumentTouch","Browser","opera","mobileWebkit","mobileWebkit3d","mobileOpera","Point","x","y","clone","add","point","_add","subtract","_subtract","divideBy","_divideBy","multiplyBy","_multiplyBy","_round","_floor","distanceTo","sqrt","equals","contains","abs","Bounds","points","min","getCenter","getBottomLeft","getTopRight","getSize","bounds","intersects","min2","max2","xIntersects","yIntersects","isValid","Transformation","_a","_b","_c","_d","transform","scale","_transform","untransform","DomUtil","getElementById","getStyle","el","currentStyle","defaultView","css","getComputedStyle","getViewportOffset","pos","top","left","docBody","docEl","offsetTop","offsetLeft","offsetParent","scrollTop","scrollLeft","width","maxWidth","getBoundingClientRect","clientLeft","parentNode","documentIsLtr","_docIsLtrCached","_docIsLtr","create","tagName","className","container","hasClass","classList","_getClass","RegExp","addClass","classes","_setClass","removeClass","remove","baseVal","setOpacity","opacity","filter","filterName","filters","item","Enabled","Opacity","testProp","getTranslateString","is3d","close","getScaleString","origin","preTranslateStr","scaleStr","setPosition","disable3D","_leaflet_pos","TRANSFORM","getPosition","TRANSITION","TRANSITION_END","disableTextSelection","DomEvent","preventDefault","enableTextSelection","userSelectProperty","_userSelect","disableImageDrag","enableImageDrag","LatLng","lat","lng","parseFloat","isNaN","DEG_TO_RAD","PI","RAD_TO_DEG","MAX_MARGIN","latLng","margin","precision","other","R","d2r","dLat","dLon","lat1","lat2","sin1","sin","sin2","cos","atan2","wrap","lon","LatLngBounds","southWest","northEast","latlngs","latLngBounds","_southWest","_northEast","pad","bufferRatio","sw","ne","heightBuffer","widthBuffer","getSouthWest","getNorthEast","getNorthWest","getNorth","getWest","getSouthEast","getSouth","getEast","sw2","ne2","latIntersects","lngIntersects","toBBoxString","Projection","SphericalMercator","MAX_LATITUDE","project","latlng","log","tan","unproject","atan","exp","LonLat","CRS","latLngToPoint","zoom","projectedPoint","projection","transformation","pointToLatLng","untransformedPoint","s","Simple","EPSG3857","code","earthRadius","EPSG900913","EPSG4326","Map","crs","fadeAnimation","trackResize","markerZoomAnimation","_initContainer","_initLayout","_onResize","_initEvents","maxBounds","setMaxBounds","center","setView","reset","_handlers","_layers","_zoomBoundLayers","_tileLayersNum","_addLayers","layers","getZoom","_resetView","_limitZoom","setZoom","_loaded","_zoom","zoomIn","delta","zoomOut","setZoomAround","getZoomScale","viewHalf","containerPoint","latLngToContainerPoint","centerOffset","newCenter","containerPointToLatLng","fitBounds","getBounds","paddingTL","paddingTopLeft","paddingBR","paddingBottomRight","getBoundsZoom","maxZoom","paddingOffset","swPoint","nePoint","fitWorld","panTo","pan","panBy","offset","_rawPanBy","_panInsideMaxBounds","panInsideBounds","_limitCenter","addLayer","layer","minZoom","_updateZoomLevels","zoomAnimation","TileLayer","_tileLayersToLoad","_onTileLayerLoad","_layerAdd","removeLayer","onRemove","hasLayer","eachLayer","invalidateSize","animate","oldSize","_sizeChanged","_initialCenter","newSize","oldCenter","debounceMoveend","_sizeTimer","addHandler","HandlerClass","enable","_container","_leaflet","_clearPanes","_clearControlPos","_clearHandlers","_checkIfLoaded","_moved","layerPointToLatLng","_getCenterLayerPoint","getPixelBounds","getMinZoom","_layersMinZoom","getMaxZoom","_layersMaxZoom","Infinity","inside","boundsSize","size","nw","se","zoomNotFound","_size","clientWidth","clientHeight","topLeftPoint","_getTopLeftPoint","getPixelOrigin","_initialTopLeftPoint","getPanes","_panes","getContainer","toZoom","getScaleZoom","LN2","latLngToLayerPoint","containerPointToLayerPoint","_getMapPanePos","layerPointToContainerPoint","layerPoint","mouseEventToContainerPoint","getMousePosition","mouseEventToLayerPoint","mouseEventToLatLng","position","_initPanes","_initControlPos","panes","_mapPane","mapPane","_createPane","_tilePane","tilePane","objectsPane","shadowPane","overlayPane","markerPane","popupPane","zoomHide","preserveMapOffset","afterZoomAnim","zoomChanged","_getNewTopLeftPoint","loading","hard","_getZoomSpan","oldZoomSpan","onOff","_onMouseClick","_fireMouseEvent","_resizeRequest","_simulated","dragging","moved","boxZoom","_skipped","originalEvent","disable","whenReady","onAdd","_latLngToNewLayerPoint","newZoom","topLeft","_getCenterOffset","centerPoint","viewBounds","_getBoundsOffset","_limitOffset","newBounds","pxBounds","nwOffset","seOffset","dx","_rebound","dy","right","ceil","Mercator","R_MINOR","R_MAJOR","r2","tmp","eccent","con","ts","phi","numIter","tol","dphi","EPSG3395","m","tileSize","subdomains","errorTileUrl","attribution","zoomOffset","unloadInvisibleTiles","updateWhenIdle","detectRetina","_url","_map","_animated","_zoomAnimated","viewreset","_reset","moveend","_update","zoomanim","_animateZoom","zoomend","_endZoomAnim","_limitedUpdate","addTo","bringToFront","pane","_setAutoZIndex","bringToBack","insertBefore","firstChild","getAttribution","_updateOpacity","setZIndex","zIndex","_updateZIndex","setUrl","noRedraw","redraw","compare","children","edgeZIndex","isFinite","tiles","_tiles","_bgBuffer","_tileContainer","tile","_tilesToLoad","reuseTiles","_unusedTiles","_clearBgBuffer","_getTileSize","zoomN","maxNativeZoom","tileBounds","_addTilesFromCenterOut","_removeOtherTiles","queue","_tileShouldBeLoaded","tilesToLoad","sort","fragment","createDocumentFragment","_addTile","tilePoint","continuousWorld","limit","_getWrapTileNum","noWrap","nwPoint","sePoint","kArr","_removeTile","tilePos","_getTilePos","_getTile","_loadTile","_getZoomForUrl","zoomReverse","getTileUrl","_getSubdomain","z","_adjustTilePoint","tms","pop","_resetTile","_createTile","height","galleryimg","onselectstart","onmousemove","WebkitBackfaceVisibility","_layer","_tileOnLoad","_tileOnError","_tileLoaded","_clearBgBufferTimer","newUrl","tileLayer","WMS","defaultWmsParams","service","styles","format","transparent","wmsParams","_crs","_wmsVersion","projectionKey","bbox","setParams","wms","Canvas","_redrawTile","drawTile","_tilePoint","tileDrawn","canvas","ImageOverlay","_bounds","_image","_initImage","_onImageLoad","image","imageOverlay","Icon","createIcon","oldIcon","_createIcon","createShadow","_getIconUrl","img","_createImg","_setIconStyles","anchor","shadowAnchor","iconAnchor","marginLeft","marginTop","icon","Default","iconSize","popupAnchor","shadowSize","path","imagePath","scripts","getElementsByTagName","leafletRe","Marker","title","clickable","draggable","keyboard","zIndexOffset","riseOnHover","riseOffset","_latlng","_initIcon","_removeIcon","_removeShadow","getLatLng","setLatLng","setZIndexOffset","setIcon","_popup","bindPopup","_icon","_setPos","animation","classToAdd","addIcon","tabIndex","_initInteraction","_bringToFront","_resetZIndex","newShadow","_shadow","addShadow","_zIndex","opt","_onKeyPress","Handler","MarkerDrag","wasDragged","stopPropagation","_enabled","keyCode","marker","DivIcon","div","bgPos","backgroundPosition","divIcon","closePopupOnClick","Popup","minWidth","autoPan","closeButton","autoPanPadding","keepInView","source","_source","_isOpen","animFade","_getEvents","popup","openOn","openPopup","offsetWidth","_updatePosition","_adjustPan","getContent","_content","setContent","visibility","_updateContent","_updateLayout","_zoomAnimation","closeOnClick","preclick","_close","closePopup","containerClass","_closeButton","href","disableClickPropagation","_onCloseButtonClick","wrapper","_wrapper","_contentNode","disableScrollPropagation","_tipContainer","_tip","hasChildNodes","whiteSpace","offsetHeight","maxHeight","scrolledClass","_containerWidth","animated","_containerBottom","_containerLeft","bottom","containerHeight","containerWidth","layerPos","containerPos","autoPanPaddingTopLeft","autoPanPaddingBottomRight","stop","togglePopup","_popupHandlersAdded","_movePopup","setPopupContent","unbindPopup","getPopup","LayerGroup","getLayerId","clearLayers","invoke","methodName","getLayer","getLayers","layerGroup","FeatureGroup","EVENTS","_propagateEvent","_popupContent","_popupOptions","setStyle","featureGroup","Path","CLIP_PADDING","outerWidth","outerHeight","stroke","color","dashArray","lineCap","lineJoin","weight","fill","fillColor","fillOpacity","_initElements","projectLatlngs","_updatePath","_pathRoot","vml","_stroke","_fill","_updateStyle","_updatePathViewport","panePos","_pathViewport","SVG_NS","svg","createElementNS","createSVGRect","SVG","lastChild","first","getPathString","_createElement","_initPathRoot","_initPath","_initStyle","_path","setAttribute","pointerEvents","removeAttribute","_animatePathZoom","_endPathZoom","_updateSvgViewport","_pathZooming","vp","_openPopup","_latlngs","shape","behavior","adj","VML","namespaces","coordsize","stroked","filled","endcap","dashStyle","joinstyle","display","v","getContext","L_PREFER_CANVAS","CANVAS","_requestUpdate","_onClick","_onMouseMove","_updateRequest","_fireMapMoveEnd","_ctx","_canvasCtx","lineWidth","strokeStyle","fillStyle","_drawPath","len2","drawMethod","beginPath","_parts","Polygon","closePath","_checkIfEmpty","ctx","save","globalAlpha","fillRule","restore","_containsPoint","_animatingZoom","cursor","_mouseInside","_updateCanvasViewport","translate","LineUtil","simplify","tolerance","sqTolerance","_reducePoints","_simplifyDP","pointToSegmentDistance","p1","p2","_sqClosestPointOnSegment","closestPointOnSegment","ArrayConstructor","Uint8Array","markers","_simplifyDPStep","newPoints","last","sqDist","maxSqDist","reducedPoints","prev","_sqDist","clipSegment","useLastCode","codeOut","newCode","codeA","_lastCode","_getBitCode","codeB","_getEdgeIntersection","t","dot","Polyline","_convertLatLngs","smoothFactor","noClip","_originalPoints","_getPathPartStr","getLatLngs","setLatLngs","addLatLng","spliceLatLngs","closestLayerPoint","minDistance","minPoint","jLen","distance","overwrite","_clipPoints","k","segment","lu","_simplifyPoints","polyline","PolyUtil","clipPolygon","clippedPoints","edge","edges","_code","_initWithHoles","hole","_holes","_holePoints","newParts","clipped","polygon","createMulti","Klass","_options","MultiPolyline","MultiPolygon","multiPolyline","multiPolygon","Rectangle","_boundsToLatLngs","setBounds","rectangle","Circle","radius","_mRadius","setRadius","lngRadius","_getLngRadius","pointLeft","_point","_radius","latRadius","getRadius","_getLatRadius","circle","CircleMarker","circleMarker","closed","dist","w","arc","w2","GeoJSON","geojson","addData","feature","features","geometries","geometry","coordinates","geometryToLayer","pointToLayer","coordsToLatLng","asFeature","defaultOptions","resetStyle","onEachFeature","_setLayerStyle","vectorOptions","coords","coordsToLatLngs","properties","levelsDeep","latLngToCoords","latLngsToCoords","latLngs","getFeature","newGeometry","geoJSON","PointToGeoJSON","toGeoJSON","multiToGeoJSON","jsons","isGeometryCollection","geoJson","addListener","originalHandler","newType","_getEvent","addPointerListener","addDoubleTapListener","_checkMouse","_filterClick","attachEvent","removeListener","removePointerListener","removeDoubleTapListener","detachEvent","cancelBubble","Draggable","START","_fakeStop","returnValue","clientX","clientY","rect","clientTop","getWheelDelta","wheelDelta","detail","_skipEvents","skipped","related","relatedTarget","caller","callee","Event","timeStamp","elapsed","_lastClick","_simulatedClick","END","mousedown","touchstart","pointerdown","MSPointerDown","MOVE","dragStartTarget","_element","_dragStartTarget","_onDown","shiftKey","which","button","touches","_disabled","_moving","_startPoint","_startPos","_newPos","_onMove","_onUp","newPoint","_lastTarget","srcElement","_animRequest","addHooks","removeHooks","enabled","inertia","inertiaDeceleration","inertiaMaxSpeed","inertiaThreshold","easeLinearity","worldCopyJump","Drag","_draggable","dragstart","_onDragStart","drag","_onDrag","dragend","_onDragEnd","_onPreDrag","_onViewReset","_panAnim","_positions","_times","_lastTime","_lastPos","shift","pxCenter","pxWorldCenter","_initialWorldOffset","_worldWidth","worldWidth","halfWidth","newX1","newX2","newX","delay","noInertia","direction","duration","ease","speedVector","speed","limitedSpeed","limitedSpeedVector","decelerationDuration","noMoveStart","doubleClickZoom","DoubleClickZoom","_onDoubleClick","scrollWheelZoom","ScrollWheelZoom","_onWheelScroll","_delta","_lastMousePos","_startTime","_timer","_performZoom","_touchstart","_touchend","onTouchStart","count","trackedTouches","pointerId","now","doubleTap","onTouchEnd","idx","newTouch","pre","touchend","endElement","POINTER_CANCEL","POINTER_DOWN","POINTER_MOVE","POINTER_UP","_pointers","_pointerDocumentListener","addPointerListenerStart","addPointerListenerEnd","addPointerListenerMove","pointers","pointerType","MSPOINTER_TYPE_MOUSE","alreadyInArray","changedTouches","internalCb","buttons","touchZoom","bounceAtZoomLimits","TouchZoom","_onTouchStart","_zooming","viewCenter","_startCenter","_startDist","_centerOffset","_onTouchMove","_onTouchEnd","_scale","_updateOnMove","_getScaleOrigin","oldZoom","floatZoomDelta","roundZoomDelta","tap","tapTolerance","Tap","_fireClick","_holdTimeout","_isTapValid","_simulateEvent","simulatedEvent","createEvent","initMouseEvent","screenX","screenY","dispatchEvent","BoxZoom","_pane","_onMouseDown","_startLayerPoint","_onMouseUp","_onKeyDown","_box","startPoint","box","newPos","_finish","boxZoomBounds","keyboardPanOffset","keyboardZoomOffset","Keyboard","keyCodes","down","up","_setPanOffset","_setZoomOffset","_onFocus","_onBlur","_addHooks","_removeHooks","_focused","focus","scrollTo","_panKeys","codes","_zoomKeys","_inProgress","_marker","shadow","iconPos","Control","removeControl","addControl","corner","_controlCorners","removeFrom","_refocusOnMap","control","createCorner","vSide","hSide","l","corners","_controlContainer","Zoom","zoomInText","zoomInTitle","zoomOutText","zoomOutTitle","zoomName","_zoomInButton","_createButton","_zoomIn","_zoomOutButton","_zoomOut","_updateDisabled","link","zoomControl","Attribution","_attributions","addAttribution","_onLayerAdd","_onLayerRemove","setPrefix","text","removeAttribution","attribs","prefixAndAttribs","attributionControl","Scale","metric","imperial","_addScales","_mScale","_iScale","centerLat","halfWorldMeters","maxMeters","_updateScales","_updateMetric","_updateImperial","meters","_getRoundNum","_getScaleWidth","maxMiles","miles","feet","maxFeet","ratio","pow10","Layers","collapsed","autoZIndex","baseLayers","overlays","_lastZIndex","_handlingClick","_addLayer","_onLayerChange","addBaseLayer","addOverlay","form","_form","_expand","_collapse","_layersLink","_onInputClick","_baseLayersList","_separator","_overlaysList","overlay","baseLayersPresent","overlaysPresent","_addItem","_createRadioElement","checked","radioHtml","radioFragment","input","label","defaultChecked","layerId","inputs","inputsLen","PosAnimation","run","_el","_onTransitionEnd","_stepTimer","setInterval","_onStep","_getPos","stepPos","_transformRe","clearInterval","_tryAnimatedZoom","_tryAnimatedPan","step","_onPanTransitionStep","end","_onPanTransitionEnd","_duration","_easeOutPower","_offset","_animate","_step","_complete","_animId","_runFrame","_easeOut","progress","zoomAnimationThreshold","_catchTransitionEnd","propertyName","_onZoomTransitionEnd","_nothingToAnimate","getElementsByClassName","backwards","forTouchZoom","_animateToCenter","_animateToZoom","_animating","_prepareBgBuffer","bg","initialTransform","front","bgLoaded","_getLoadedTilesPercentage","frontLoaded","_stopLoadingImages","complete","_defaultLocateOptions","watch","maximumAge","enableHighAccuracy","locate","_locateOptions","geolocation","_handleGeolocationError","onResponse","_handleGeolocationResponse","onError","_locationWatchId","watchPosition","getCurrentPosition","stopLocate","clearWatch","error","latitude","longitude","latAccuracy","accuracy","lngAccuracy","timestamp","setNodeIconAnchorStyle","node","setNodeStyleFromStyleOption","setNodeStyle","backgroundSize","textAlign","verticalAlign","lineHeight","getStyleByClassName","styleSheets","rules","cssRules","selectorText","getCachedStyleByClassName","stylesCache","extractBackgroundToPlainSVG","getPropertyValue","backgroundImage","createDiv","noPlainSVG","createImg","isFile","createNode","result","option","background","SVGIcon","contentContainer","svgIcon","getBasePath","pattern","exec","checkStringType","parameter","generalKey","setKey","setKeyForName","getKey","security","http","getValueOrDefault","defaultValue","arrayToSearchIn","valueToSearchFor","use512Tiles","tiles512Options","loadAnimation","back","handleSubdomains","mapStyles","mapLayers","TomTomLayer","accessToken","tomTomLayer","or","required","extractQueryParams","queryParams","queryParamNames","utils","trafficViewport","pathParams","baseUrl","serviceUrl","filterArray","fields","filterObject","filterPrepared","handleArray","array","pathElements","cloneProperties","clonedObject","property","getValueOrEmptyObject","addNewField","field","newFields","addFields","defaultFields","checkIsFunction","fun","converter","chain","checkRequired","fieldName","createFunction","goFunction","that","console","success","visible","isDateRfc3339","dateString","validateAgainstSetOfValues","arrayOfValues","messageIfNotFound","hasBoundingBoxFields","checkBBoxNormalized","maxLat","minLat","maxLon","minLon","checkInteger","checkIntegerInInterval","checkFloatInInterval","numValue","checkArray","roadUseValues","routingGuidanceLanguageValues","trafficIncidentsLanguageValues","number","naturalInteger","boundingBox","numberInInterval","integerInInterval","zoomLevel","numZoomLevel","functionType","countryCode","countrySet","stringValue","fuzzinessLevel","arrayType","roadUse","elements","oneOfValue","departAt","arriveAt","routingGuidanceLanguage","trafficIncidentsLanguage","routingLocations","routingLocation","geometryList","geoObject","model","handleChain","incidentsDetails","trafficModelID","defaultComparator","second","firstArray","secondArray","comparator","arrayMerge","newFeature","newFeatureCollection","featureCollection","setProperty","incidentCategories",0,1,2,3,4,5,6,7,8,9,10,11,12,13,"incidentSeverities","poi","cbl","ctr","clusterBounds","op","originalPosition","ic","incidentCategory","ty","incidentSeverity","cs","dl","cpoi","clusterCoordinates","tm","isLatLon","latlon","normalizeLatitude","numLatitude","sign","normalizeLongitude","numLongitude","isXY","xy","isLatitudeLongitude","isLatLonFunction","castPoint","isLatLonBBox","isRightLeftTopBottomBBox","isWestEastNorthSouthBBox","castBoundingBox","normalizeBoundingBox","circleFromString","castAndNormalizePoint","convertPointOrCircle","extractPointsFromPolygon","inputPoints","trafficIncidentsLanguageMapping","ca","da","de","en","es","fi","fr","hu","it","nl","no","pl","pt","sk","sv","tr","routingGuidanceLanguageMapping","ar","af-ZA","bg-BG","zh-TW","cs-CZ","da-DK","nl-NL","en-GB","en-US","fi-FI","fr-FR","de-DE","el-GR","hu-HU","id-ID","it-IT","ko-KR","lt-LT","ms-MY","nb-NO","pl-PL","pt-BR","pt-PT","ru-RU","sk-SK","sl-SI","es-ES","es-MX","sv-SE","th-TH","tr-TR","dateTime","toISOString","figureName","figure","vertices","language","arrayOfStrings","splitOnEdgeOfTheWorld","bBox","responseCollector","numBoundingBoxes","responses","addBoundingBoxParameters","boundingBoxes","trafficIncidents","converters","worldEdge","expandCluster","scrub","Option","get_value","vars","render","blockregex","_","__","meta","inner","if_true","has_else","if_false","temp","_key","_val","valregex","withLeadingZero","imperialDistance","distanceMeters","yards","metricDistance","formatTime","seconds","secondsFormatted","minutesFormatted","secondsNum","hours","minutes","formatHourAndMinute","dateInMs","date","hour","getHours","minute","getMinutes","formatDistance","T","units","trafficIncidentMessage","info","lengthMeters","delaySeconds","iconsMapping","messageTemplate","clusterClickHandler","Unknown","Accident","Fog","Dangerous Conditions","Rain","Ice","Jam","Lane Closed","Road Closed","Road Works","Wind","Flooding","Detour","Cluster","iconTemplate","shieldTemplate","descriptionTemplate","iconOptions","font-weight","font-size","clusterSize","trafficModelId","defaultPointToLayer","getTrafficStyle","trafficLayer","trafficStyles","TomTomTrafficIncidentsLayer","incidentsService","positions","setTrafficModelId","tomTomTrafficIncidentsLayer","TomTomTrafficLayer","tomTomTrafficLayer","refreshTrafficModelId","trafficModelIdService","raster","incidents","noRefresh","getTrafficFlowStyle","trafficFlowLayer","trafficFlowStyles","TomTomFlowLayer","refresh","tomTomFlowLayer","TomTomLabelsLayer","labelsOptions","childElementCount","tomTomLabelsLayer","copyrights","caption","copyright","regions","country","ISO3","MessageBox","closeable","closeAfter","messageBox","tomtomAttribution","isOlderThanIE11","initBaseLayer","baseMap","initTrafficLayer","traffic","initTrafficFlowLayer","trafficFlow","initLabelsLayers","labelsLayer","noLabelsOnTop","initHook","copyrightCaption","geocode","query","btmRight","callbackBestResult","bestResult","storeResult","typeahead","structuredGeocode","checkBestResult","streetNumber","streetName","crossStreet","municipality","municipalitySubdivision","countryTertiarySubdivision","countrySecondarySubdivision","countrySubdivision","postalCode","reverseGeocode","ReverseGeocodeBase","reverseGeocodeConstructor","construct","TYPES","crossStreetLookup","spatialKeys","heading","TYPE","mergedFields","reverseGeocodeBase","ReverseGeocode","reverseGeocodeBasePrototype","returnSpeedLimit","returnRoadUse","CrossStreetLookup","queryParamsNames","Search","searchConstructor","category","nearby","lowBandwidth","FuzzySearch","searchPrototype","maxFuzzyLevel","idxSet","PoiSearch","CategorySearch","GeometrySearch","NearbySearch","LowBandwidthSearch","isEmpty","getMultipleParamQueryString","firstParam","calculateRoute","queryStringAvoid","queryStringVehicleLoadType","locations","avoid","vehicleLoadType","summary","isMultiLineString","segmentSummary","getCoordinates","getRouteFeature","route","legs","guidance","routes","routing","LANGUAGE","Afrikaans_South_Africa","Arabic","Bulgarian","Chinese_Taiwan","Czech","Danish","Dutch","English_GB","English_US","Finnish","French","German","Greek","Hungarian","Indonesian","Italian","Korean","Lithuanian","Malay","Norwegian","Polish","Portuguese_Brazil","Portuguese_Portugal","Russian","Slovak","Slovenian","Spanish","Spanish_Mexico","Swedish","Thai","Turkish","maxAlternatives","routeType","instructionsType","computeBestOrder","routeRepresentation","travelMode","hilliness","windingness","report","computeTravelTimeFor","vehicleEngineType","vehicleMaxSpeed","vehicleWeight","vehicleAxleWeight","vehicleLength","Number","MAX_VALUE","vehicleWidth","vehicleHeight","vehicleCommercial","vehicleHeading","serviceFunction","getClassName","imageSrc","setSizeStyle","LocationFound","LocationError","Location","createContainer","location","searchService","reverseGeocodeService","searchBoxEvent","locationError","clearResultsContainer","createResult","locationSuccess","serviceOptions","resolveResultText","ResultClicked","locationIcon","createCurrentLocationButton","inputContainer","createDOMElements","clearButton","resultsContainer","setHandlers","placeholder","clearSearchBox","ClearButtonClicked","onKeyDown","onInputChange","onMapEndDrag","collapsible","expand","collapse","resultData","highlightWords","ResultCreated","onResultSelect","stopSearch","enteredText","words","regex","highlighted","handleResults","ResultsFound","_searchResponses","ResultsDrawn","blur","address","freeformAddress","performPromptSearch","currentCallTime","lastCallTime","inputWaiting","lastSearchText","getOptionsForSearch","ignorePrompt","throttleTimePrompt","throttle","performSearch","timerId","SearchInputChanged","idleTimeKeyPress","withPrompt","minNumberCharsPrompt","selectedResult","ENTER","selectedResultIndex","ARROWUP","ARROWDOWN","highlightNextResult","selectedElement","resultsContainerElement","newlySelectedElement","highlightClass",38,"edgeCase","nextSibling","nextAfterEdgeCase",40,"viewportBoundingBox","disablePOIs","ResultsCleared","SearchBox","setResultData","searchBox","readOnly","getLocation","addLocationIcon","removeLocationIcon","getLocationsFromSearchBoxes","searchBoxes","selectedLocation","updateSearchBoxIcons","getIconClassName","updateLocationButton","locationIconIndex","LOCATION","Start","showDeleteSearchBoxButton","deleteIcon","removeInput","hideDeleteSearchBoxButton","setVisibilityForDeleteButton","updateDeleteSearchBoxButtons","enableSearchBoxesModifcation","showInsertSearchBoxButton","insertSearchBoxButton","addInput","hideInsertSearchBoxButton","updateInsertSearchBoxButton","LocationsFound","LocationsCleared","End","WAYPOINT_PLACEMENT","Last","BeforeLast","RouteInputs","waypointPlacement","searchOptions","searchBoxesContainer","createSearchBox","lastSearchBoxIndex","needsLocationIcon","searchBoxInstance","childNodes","addSearchBoxEventHandlers","removeSearchBox","searchBoxIndex","eventObject","onLocationChange","showLocationNotFoundMessageBox","nodeList","routeInputConstructor","WaypointPlacement","unitFormatConverter","CSS_CLASS_NAME","clearDOMElements","updateDOMElements","showInstructionGroups","createInstructionsWithGroups","guidanceData","createInstructions","instructions","allInstructionsPoints","instructionIndex","groupIndex","instructionGroups","instructionGroup","groupElementDiv","groupedInstructionsDiv","groupMessageWithIconDiv","collapseIconDiv","createCollapseIconDiv","instructionGroupsCollapsed","groupMessageDiv","createGroupMessageDiv","separatorCssClassName","createSeparatorDiv","groupLengthInMeters","isImperialDistance","instructionListForGroup","firstInstructionIndex","lastInstructionIndex","groupedInstructionPoints","registerHandlersForGroup","groupMessage","divForInstructions","instructionList","instructionNextToGroup","nextInstructionOffset","instructionPoints","currentInstruction","nextInstruction","instructionElementDiv","createInstructionElement","routeOffsetInMeters","registerHandlersForInstruction","isInstructionGroupsCollapsed","collapseIconClass","instruction","messageWithIconDiv","iconsMap","getIconPathKey","messageDiv","divToSeparate","instructionDistance","separatorCssClass","isInstructionGroup","separatorDistanceDiv","autoLengthSeparatorDiv","instructionSeparatorDiv","distanceDiv","InstructionGroupHoverOn","createEventObject","InstructionGroupHoverOff","separator","toggleCssClasses","InstructionGroupClickedExpand","InstructionGroupClickedCollapse","htmlElement","cssClassesArray","instructionMessage","instructionElement","InstructionHoverOn","InstructionHoverOff","selectedInstructionClass","InstructionClickedDeselect","deselectInstruction","InstructionClickedSelect","selectedInstruction","iconKey","maneuver","turnAngleInDecimalDegrees","drivingSide","MANOUVERS_WITH_LEFT_DRIVING_SIDE_VERSIONS","ARRIVE","ARRIVE_LEFT","ARRIVE_RIGHT","DEPART","STRAIGHT","KEEP_RIGHT","BEAR_RIGHT","TURN_RIGHT","SHARP_RIGHT","KEEP_LEFT","BEAR_LEFT","TURN_LEFT","SHARP_LEFT","MAKE_UTURN","MAKE_UTURN_LEFT_DRIVING_SIDE","ENTER_MOTORWAY","ENTER_FREEWAY","ENTER_HIGHWAY","TAKE_EXIT","MOTORWAY_EXIT_LEFT","MOTORWAY_EXIT_RIGHT","TAKE_FERRY","ROUNDABOUT_CROSS","ROUNDABOUT_CROSS_45","ROUNDABOUT_RIGHT_135","ROUNDABOUT_CROSS_MINUS_45","ROUNDABOUT_LEFT_MINUS_135","ROUNDABOUT_RIGHT","ROUNDABOUT_LEFT","ROUNDABOUT_BACK","TRY_MAKE_UTURN","TRY_MAKE_UTURN_LEFT_DRIVING_SIDE","ROUNDABOUT_CROSS_LEFT_DRIVING_SIDE","ROUNDABOUT_CROSS_45_LEFT_DRIVING_SIDE","ROUNDABOUT_RIGHT_135_LEFT_DRIVING_SIDE","ROUNDABOUT_CROSS_MINUS_45_LEFT_DRIVING_SIDE","ROUNDABOUT_LEFT_MINUS_135_LEFT_DRIVING_SIDE","ROUNDABOUT_RIGHT_LEFT_DRIVING_SIDE","ROUNDABOUT_LEFT_LEFT_DRIVING_SIDE","ROUNDABOUT_BACK_LEFT_DRIVING_SIDE","FOLLOW","WAYPOINT_LEFT","WAYPOINT_RIGHT","WAYPOINT_REACHED","RouteInstructions","show","hide","updateGuidanceData","hideInstructionGroups","MarkerClusterGroup","maxClusterRadius","iconCreateFunction","spiderfyOnMaxZoom","showCoverageOnHover","zoomToBoundsOnClick","singleMarkerMode","disableClusteringAtZoom","removeOutsideVisibleBounds","animateAddingMarkers","spiderfyDistanceMultiplier","spiderLegPolylineOptions","chunkedLoading","chunkInterval","chunkDelay","chunkProgress","polygonOptions","_defaultIconCreateFunction","_featureGroup","_nonPointGroup","_inZoomAnimation","_needsClustering","_needsRemoving","_currentShownBounds","_queue","_withAnimation","_noAnimation","_markerCluster","MarkerCluster","MarkerClusterNonAnimated","addLayers","_unspiderfy","_maxZoom","_topClusterLevel","_recalculateBounds","visibleLayer","currentZoom","__parent","_animationAddLayer","_animationAddLayerNonAnimated","removeLayers","_unspiderfyLayer","_removeLayer","clusterShow","_arraySplice","layersArray","newMarkers","fg","npg","chunked","started","process","start","getChildCount","getAllChildMarkers","otherMarker","_iconNeedsUpdate","_updateIcon","_recursivelyAddChildrenToMap","_gridClusters","_gridUnclustered","_noanimationUnspiderfy","_generateInitialClusters","anArray","_group","zoomToShowLayer","showMarker","spiderfy","moveStart","zoomToBounds","_maxLat","_getExpandedVisibleBounds","_zoomEnd","_moveEnd","_spiderfierOnAdd","_bindEvents","_unbindEvents","_spiderfierOnRemove","_hideCoverage","getVisibleParent","vMarker","_removeFromGridUnclustered","gridUnclustered","removeObject","removeFromDistanceGrid","dontUpdateMap","gridClusters","cluster","_markers","_childCount","_boundsNeedUpdate","_cLatLng","addObject","_childClusters","_isOrIsParent","oel","childCount","_zoomOrSpiderfy","_showCoverage","bottomCluster","_shownPolygon","_spiderfied","getConvexHull","_mergeSplitClusters","_recursivelyRemoveChildrenFromMap","radiusFn","DistanceGrid","markerPoint","_overrideMarkerIcon","closest","getNearObject","_addChild","newCluster","lastParent","_enqueue","_queueTimeout","_processQueue","_animationStart","_animationZoomIn","_animationZoomOut","_checkBoundsMaxLat","_mapBoundsInfinite","_addToMap","previousZoomLevel","newZoomLevel","_recursively","startPos","_isSingleParent","clusterHide","_forceLayout","_recursivelyBecomeVisible","_recursivelyRestoreChildPositions","_animationEnd","_animationZoomOutSingle","me","_recursivelyAnimateChildrenInAndAddSelfToMap","markerClusterGroup","group","storageArray","childClusters","boundsZoom","mapZoom","newClusters","_iconObj","new1","isNotificationFromChild","_setClusterCenter","child","_resetBounds","childLatLng","latSum","lngSum","totalCount","_wLatLng","_backupLatlng","_recursivelyAnimateChildrenIn","cm","nm","_restorePosition","previousBounds","exceptBounds","boundsToApplyTo","zoomLevelToStart","zoomLevelToStop","runAtEveryLevel","runAtBottomLevel","opacityWhenUnclustered","cellSize","_cellSize","_sqCellSize","_grid","_objectPoint","_getCoord","grid","row","cell","updateObject","eachObject","objectPoint","closestDistSq","QuickHull","getDistant","cpt","bl","vY","vX","findMostDistantPointFromBaseLine","baseLine","maxD","maxPt","maxPoint","buildConvexHull","convexHullBaseLines","maxLng","minLng","maxLatPt","minLatPt","maxLngPt","minLngPt","minPt","ch","childMarkers","_2PI","_circleFootSeparation","_circleStartAngle","_spiralFootSeparation","_spiralLengthStart","_spiralLengthFactor","_circleSpiralSwitchover","_generatePointsSpiral","_generatePointsCircle","_animationSpiderfy","unspiderfy","zoomDetails","_animationUnspiderfy","centerPt","angle","circumference","legLength","angleStep","separation","lengthFactor","_preSpiderfyLatlng","_spiderLeg","leg","legOptions","legPath","thisLayerLatLng","thisLayerPos","finalLegOpacity","getTotalLength","strokeDasharray","strokeDashoffset","nonAnimatable","stillThereChildCount","_unspiderfyWrapper","_unspiderfyZoomStart","_unspiderfyZoomAnim","refreshClusters","_flagParentsIconsNeedUpdate","_refreshClustersIcons","_refreshSingleMarkerModeMarkers","refreshIconOptions","directlyRefreshClusters","hasDataArray","convertPoints","getFreeFormAddress","getTextContent","textContent","oneOf","third","getPoiName","getText","poiName","hadDataPosition","getObjectType","getPoiCategories","categories","getPointGeometry","poiCategories","convertPoint","isEachIconAFunction","eachIcon","createMarker","MarkersLayer","routingService","createMarkerIcon","generalMarkerIcon","getRouteStyle","styleIndex","getIconOptions","generalMarker","startMarker","endMarker","waypointMarker","onDragListener","getAllFilledLocations","filledLocations","MarkerDragEnd","Draw","RouteChanged","RouteOnMap","routeStyle","alternativeStyles","routingDelay","createMarkers","onDragEnd","onDrag","createRoute","routeGeoJson","drawRouteWithGeoJson","clearRoute","recalculateRoute","fitMapBoundsToRoute","markerIndex","clearMarkers","routeOnMapLayer","areaToBoundTo","drawRoute","clear","draw","initPanelDeparture","initPanelResult","divPanelRouteResult","divPanelRouteDeparture","divPanelRouteResultWrapper","divPanelRouteCostModel","divPanelRouteTime","divPanelRouteTrafficDelay","createPanelArriveDistance","divPanelRouteArriveDistance","divPanelRouteArriveDistanceLabel","divPanelRouteArriveDistanceValue","createPanelArriveTime","divPanelRouteArriveTime","divPanelRouteArriveTimeLabel","divPanelRouteArriveTimeValue","initPanelArrive","divPanelRouteArrive","divHeading","RouteSummary","updateSummaryData","travelTimeInSeconds","trafficDelayInSeconds","lengthInMeters","arrivalTime","requester","fuzzySearch","poiSearch","categorySearch","geometrySearch","nearbySearch","lowBandwidthSearch","routeInputs","routeInstructions","markersView","routeOnMap","routeSummary","mapsKey","trafficKey","trafficFlowKey","searchKey","routingKey","paths","es6-promise-polyfill","leaflet","markercluster","shim","display/map","*","packages"],"mappings":"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AAAF,cAAA,mBAaA9qD,EAAAquF,WAAArjC,EAAAF,cAAA,oBACA9qD,IAGAG,EAAAyB,QC7RA4qD,QAAA,KACA8hC,OACAtkF,IAAA,kBACAukF,uBAAA,mCACAC,QAAA,+BACAC,cAAA,mDACAvuF,UAAA,wBACA4qC,EAAA,cAEA4jD,MACAC,eACA/pF,QAAA,KAEA6pF,eACAxpF,MACA,iBAIAtD,KACAitF,KACA3jC,KAAA,sBACAD,SAAA,4BAGA6jC,cAKA/uF,EAAA,SAAA,cAEAK,EAAA;A1ExBA;AACA;AACA;AACA;ACZA,ADaA;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClCA,ADmCA;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACv2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtBA,ADuBA;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvBA,ADwBA;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/8RA,ADg9RA;AC/8RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5MA,AD6MA;AC5MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3EA,AD4EA;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxBA,ADyBA;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrBA,ADsBA;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpDA,ADqDA;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3fA,AD4fA;AC3fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3IA,AD4IA;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzCA,AD0CA;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1CA,AD2CA;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvRA,ADwRA;ACvRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvGA,ADwGA;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9SA,AD+SA;AC9SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/GA,ADgHA;AC/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChGA,ADiGA;AChGA;AACA;AACA;AACA;AACA;AACA;AACA,ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtJA,ADuJA;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpNA,ADqNA;ACpNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxGA,ADyGA;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9BA,AD+BA;AC9BA;AACA;AACA;AACA;AACA;AACA,ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzUA,AD0UA;ACzUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzTA,AD0TA;ACzTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvCA,ADwCA;ACvCA;AACA;AACA;AACA;AACA;AACA,ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrDA,ADsDA;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9SA,AD+SA;AC9SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtPA,ADuPA;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpCA,ADqCA;ACpCA;AACA;AACA;AACA;AACA;AACA,ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3EA,AD4EA;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrSA,ADsSA;ACrSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9RA,AD+RA;AC9RA;AACA;AACA;AACA;AACA;AACA,ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/TA,ADgUA;AC/TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvDA,ADwDA;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtoBA,ADuoBA;ACtoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AClcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3jBA,AD4jBA;AC3jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC37EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AClcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnKA,ADoKA;ACnKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7RA,AD8RA;AC7RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjCA;AACA;AACA","file":"tomtom.min.js","sourcesContent":["(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n //Allow using this built library as an AMD module\n //in another project. That other project will only\n //see this AMD call, not the internal modules in\n //the closure below.\n define([], factory);\n } else {\n //Browser globals case. Just assign the\n //result to a property on the global.\n root.tomtom = factory();\n }\n}(this, function () {\n","/**\n * @license almond 0.3.2 Copyright jQuery Foundation and other contributors.\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n/*global setTimeout: false */\n\nvar requirejs, require, define;\n(function (undef) {\n var main, req, makeMap, handlers,\n defined = {},\n waiting = {},\n config = {},\n defining = {},\n hasOwn = Object.prototype.hasOwnProperty,\n aps = [].slice,\n jsSuffixRegExp = /\\.js$/;\n\n function hasProp(obj, prop) {\n return hasOwn.call(obj, prop);\n }\n\n /**\n * Given a relative module name, like ./something, normalize it to\n * a real name that can be mapped to a path.\n * @param {String} name the relative name\n * @param {String} baseName a real name that the name arg is relative\n * to.\n * @returns {String} normalized name\n */\n function normalize(name, baseName) {\n var nameParts, nameSegment, mapValue, foundMap, lastIndex,\n foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\n baseParts = baseName && baseName.split(\"/\"),\n map = config.map,\n starMap = (map && map['*']) || {};\n\n //Adjust any relative paths.\n if (name) {\n name = name.split('/');\n lastIndex = name.length - 1;\n\n // If wanting node ID compatibility, strip .js from end\n // of IDs. Have to do this here, and not in nameToUrl\n // because node allows either .js or non .js to map\n // to same file.\n if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n }\n\n // Starts with a '.' so need the baseName\n if (name[0].charAt(0) === '.' && baseParts) {\n //Convert baseName to array, and lop off the last part,\n //so that . matches that 'directory' and not name of the baseName's\n //module. For instance, baseName of 'one/two/three', maps to\n //'one/two/three.js', but we want the directory, 'one/two' for\n //this normalization.\n normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n name = normalizedBaseParts.concat(name);\n }\n\n //start trimDots\n for (i = 0; i < name.length; i++) {\n part = name[i];\n if (part === '.') {\n name.splice(i, 1);\n i -= 1;\n } else if (part === '..') {\n // If at the start, or previous value is still ..,\n // keep them so that when converted to a path it may\n // still work when converted to a path, even though\n // as an ID it is less than ideal. In larger point\n // releases, may be better to just kick out an error.\n if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\n continue;\n } else if (i > 0) {\n name.splice(i - 1, 2);\n i -= 2;\n }\n }\n }\n //end trimDots\n\n name = name.join('/');\n }\n\n //Apply map config if available.\n if ((baseParts || starMap) && map) {\n nameParts = name.split('/');\n\n for (i = nameParts.length; i > 0; i -= 1) {\n nameSegment = nameParts.slice(0, i).join(\"/\");\n\n if (baseParts) {\n //Find the longest baseName segment match in the config.\n //So, do joins on the biggest to smallest lengths of baseParts.\n for (j = baseParts.length; j > 0; j -= 1) {\n mapValue = map[baseParts.slice(0, j).join('/')];\n\n //baseName segment has config, find if it has one for\n //this name.\n if (mapValue) {\n mapValue = mapValue[nameSegment];\n if (mapValue) {\n //Match, update name to the new value.\n foundMap = mapValue;\n foundI = i;\n break;\n }\n }\n }\n }\n\n if (foundMap) {\n break;\n }\n\n //Check for a star map match, but just hold on to it,\n //if there is a shorter segment match later in a matching\n //config, then favor over this star map.\n if (!foundStarMap && starMap && starMap[nameSegment]) {\n foundStarMap = starMap[nameSegment];\n starI = i;\n }\n }\n\n if (!foundMap && foundStarMap) {\n foundMap = foundStarMap;\n foundI = starI;\n }\n\n if (foundMap) {\n nameParts.splice(0, foundI, foundMap);\n name = nameParts.join('/');\n }\n }\n\n return name;\n }\n\n function makeRequire(relName, forceSync) {\n return function () {\n //A version of a require function that passes a moduleName\n //value for items that may need to\n //look up paths relative to the moduleName\n var args = aps.call(arguments, 0);\n\n //If first arg is not require('string'), and there is only\n //one arg, it is the array form without a callback. Insert\n //a null so that the following concat is correct.\n if (typeof args[0] !== 'string' && args.length === 1) {\n args.push(null);\n }\n return req.apply(undef, args.concat([relName, forceSync]));\n };\n }\n\n function makeNormalize(relName) {\n return function (name) {\n return normalize(name, relName);\n };\n }\n\n function makeLoad(depName) {\n return function (value) {\n defined[depName] = value;\n };\n }\n\n function callDep(name) {\n if (hasProp(waiting, name)) {\n var args = waiting[name];\n delete waiting[name];\n defining[name] = true;\n main.apply(undef, args);\n }\n\n if (!hasProp(defined, name) && !hasProp(defining, name)) {\n throw new Error('No ' + name);\n }\n return defined[name];\n }\n\n //Turns a plugin!resource to [plugin, resource]\n //with the plugin being undefined if the name\n //did not have a plugin prefix.\n function splitPrefix(name) {\n var prefix,\n index = name ? name.indexOf('!') : -1;\n if (index > -1) {\n prefix = name.substring(0, index);\n name = name.substring(index + 1, name.length);\n }\n return [prefix, name];\n }\n\n /**\n * Makes a name map, normalizing the name, and using a plugin\n * for normalization if necessary. Grabs a ref to plugin\n * too, as an optimization.\n */\n makeMap = function (name, relName) {\n var plugin,\n parts = splitPrefix(name),\n prefix = parts[0];\n\n name = parts[1];\n\n if (prefix) {\n prefix = normalize(prefix, relName);\n plugin = callDep(prefix);\n }\n\n //Normalize according\n if (prefix) {\n if (plugin && plugin.normalize) {\n name = plugin.normalize(name, makeNormalize(relName));\n } else {\n name = normalize(name, relName);\n }\n } else {\n name = normalize(name, relName);\n parts = splitPrefix(name);\n prefix = parts[0];\n name = parts[1];\n if (prefix) {\n plugin = callDep(prefix);\n }\n }\n\n //Using ridiculous property names for space reasons\n return {\n f: prefix ? prefix + '!' + name : name, //fullName\n n: name,\n pr: prefix,\n p: plugin\n };\n };\n\n function makeConfig(name) {\n return function () {\n return (config && config.config && config.config[name]) || {};\n };\n }\n\n handlers = {\n require: function (name) {\n return makeRequire(name);\n },\n exports: function (name) {\n var e = defined[name];\n if (typeof e !== 'undefined') {\n return e;\n } else {\n return (defined[name] = {});\n }\n },\n module: function (name) {\n return {\n id: name,\n uri: '',\n exports: defined[name],\n config: makeConfig(name)\n };\n }\n };\n\n main = function (name, deps, callback, relName) {\n var cjsModule, depName, ret, map, i,\n args = [],\n callbackType = typeof callback,\n usingExports;\n\n //Use name if no relName\n relName = relName || name;\n\n //Call the callback to define the module, if necessary.\n if (callbackType === 'undefined' || callbackType === 'function') {\n //Pull out the defined dependencies and pass the ordered\n //values to the callback.\n //Default to [require, exports, module] if no deps\n deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n for (i = 0; i < deps.length; i += 1) {\n map = makeMap(deps[i], relName);\n depName = map.f;\n\n //Fast path CommonJS standard dependencies.\n if (depName === \"require\") {\n args[i] = handlers.require(name);\n } else if (depName === \"exports\") {\n //CommonJS module spec 1.1\n args[i] = handlers.exports(name);\n usingExports = true;\n } else if (depName === \"module\") {\n //CommonJS module spec 1.1\n cjsModule = args[i] = handlers.module(name);\n } else if (hasProp(defined, depName) ||\n hasProp(waiting, depName) ||\n hasProp(defining, depName)) {\n args[i] = callDep(depName);\n } else if (map.p) {\n map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n args[i] = defined[depName];\n } else {\n throw new Error(name + ' missing ' + depName);\n }\n }\n\n ret = callback ? callback.apply(defined[name], args) : undefined;\n\n if (name) {\n //If setting exports via \"module\" is in play,\n //favor that over return value and exports. After that,\n //favor a non-undefined return value over exports use.\n if (cjsModule && cjsModule.exports !== undef &&\n cjsModule.exports !== defined[name]) {\n defined[name] = cjsModule.exports;\n } else if (ret !== undef || !usingExports) {\n //Use the return value from the function.\n defined[name] = ret;\n }\n }\n } else if (name) {\n //May just be an object definition for the module. Only\n //worry about defining if have a module name.\n defined[name] = callback;\n }\n };\n\n requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n if (typeof deps === \"string\") {\n if (handlers[deps]) {\n //callback in this case is really relName\n return handlers[deps](callback);\n }\n //Just return the module wanted. In this scenario, the\n //deps arg is the module name, and second arg (if passed)\n //is just the relName.\n //Normalize module name, if it contains . or ..\n return callDep(makeMap(deps, callback).f);\n } else if (!deps.splice) {\n //deps is a config object, not an array.\n config = deps;\n if (config.deps) {\n req(config.deps, config.callback);\n }\n if (!callback) {\n return;\n }\n\n if (callback.splice) {\n //callback is an array, which means it is a dependency list.\n //Adjust args if there are dependencies\n deps = callback;\n callback = relName;\n relName = null;\n } else {\n deps = undef;\n }\n }\n\n //Support require(['a'])\n callback = callback || function () {};\n\n //If relName is a function, it is an errback handler,\n //so remove it.\n if (typeof relName === 'function') {\n relName = forceSync;\n forceSync = alt;\n }\n\n //Simulate async callback;\n if (forceSync) {\n main(undef, deps, callback, relName);\n } else {\n //Using a non-zero value because of concern for what old browsers\n //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n //If want a value immediately, use require('id') instead -- something\n //that works in almond on the global level, but not guaranteed and\n //unlikely to work in other AMD implementations.\n setTimeout(function () {\n main(undef, deps, callback, relName);\n }, 4);\n }\n\n return req;\n };\n\n /**\n * Just drops the config on the floor, but returns req in case\n * the config return value is used.\n */\n req.config = function (cfg) {\n return req(cfg);\n };\n\n /**\n * Expose module registry for debugging and tooling\n */\n requirejs._defined = defined;\n\n define = function (name, deps, callback) {\n if (typeof name !== 'string') {\n throw new Error('See almond README: incorrect module build, no module name');\n }\n\n //This module may not have dependencies\n if (!deps.splice) {\n //deps is not an array, so probably means\n //an object literal or factory function for\n //the value. Adjust args.\n callback = deps;\n deps = [];\n }\n\n if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n waiting[name] = [name, deps, callback];\n }\n };\n\n define.amd = {\n jQuery: true\n };\n}());\n\ndefine(\"lib/almond/almond.js\", function(){});\n\n","(function(global){\n\n//\n// Check for native Promise and it has correct interface\n//\n\nvar NativePromise = global['Promise'];\nvar nativePromiseSupported =\n NativePromise &&\n // Some of these methods are missing from\n // Firefox/Chrome experimental implementations\n 'resolve' in NativePromise &&\n 'reject' in NativePromise &&\n 'all' in NativePromise &&\n 'race' in NativePromise &&\n // Older version of the spec had a resolver object\n // as the arg rather than a function\n (function(){\n var resolve;\n new NativePromise(function(r){ resolve = r; });\n return typeof resolve === 'function';\n })();\n\n\n//\n// export if necessary\n//\n\nif (typeof exports !== 'undefined' && exports)\n{\n // node.js\n exports.Promise = nativePromiseSupported ? NativePromise : Promise;\n}\nelse\n{\n // AMD\n if (typeof define == 'function' && define.amd)\n {\n define('es6-promise-polyfill',[],function(){\n return nativePromiseSupported ? NativePromise : Promise;\n });\n }\n else\n {\n // in browser add to global\n if (!nativePromiseSupported)\n global['Promise'] = Promise;\n }\n}\n\n\n//\n// Polyfill\n//\n\nvar PENDING = 'pending';\nvar SEALED = 'sealed';\nvar FULFILLED = 'fulfilled';\nvar REJECTED = 'rejected';\nvar NOOP = function(){};\n\n// async calls\nvar asyncSetTimer = typeof setImmediate !== 'undefined' ? setImmediate : setTimeout;\nvar asyncQueue = [];\nvar asyncTimer;\n\nfunction asyncFlush(){\n // run promise callbacks\n for (var i = 0; i < asyncQueue.length; i++)\n asyncQueue[i][0](asyncQueue[i][1]);\n\n // reset async asyncQueue\n asyncQueue = [];\n asyncTimer = false;\n}\n\nfunction asyncCall(callback, arg){\n asyncQueue.push([callback, arg]);\n\n if (!asyncTimer)\n {\n asyncTimer = true;\n asyncSetTimer(asyncFlush, 0);\n }\n}\n\n\nfunction invokeResolver(resolver, promise) {\n function resolvePromise(value) {\n resolve(promise, value);\n }\n\n function rejectPromise(reason) {\n reject(promise, reason);\n }\n\n try {\n resolver(resolvePromise, rejectPromise);\n } catch(e) {\n rejectPromise(e);\n }\n}\n\nfunction invokeCallback(subscriber){\n var owner = subscriber.owner;\n var settled = owner.state_;\n var value = owner.data_; \n var callback = subscriber[settled];\n var promise = subscriber.then;\n\n if (typeof callback === 'function')\n {\n settled = FULFILLED;\n try {\n value = callback(value);\n } catch(e) {\n reject(promise, e);\n }\n }\n\n if (!handleThenable(promise, value))\n {\n if (settled === FULFILLED)\n resolve(promise, value);\n\n if (settled === REJECTED)\n reject(promise, value);\n }\n}\n\nfunction handleThenable(promise, value) {\n var resolved;\n\n try {\n if (promise === value)\n throw new TypeError('A promises callback cannot return that same promise.');\n\n if (value && (typeof value === 'function' || typeof value === 'object'))\n {\n var then = value.then; // then should be retrived only once\n\n if (typeof then === 'function')\n {\n then.call(value, function(val){\n if (!resolved)\n {\n resolved = true;\n\n if (value !== val)\n resolve(promise, val);\n else\n fulfill(promise, val);\n }\n }, function(reason){\n if (!resolved)\n {\n resolved = true;\n\n reject(promise, reason);\n }\n });\n\n return true;\n }\n }\n } catch (e) {\n if (!resolved)\n reject(promise, e);\n\n return true;\n }\n\n return false;\n}\n\nfunction resolve(promise, value){\n if (promise === value || !handleThenable(promise, value))\n fulfill(promise, value);\n}\n\nfunction fulfill(promise, value){\n if (promise.state_ === PENDING)\n {\n promise.state_ = SEALED;\n promise.data_ = value;\n\n asyncCall(publishFulfillment, promise);\n }\n}\n\nfunction reject(promise, reason){\n if (promise.state_ === PENDING)\n {\n promise.state_ = SEALED;\n promise.data_ = reason;\n\n asyncCall(publishRejection, promise);\n }\n}\n\nfunction publish(promise) {\n promise.then_ = promise.then_.forEach(invokeCallback);\n}\n\nfunction publishFulfillment(promise){\n promise.state_ = FULFILLED;\n publish(promise);\n}\n\nfunction publishRejection(promise){\n promise.state_ = REJECTED;\n publish(promise);\n}\n\n/**\n* @class\n*/\nfunction Promise(resolver){\n if (typeof resolver !== 'function')\n throw new TypeError('Promise constructor takes a function argument');\n\n if (this instanceof Promise === false)\n throw new TypeError('Failed to construct \\'Promise\\': Please use the \\'new\\' operator, this object constructor cannot be called as a function.');\n\n this.then_ = [];\n\n invokeResolver(resolver, this);\n}\n\nPromise.prototype = {\n constructor: Promise,\n\n state_: PENDING,\n then_: null,\n data_: undefined,\n\n then: function(onFulfillment, onRejection){\n var subscriber = {\n owner: this,\n then: new this.constructor(NOOP),\n fulfilled: onFulfillment,\n rejected: onRejection\n };\n\n if (this.state_ === FULFILLED || this.state_ === REJECTED)\n {\n // already resolved, call callback async\n asyncCall(invokeCallback, subscriber);\n }\n else\n {\n // subscribe\n this.then_.push(subscriber);\n }\n\n return subscriber.then;\n },\n\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n};\n\nPromise.all = function(promises){\n var Class = this;\n\n if (!Array.isArray(promises))\n throw new TypeError('You must pass an array to Promise.all().');\n\n return new Class(function(resolve, reject){\n var results = [];\n var remaining = 0;\n\n function resolver(index){\n remaining++;\n return function(value){\n results[index] = value;\n if (!--remaining)\n resolve(results);\n };\n }\n\n for (var i = 0, promise; i < promises.length; i++)\n {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function')\n promise.then(resolver(i), reject);\n else\n results[i] = promise;\n }\n\n if (!remaining)\n resolve(results);\n });\n};\n\nPromise.race = function(promises){\n var Class = this;\n\n if (!Array.isArray(promises))\n throw new TypeError('You must pass an array to Promise.race().');\n\n return new Class(function(resolve, reject) {\n for (var i = 0, promise; i < promises.length; i++)\n {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function')\n promise.then(resolve, reject);\n else\n resolve(promise);\n }\n });\n};\n\nPromise.resolve = function(value){\n var Class = this;\n\n if (value && typeof value === 'object' && value.constructor === Class)\n return value;\n\n return new Class(function(resolve){\n resolve(value);\n });\n};\n\nPromise.reject = function(reason){\n var Class = this;\n\n return new Class(function(resolve, reject){\n reject(reason);\n });\n};\n\n})(typeof window != 'undefined' ? window : typeof global != 'undefined' ? global : typeof self != 'undefined' ? self : this);\n\n","/* jshint ignore:start */\n\"use strict\";\ndefine('polyfills',[\"es6-promise-polyfill\"], function (promise) {\n\n //This is pollyfill for old IE trim method\n if (typeof String.prototype.trim !== \"function\") {\n String.prototype.trim = function () {\n return this.replace(/^\\s+|\\s+$/g, '');\n };\n }\n\n /**\n * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n * Version 2, December 2004\n *\n * Copyright (C) 2011 Alex Kloss \n *\n * Everyone is permitted to copy and distribute verbatim or modified\n * copies of this license document, and changing it is allowed as long\n * as the name is changed.\n *\n * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n *\n * 0. You just DO WHAT THE FUCK YOU WANT TO.\n */\n [].indexOf||(Array.prototype.indexOf=function(a,b,c){for(c=this.length,b=(c+~~b)%c;b\n * @license MIT\n */\n(function(){\n 'use strict';\n\n /**\n * supported request types.\n * TODO support new types : 'style', 'file'?\n */\n var types = ['html', 'json', 'jsonp', 'script'];\n\n /**\n * supported http methods\n */\n var methods = [\n 'connect',\n 'delete',\n 'get',\n 'head',\n 'options',\n 'patch',\n 'post',\n 'put',\n 'trace'\n ];\n\n /**\n * API entry point.\n * It creates an new {@link Aja} object.\n *\n * @example aja().url('page.html').into('#selector').go();\n *\n * @exports aja\n * @namespace aja\n * @returns {Aja} the {@link Aja} object ready to create your request.\n */\n var aja = function aja(){\n\n //contains all the values from the setter for this context.\n var data = {};\n\n //contains the bound events.\n var events = {};\n\n /**\n * The Aja object is your context, it provides your getter/setter\n * as well as methods the fluent way.\n * @typedef {Object} Aja\n */\n\n /**\n * @type {Aja}\n * @lends aja\n */\n var Aja = {\n\n /**\n * URL getter/setter: where your request goes.\n * All URL formats are supported:
[protocol:][//][user[:passwd]@][host.tld]/path[?query][#hash]
.\n *\n * @example aja().url('bestlib?pattern=aja');\n *\n * @throws TypeError\n * @param {String} [url] - the url to set\n * @returns {Aja|String} chains or get the URL\n */\n url : function(url){\n return _chain.call(this, 'url', url, validators.string);\n },\n\n /**\n * Is the request synchronous (async by default) ?\n *\n * @example aja().sync(true);\n *\n * @param {Boolean|*} [sync] - true means sync (other types than booleans are casted)\n * @returns {Aja|Boolean} chains or get the sync value\n */\n sync : function(sync){\n return _chain.call(this, 'sync', sync, validators.bool);\n },\n\n /**\n * Should we force to disable browser caching (true by default) ?\n * By setting this to false, then a buster will be added to the requests.\n *\n * @example aja().cache(false);\n *\n * @param {Boolean|*} [cache] - false means no cache (other types than booleans are casted)\n * @returns {Aja|Boolean} chains or get cache value\n */\n cache : function(cache){\n return _chain.call(this, 'cache', cache, validators.bool);\n },\n\n /**\n * Type getter/setter: one of the predefined request type.\n * The supported types are :
['html', 'json', 'jsonp', 'script', 'style']
.\n * If not set, the default type is deduced regarding the context, but goes to json otherwise.\n *\n * @example aja().type('json');\n *\n * @throws TypeError if an unknown type is set\n * @param {String} [type] - the type to set\n * @returns {Aja|String} chains or get the type\n */\n type : function(type){\n return _chain.call(this, 'type', type, validators.type);\n },\n\n /**\n * HTTP Request Header getter/setter.\n *\n * @example aja().header('Content-Type', 'application/json');\n *\n * @throws TypeError\n * @param {String} name - the name of the header to get/set\n * @param {String} [value] - the value of the header to set\n * @returns {Aja|String} chains or get the header from the given name\n */\n header : function(name, value){\n data.headers = data.headers || {};\n\n validators.string(name);\n if(typeof value !== 'undefined'){\n validators.string(value);\n\n data.headers[name] = value;\n\n return this;\n }\n\n return data.headers[name];\n },\n\n /**\n * Setter only to add authentication credentials to the request.\n *\n * @throws TypeError\n * @param {String} user - the user name\n * @param {String} passwd - the password value\n * @returns {Aja} chains\n */\n auth : function(user, passwd){\n //setter only\n\n validators.string(user);\n validators.string(passwd);\n data.auth = {\n user : user,\n passwd : passwd\n };\n\n return this;\n },\n\n /**\n * Sets a timeout (expressed in ms) after which it will halt the request and the 'timeout' event will be fired.\n *\n * @example aja().timeout(1000); // Terminate the request and fire the 'timeout' event after 1s\n *\n * @throws TypeError\n * @param {Number} [ms] - timeout in ms to set. It has to be an integer > 0.\n * @returns {Aja|String} chains or get the params\n */\n timeout : function(ms){\n return _chain.call(this, 'timeout', ms, validators.positiveInteger);\n },\n\n /**\n * HTTP method getter/setter.\n *\n * @example aja().method('post');\n *\n * @throws TypeError if an unknown method is set\n * @param {String} [method] - the method to set\n * @returns {Aja|String} chains or get the method\n */\n method : function(method){\n return _chain.call(this, 'method', method, validators.method);\n },\n\n /**\n * URL's queryString getter/setter. The parameters are ALWAYS appended to the URL.\n *\n * @example aja().queryString({ user : '12' }); // ?user=12\n *\n * @throws TypeError\n * @param {Object|String} [params] - key/values POJO or URL queryString directly to set\n * @returns {Aja|String} chains or get the params\n */\n queryString : function(params){\n return _chain.call(this, 'queryString', params, validators.queryString);\n },\n\n /**\n * URL's queryString getter/setter.\n * Regarding the HTTP method the data goes to the queryString or the body.\n *\n * @example aja().data({ user : '12' });\n *\n * @throws TypeError\n * @param {Object} [params] - key/values POJO to set\n * @returns {Aja|String} chains or get the params\n */\n data : function(params){\n return _chain.call(this, 'data', params, validators.plainObject);\n },\n\n /**\n * Request Body getter/setter.\n * Objects and arrays are stringified (except FormData instances)\n *\n * @example aja().body(new FormData());\n *\n * @throws TypeError\n * @param {String|Object|Array|Boolean|Number|FormData} [content] - the content value to set\n * @returns {Aja|String|FormData} chains or get the body content\n */\n body : function(content){\n return _chain.call(this, 'body', content, null, function(content){\n if(typeof content === 'object'){\n //support FormData to be sent direclty\n if( !(content instanceof FormData)){\n //otherwise encode the object/array to a string\n try {\n content = JSON.stringify(content);\n } catch(e){\n throw new TypeError('Unable to stringify body\\'s content : ' + e.name);\n }\n this.header('Content-Type', 'application/json');\n }\n } else {\n content = content + ''; //cast\n }\n return content;\n });\n },\n\n /**\n * Into selector getter/setter. When you want an Element to contain the response.\n *\n * @example aja().into('div > .container');\n *\n * @throws TypeError\n * @param {String|HTMLElement} [selector] - the dom query selector or directly the Element\n * @returns {Aja|Array} chains or get the list of found elements\n */\n into : function(selector){\n return _chain.call(this, 'into', selector, validators.selector, function(selector){\n if(typeof selector === 'string'){\n return document.querySelectorAll(selector);\n }\n if(selector instanceof HTMLElement){\n return [selector];\n }\n });\n },\n\n /**\n * Padding name getter/setter, ie. the callback's PARAMETER name in your JSONP query.\n *\n * @example aja().jsonPaddingName('callback');\n *\n * @throws TypeError\n * @param {String} [paramName] - a valid parameter name\n * @returns {Aja|String} chains or get the parameter name\n */\n jsonPaddingName : function(paramName){\n return _chain.call(this, 'jsonPaddingName', paramName, validators.string);\n },\n\n /**\n * Padding value getter/setter, ie. the callback's name in your JSONP query.\n *\n * @example aja().jsonPadding('someFunction');\n *\n * @throws TypeError\n * @param {String} [padding] - a valid function name\n * @returns {Aja|String} chains or get the padding name\n */\n jsonPadding : function(padding){\n return _chain.call(this, 'jsonPadding', padding, validators.func);\n },\n\n /**\n * Attach an handler to an event.\n * Calling `on` with the same eventName multiple times add callbacks: they\n * will all be executed.\n *\n * @example aja().on('success', function(res){ console.log('Cool', res); });\n *\n * @param {String} name - the name of the event to listen\n * @param {Function} cb - the callback to run once the event is triggered\n * @returns {Aja} chains\n */\n on : function(name, cb){\n if(typeof cb === 'function'){\n events[name] = events[name] || [];\n events[name].push(cb);\n }\n return this;\n },\n\n /**\n * Remove ALL handlers for an event.\n *\n * @example aja().off('success');\n *\n * @param {String} name - the name of the event\n * @returns {Aja} chains\n */\n off : function(name){\n events[name] = [];\n return this;\n },\n\n /**\n * Trigger an event.\n * This method will be called hardly ever outside Aja itself,\n * but there is edge cases where it can be useful.\n *\n * @example aja().trigger('error', new Error('Emergency alert'));\n *\n * @param {String} name - the name of the event to trigger\n * @param {*} data - arguments given to the handlers\n * @returns {Aja} chains\n */\n trigger : function(name, data){\n var self = this;\n var eventCalls = function eventCalls(name, data){\n if(events[name] instanceof Array){\n events[name].forEach(function(event){\n event.call(self, data);\n });\n }\n };\n if(typeof name !== 'undefined'){\n name = name + '';\n var statusPattern = /^([0-9])([0-9x])([0-9x])$/i;\n var triggerStatus = name.match(statusPattern);\n\n //HTTP status pattern\n if(triggerStatus && triggerStatus.length > 3){\n Object.keys(events).forEach(function(eventName){\n var listenerStatus = eventName.match(statusPattern);\n if(listenerStatus && listenerStatus.length > 3 && //an listener on status\n triggerStatus[1] === listenerStatus[1] && //hundreds match exactly\n (listenerStatus[2] === 'x' || triggerStatus[2] === listenerStatus[2]) && //tens matches\n (listenerStatus[3] === 'x' || triggerStatus[3] === listenerStatus[3])){ //ones matches\n\n eventCalls(eventName, data);\n }\n });\n //or exact matching\n } else if(events[name]){\n eventCalls(name, data);\n }\n }\n return this;\n },\n\n /**\n * Trigger the call.\n * This is the end of your chain loop.\n *\n * @example aja()\n * .url('data.json')\n * .on('200', function(res){\n * //Yeah !\n * })\n * .go();\n */\n go : function(){\n\n var type = data.type || (data.into ? 'html' : 'json');\n var url = _buildQuery();\n\n //delegates to ajaGo\n if(typeof ajaGo[type] === 'function'){\n return ajaGo[type].call(this, url);\n }\n }\n };\n\n /**\n * Contains the different communication methods.\n * Used as provider by {@link Aja.go}\n *\n * @type {Object}\n * @private\n * @memberof aja\n */\n var ajaGo = {\n\n /**\n * XHR call to url to retrieve JSON\n * @param {String} url - the url\n */\n json : function(url){\n var self = this;\n\n ajaGo._xhr.call(this, url, function processRes(res){\n if(res){\n try {\n res = JSON.parse(res);\n } catch(e){\n self.trigger('error', e);\n return null;\n }\n }\n return res;\n });\n },\n\n /**\n * XHR call to url to retrieve HTML and add it to a container if set.\n * @param {String} url - the url\n */\n html : function(url){\n ajaGo._xhr.call(this, url, function processRes(res){\n if(data.into && data.into.length){\n [].forEach.call(data.into, function(elt){\n elt.innerHTML = res;\n });\n }\n return res;\n });\n },\n\n /**\n * Create and send an XHR query.\n * @param {String} url - the url\n * @param {Function} processRes - to modify / process the response before sent to events.\n */\n _xhr : function(url, processRes){\n var self = this;\n\n //iterators\n var key, header;\n\n var method = data.method || 'get';\n var async = data.sync !== true;\n var request = new XMLHttpRequest();\n var _data = data.data;\n var body = data.body;\n var headers = data.headers || {};\n var contentType = this.header('Content-Type');\n var timeout = data.timeout;\n var timeoutId;\n var isUrlEncoded;\n var openParams;\n\n //guess content type\n if(!contentType && _data && _dataInBody()){\n this.header('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');\n contentType = this.header('Content-Type');\n }\n\n //if data is used in body, it needs some modifications regarding the content type\n if(_data && _dataInBody()){\n if(typeof body !== 'string'){\n body = '';\n }\n\n if(contentType.indexOf('json') > -1){\n try {\n body = JSON.stringify(_data);\n } catch(e){\n throw new TypeError('Unable to stringify body\\'s content : ' + e.name);\n }\n } else {\n isUrlEncoded = contentType && contentType.indexOf('x-www-form-urlencoded') > 1;\n for(key in _data){\n if(isUrlEncoded){\n body += encodeURIComponent(key) + '=' + encodeURIComponent(_data[key]) + '&';\n } else {\n body += key + '=' + _data[key] + '\\n\\r';\n }\n }\n }\n }\n\n //open the XHR request\n openParams = [method, url, async];\n if(data.auth){\n openParams.push(data.auth.user);\n openParams.push(data.auth.passwd);\n }\n request.open.apply(request, openParams);\n\n //set the headers\n for(header in data.headers){\n request.setRequestHeader(header, data.headers[header]);\n }\n\n //bind events\n request.onprogress = function(e){\n if (e.lengthComputable) {\n self.trigger('progress', e.loaded / e.total);\n }\n };\n\n request.onload = function onRequestLoad(){\n var response = request.responseText;\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if(this.status >= 200 && this.status < 300){\n if(typeof processRes === 'function'){\n response = processRes(response);\n }\n self.trigger('success', response);\n }\n\n self.trigger(this.status, response);\n\n self.trigger('end', response);\n };\n\n request.onerror = function onRequestError (err){\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n self.trigger('error', err, arguments);\n };\n\n //sets the timeout\n if (timeout) {\n timeoutId = setTimeout(function() {\n self.trigger('timeout', {\n type: 'timeout',\n expiredAfter: timeout\n }, request, arguments);\n request.abort();\n }, timeout);\n }\n\n //send the request\n request.send(body);\n },\n\n /**\n * @this {Aja} call bound to the Aja context\n * @param {String} url - the url\n */\n jsonp : function(url){\n var script;\n var self = this;\n var head = document.querySelector('head');\n var async = data.sync !== true;\n var jsonPaddingName = data.jsonPaddingName || 'callback';\n var jsonPadding = data.jsonPadding || ('_padd' + new Date().getTime() + Math.floor(Math.random() * 10000));\n var paddingQuery = {};\n\n if(aja[jsonPadding]){\n throw new Error('Padding ' + jsonPadding + ' already exists. It must be unique.');\n }\n if(!/^ajajsonp_/.test(jsonPadding)){\n jsonPadding = 'ajajsonp_' + jsonPadding;\n }\n\n //window.ajajsonp = window.ajajsonp || {};\n window[jsonPadding] = function padding (response){\n self.trigger('success', response);\n head.removeChild(script);\n window[jsonPadding] = undefined;\n };\n\n paddingQuery[jsonPaddingName] = jsonPadding;\n\n url = appendQueryString(url, paddingQuery);\n\n script = document.createElement('script');\n script.async = async;\n script.src = url;\n script.onerror = function(){\n self.trigger('error', arguments);\n head.removeChild(script);\n window[jsonPadding] = undefined;\n };\n head.appendChild(script);\n },\n\n /**\n * Loads a script.\n *\n * This kind of ugly script loading is sometimes used by 3rd part libraries to load\n * a configured script. For example, to embed google analytics or a twitter button.\n *\n * @this {Aja} call bound to the Aja context\n * @param {String} url - the url\n */\n script : function(url){\n\n var self = this;\n var head = document.querySelector('head') || document.querySelector('body');\n var async = data.sync !== true;\n var script;\n\n if(!head){\n throw new Error('Ok, wait a second, you want to load a script, but you don\\'t have at least a head or body tag...');\n }\n\n script = document.createElement('script');\n script.async = async;\n script.src = url;\n script.onerror = function onScriptError(){\n self.trigger('error', arguments);\n head.removeChild(script);\n };\n script.onload = function onScriptLoad(){\n self.trigger('success', arguments);\n };\n\n head.appendChild(script);\n }\n };\n\n /**\n * Helps you to chain getter/setters.\n * @private\n * @memberof aja\n * @this {Aja} bound to the current context\n * @param {String} name - the property name\n * @param {*} [value] - the property value if we are in a setter\n * @param {Function} [validator] - to validate/transform the value if needed\n * @param {Function} [update] - when there is more to do with the setter\n * @returns {Aja|*} either the current context (setter) or the requested value (getter)\n * @throws TypeError\n */\n var _chain = function _chain(name, value, validator, update){\n if(typeof value !== 'undefined'){\n if(typeof validator === 'function'){\n try{\n value = validator.call(validators, value);\n } catch(e){\n throw new TypeError('Failed to set ' + name + ' : ' + e.message);\n }\n }\n if(typeof update === 'function'){\n data[name] = update.call(this, value);\n } else {\n data[name] = value;\n }\n return this;\n }\n return data[name] === 'undefined' ? null : data[name];\n };\n\n /**\n * Check whether the data must be set in the body instead of the queryString\n * @private\n * @memberof aja\n * @returns {Boolean} true id data goes to the body\n */\n var _dataInBody = function _dataInBody(){\n return ['delete', 'patch', 'post', 'put'].indexOf(data.method) > -1;\n };\n\n /**\n * Build the URL to run the request against.\n * @private\n * @memberof aja\n * @returns {String} the URL\n */\n var _buildQuery = function _buildQuery(){\n\n var url = data.url;\n var cache = typeof data.cache !== 'undefined' ? !!data.cache : true;\n var queryString = data.queryString || '';\n var _data = data.data;\n\n //add a cache buster\n if(cache === false){\n queryString += '&ajabuster=' + new Date().getTime();\n }\n\n url = appendQueryString(url, queryString);\n\n if(_data && !_dataInBody()){\n url = appendQueryString(url, _data);\n }\n return url;\n };\n\n //expose the Aja function\n return Aja;\n };\n\n /**\n * Validation/reparation rules for Aja's getter/setter.\n */\n var validators = {\n\n /**\n * cast to boolean\n * @param {*} value\n * @returns {Boolean} casted value\n */\n bool : function(value){\n return !!value;\n },\n\n /**\n * Check whether the given parameter is a string\n * @param {String} string\n * @returns {String} value\n * @throws {TypeError} for non strings\n */\n string : function(string){\n if(typeof string !== 'string'){\n throw new TypeError('a string is expected, but ' + string + ' [' + (typeof string) + '] given');\n }\n return string;\n },\n\n /**\n * Check whether the given parameter is a positive integer > 0\n * @param {Number} integer\n * @returns {Number} value\n * @throws {TypeError} for non strings\n */\n positiveInteger : function(integer){\n if(parseInt(integer) !== integer || integer <= 0){\n throw new TypeError('an integer is expected, but ' + integer + ' [' + (typeof integer) + '] given');\n }\n return integer;\n },\n\n /**\n * Check whether the given parameter is a plain object (array and functions aren't accepted)\n * @param {Object} object\n * @returns {Object} object\n * @throws {TypeError} for non object\n */\n plainObject : function(object){\n if(typeof object !== 'object' || object.constructor !== Object){\n throw new TypeError('an object is expected, but ' + object + ' [' + (typeof object) + '] given');\n }\n return object;\n },\n\n /**\n * Check whether the given parameter is a type supported by Aja.\n * The list of supported types is set above, in the {@link types} variable.\n * @param {String} type\n * @returns {String} type\n * @throws {TypeError} if the type isn't supported\n */\n type : function(type){\n type = this.string(type);\n if(types.indexOf(type.toLowerCase()) < 0){\n throw new TypeError('a type in [' + types.join(', ') + '] is expected, but ' + type + ' given');\n }\n return type.toLowerCase();\n },\n\n /**\n * Check whether the given HTTP method is supported.\n * The list of supported methods is set above, in the {@link methods} variable.\n * @param {String} method\n * @returns {String} method (but to lower case)\n * @throws {TypeError} if the method isn't supported\n */\n method : function(method){\n method = this.string(method);\n if(methods.indexOf(method.toLowerCase()) < 0){\n throw new TypeError('a method in [' + methods.join(', ') + '] is expected, but ' + method + ' given');\n }\n return method.toLowerCase();\n },\n\n /**\n * Check the queryString, and create an object if a string is given.\n *\n * @param {String|Object} params\n * @returns {Object} key/value based queryString\n * @throws {TypeError} if wrong params type or if the string isn't parseable\n */\n queryString : function(params){\n var object = {};\n if(typeof params === 'string'){\n\n params.replace('?', '').split('&').forEach(function(kv){\n var pair = kv.split('=');\n if(pair.length === 2){\n object[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n });\n } else {\n object = params;\n }\n return this.plainObject(object);\n },\n\n /**\n * Check if the parameter enables us to select a DOM Element.\n *\n * @param {String|HTMLElement} selector - CSS selector or the element ref\n * @returns {String|HTMLElement} same as input if valid\n * @throws {TypeError} check it's a string or an HTMLElement\n */\n selector : function(selector){\n if(typeof selector !== 'string' && !(selector instanceof HTMLElement)){\n throw new TypeError('a selector or an HTMLElement is expected, ' + selector + ' [' + (typeof selector) + '] given');\n }\n return selector;\n },\n\n /**\n * Check if the parameter is a valid JavaScript function name.\n *\n * @param {String} functionName\n * @returns {String} same as input if valid\n * @throws {TypeError} check it's a string and a valid name against the pattern inside.\n */\n func : function(functionName){\n functionName = this.string(functionName);\n if(!/^([a-zA-Z_])([a-zA-Z0-9_\\-])+$/.test(functionName)){\n throw new TypeError('a valid function name is expected, ' + functionName + ' [' + (typeof functionName) + '] given');\n }\n return functionName;\n }\n };\n\n /**\n * Query string helper : append some parameters\n * @private\n * @param {String} url - the URL to append the parameters\n * @param {Object} params - key/value\n * @returns {String} the new URL\n */\n var appendQueryString = function appendQueryString(url, params){\n var key;\n url = url || '';\n if(params){\n if(url.indexOf('?') === -1){\n url += '?';\n }\n if(typeof params === 'string'){\n url += params;\n } else if (typeof params === 'object'){\n for(key in params){\n url += '&' + encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);\n }\n }\n }\n\n return url;\n };\n\n //AMD, CommonJs, then globals\n if (typeof define === 'function' && define.amd) {\n define('aja',[], function(){\n return aja;\n });\n } else if (typeof exports === 'object') {\n module.exports = aja;\n } else {\n window.aja = window.aja || aja;\n }\n\n}());\n\n","define('requester/template',[], function () {\n \"use strict\";\n function isUndefined(value) {\n return value === undefined;\n }\n\n function isFunction(value) {\n return typeof value === 'function';\n }\n\n return function (template, values) {\n return template.replace(/\\{ *([\\w_]+) *\\}/g, function (match, key) {\n var value = values[key];\n if (isUndefined(value)) {\n return \"{\" + key + \"}\";\n } else if (isFunction(value)) {\n return value(key);\n }\n return value;\n });\n };\n});\n\n","define('requester/json',[\"aja\", \"./template\"], function (aja, template) {\n \"use strict\";\n\n function addQueryParams(options, req) {\n return options.queryParameters ? req.data(options.queryParameters) : req;\n }\n\n function addFailHandler(options, req) {\n return options.fail ? req.on(\"error\", options.fail).on(\"4xx\", options.fail).on(\"5xx\", options.fail) : req;\n }\n\n return {\n /**\n * Executes a request and processes the response as JSON.\n * @method get\n * @param {Object} options Specifies the details of the request.\n * @param {String} options.url The URL to request.\n * @param {Object} [options.queryParameters] The data to pass as GET parameters with the request.\n * @param {Object} [options.pathParameters] The data to use as {placeholders} in url.\n * @param {Function} [options.fail] The callback to execute when the request fails.\n * @param {Function} options.callback The callback to execute when the request completes.\n */\n get: function (options) {\n options.pathParameters = options.pathParameters || {};\n options.pathParameters.contentType = \"json\";\n options.pathParameters.protocol = options.pathParameters.protocol || \"https\";\n\n var url = template(options.url, options.pathParameters);\n\n var req = aja().url(url);\n req = addQueryParams(options, req);\n req = addFailHandler(options, req);\n req.on(\"400\", options.callback)\n req.on(\"success\", options.callback).go();\n }\n };\n});\n\n","define('requester/jsonp',[\"aja\", \"./template\"], function (aja, template) {\n \"use strict\";\n function callbackFunction(callback, fail) {\n return function (response) {\n if (!response.errorResponse) {\n callback(response);\n return;\n }\n if (fail) {\n fail(response.errorResponse[\"@description\"]);\n }\n };\n }\n\n function prepareOptions(options) {\n options.pathParameters = options.pathParameters || {};\n options.pathParameters.contentType = \"jsonp\";\n options.pathParameters.protocol = options.pathParameters.protocol || \"https\";\n options.callbackParam = options.callbackParam || \"jsonp\";\n\n }\n\n function addQueryParams(options, req) {\n return options.queryParameters ? req.data(options.queryParameters) : req;\n }\n\n function addFailHandler(options, req) {\n return options.fail ? req.on(\"error\", options.fail).on(\"4xx\", options.fail).on(\"5xx\", options.fail) : req;\n }\n\n return {\n /**\n * Executes a request and processes the response as JSON.\n * @method get\n * @param {Object} options Specifies the details of the request.\n * @param {String} options.url The URL to request with {placeholders} for path parameters. {contentType}\n * will be replaced accordingly.\n * @param {Object} [options.queryParameters] The data to pass as GET parameters with the request.\n * @param {Object} [options.pathParameters] The data to use as {placeholders} in url.\n * @param {Function} options.callback The callback to execute when the request completes.\n * @param {String} [options.callbackParam=jsonp] The parameter name that the endpoint expects to qualify\n * the JSONP callback function.\n */\n get: function (options) {\n prepareOptions(options);\n var url = template(options.url, options.pathParameters);\n var req = aja().url(url).type(\"jsonp\").jsonPaddingName(options.callbackParam);\n req = addQueryParams(options, req);\n req = addFailHandler(options, req);\n req.on(\"success\", callbackFunction(options.callback, options.fail)).go();\n }\n };\n});\n\n","define('requester/requester',['./json', './jsonp'], function (json, jsonp) {\n 'use strict';\n var useJsonp = false;\n var useHttp = false;\n\n return {\n useJsonp: function (use) {\n useJsonp = use;\n },\n\n useHttp: function (use) {\n useHttp = use;\n },\n\n protocol: function () {\n return useHttp ? 'http' : 'https';\n },\n\n get: function (options) {\n options.protocol = options.protocol || this.protocol();\n return useJsonp ? jsonp.get(options) : json.get(options);\n }\n };\n});\n","/*\n Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com\n (c) 2010-2013, Vladimir Agafonkin\n (c) 2010-2011, CloudMade\n*/\n(function (window, document, undefined) {\nvar oldL = window.L,\n L = {};\n\nL.version = '0.7.7';\n\n// define Leaflet for Node module pattern loaders, including Browserify\nif (typeof module === 'object' && typeof module.exports === 'object') {\n\tmodule.exports = L;\n\n// define Leaflet as an AMD module\n} else if (typeof define === 'function' && define.amd) {\n\tdefine('leaflet',L);\n}\n\n// define Leaflet as a global L variable, saving the original L to restore later if needed\n\nL.noConflict = function () {\n\twindow.L = oldL;\n\treturn this;\n};\n\nwindow.L = L;\n\n\n/*\n * L.Util contains various utility functions used throughout Leaflet code.\n */\n\nL.Util = {\n\textend: function (dest) { // (Object[, Object, ...]) ->\n\t\tvar sources = Array.prototype.slice.call(arguments, 1),\n\t\t i, j, len, src;\n\n\t\tfor (j = 0, len = sources.length; j < len; j++) {\n\t\t\tsrc = sources[j] || {};\n\t\t\tfor (i in src) {\n\t\t\t\tif (src.hasOwnProperty(i)) {\n\t\t\t\t\tdest[i] = src[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn dest;\n\t},\n\n\tbind: function (fn, obj) { // (Function, Object) -> Function\n\t\tvar args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null;\n\t\treturn function () {\n\t\t\treturn fn.apply(obj, args || arguments);\n\t\t};\n\t},\n\n\tstamp: (function () {\n\t\tvar lastId = 0,\n\t\t key = '_leaflet_id';\n\t\treturn function (obj) {\n\t\t\tobj[key] = obj[key] || ++lastId;\n\t\t\treturn obj[key];\n\t\t};\n\t}()),\n\n\tinvokeEach: function (obj, method, context) {\n\t\tvar i, args;\n\n\t\tif (typeof obj === 'object') {\n\t\t\targs = Array.prototype.slice.call(arguments, 3);\n\n\t\t\tfor (i in obj) {\n\t\t\t\tmethod.apply(context, [i, obj[i]].concat(args));\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tlimitExecByInterval: function (fn, time, context) {\n\t\tvar lock, execOnUnlock;\n\n\t\treturn function wrapperFn() {\n\t\t\tvar args = arguments;\n\n\t\t\tif (lock) {\n\t\t\t\texecOnUnlock = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlock = true;\n\n\t\t\tsetTimeout(function () {\n\t\t\t\tlock = false;\n\n\t\t\t\tif (execOnUnlock) {\n\t\t\t\t\twrapperFn.apply(context, args);\n\t\t\t\t\texecOnUnlock = false;\n\t\t\t\t}\n\t\t\t}, time);\n\n\t\t\tfn.apply(context, args);\n\t\t};\n\t},\n\n\tfalseFn: function () {\n\t\treturn false;\n\t},\n\n\tformatNum: function (num, digits) {\n\t\tvar pow = Math.pow(10, digits || 5);\n\t\treturn Math.round(num * pow) / pow;\n\t},\n\n\ttrim: function (str) {\n\t\treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n\t},\n\n\tsplitWords: function (str) {\n\t\treturn L.Util.trim(str).split(/\\s+/);\n\t},\n\n\tsetOptions: function (obj, options) {\n\t\tobj.options = L.extend({}, obj.options, options);\n\t\treturn obj.options;\n\t},\n\n\tgetParamString: function (obj, existingUrl, uppercase) {\n\t\tvar params = [];\n\t\tfor (var i in obj) {\n\t\t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\n\t\t}\n\t\treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\n\t},\n\ttemplate: function (str, data) {\n\t\treturn str.replace(/\\{ *([\\w_]+) *\\}/g, function (str, key) {\n\t\t\tvar value = data[key];\n\t\t\tif (value === undefined) {\n\t\t\t\tthrow new Error('No value provided for variable ' + str);\n\t\t\t} else if (typeof value === 'function') {\n\t\t\t\tvalue = value(data);\n\t\t\t}\n\t\t\treturn value;\n\t\t});\n\t},\n\n\tisArray: Array.isArray || function (obj) {\n\t\treturn (Object.prototype.toString.call(obj) === '[object Array]');\n\t},\n\n\temptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='\n};\n\n(function () {\n\n\t// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n\n\tfunction getPrefixed(name) {\n\t\tvar i, fn,\n\t\t prefixes = ['webkit', 'moz', 'o', 'ms'];\n\n\t\tfor (i = 0; i < prefixes.length && !fn; i++) {\n\t\t\tfn = window[prefixes[i] + name];\n\t\t}\n\n\t\treturn fn;\n\t}\n\n\tvar lastTime = 0;\n\n\tfunction timeoutDefer(fn) {\n\t\tvar time = +new Date(),\n\t\t timeToCall = Math.max(0, 16 - (time - lastTime));\n\n\t\tlastTime = time + timeToCall;\n\t\treturn window.setTimeout(fn, timeToCall);\n\t}\n\n\tvar requestFn = window.requestAnimationFrame ||\n\t getPrefixed('RequestAnimationFrame') || timeoutDefer;\n\n\tvar cancelFn = window.cancelAnimationFrame ||\n\t getPrefixed('CancelAnimationFrame') ||\n\t getPrefixed('CancelRequestAnimationFrame') ||\n\t function (id) { window.clearTimeout(id); };\n\n\n\tL.Util.requestAnimFrame = function (fn, context, immediate, element) {\n\t\tfn = L.bind(fn, context);\n\n\t\tif (immediate && requestFn === timeoutDefer) {\n\t\t\tfn();\n\t\t} else {\n\t\t\treturn requestFn.call(window, fn, element);\n\t\t}\n\t};\n\n\tL.Util.cancelAnimFrame = function (id) {\n\t\tif (id) {\n\t\t\tcancelFn.call(window, id);\n\t\t}\n\t};\n\n}());\n\n// shortcuts for most used utility functions\nL.extend = L.Util.extend;\nL.bind = L.Util.bind;\nL.stamp = L.Util.stamp;\nL.setOptions = L.Util.setOptions;\n\n\n/*\n * L.Class powers the OOP facilities of the library.\n * Thanks to John Resig and Dean Edwards for inspiration!\n */\n\nL.Class = function () {};\n\nL.Class.extend = function (props) {\n\n\t// extended class with the new prototype\n\tvar NewClass = function () {\n\n\t\t// call the constructor\n\t\tif (this.initialize) {\n\t\t\tthis.initialize.apply(this, arguments);\n\t\t}\n\n\t\t// call all constructor hooks\n\t\tif (this._initHooks) {\n\t\t\tthis.callInitHooks();\n\t\t}\n\t};\n\n\t// instantiate class without calling constructor\n\tvar F = function () {};\n\tF.prototype = this.prototype;\n\n\tvar proto = new F();\n\tproto.constructor = NewClass;\n\n\tNewClass.prototype = proto;\n\n\t//inherit parent's statics\n\tfor (var i in this) {\n\t\tif (this.hasOwnProperty(i) && i !== 'prototype') {\n\t\t\tNewClass[i] = this[i];\n\t\t}\n\t}\n\n\t// mix static properties into the class\n\tif (props.statics) {\n\t\tL.extend(NewClass, props.statics);\n\t\tdelete props.statics;\n\t}\n\n\t// mix includes into the prototype\n\tif (props.includes) {\n\t\tL.Util.extend.apply(null, [proto].concat(props.includes));\n\t\tdelete props.includes;\n\t}\n\n\t// merge options\n\tif (props.options && proto.options) {\n\t\tprops.options = L.extend({}, proto.options, props.options);\n\t}\n\n\t// mix given properties into the prototype\n\tL.extend(proto, props);\n\n\tproto._initHooks = [];\n\n\tvar parent = this;\n\t// jshint camelcase: false\n\tNewClass.__super__ = parent.prototype;\n\n\t// add method for calling all hooks\n\tproto.callInitHooks = function () {\n\n\t\tif (this._initHooksCalled) { return; }\n\n\t\tif (parent.prototype.callInitHooks) {\n\t\t\tparent.prototype.callInitHooks.call(this);\n\t\t}\n\n\t\tthis._initHooksCalled = true;\n\n\t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\n\t\t\tproto._initHooks[i].call(this);\n\t\t}\n\t};\n\n\treturn NewClass;\n};\n\n\n// method for adding properties to prototype\nL.Class.include = function (props) {\n\tL.extend(this.prototype, props);\n};\n\n// merge new default options to the Class\nL.Class.mergeOptions = function (options) {\n\tL.extend(this.prototype.options, options);\n};\n\n// add a constructor hook\nL.Class.addInitHook = function (fn) { // (Function) || (String, args...)\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\n\tvar init = typeof fn === 'function' ? fn : function () {\n\t\tthis[fn].apply(this, args);\n\t};\n\n\tthis.prototype._initHooks = this.prototype._initHooks || [];\n\tthis.prototype._initHooks.push(init);\n};\n\n\n/*\n * L.Mixin.Events is used to add custom events functionality to Leaflet classes.\n */\n\nvar eventsKey = '_leaflet_events';\n\nL.Mixin = {};\n\nL.Mixin.Events = {\n\n\taddEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object])\n\n\t\t// types can be a map of types/handlers\n\t\tif (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; }\n\n\t\tvar events = this[eventsKey] = this[eventsKey] || {},\n\t\t contextId = context && context !== this && L.stamp(context),\n\t\t i, len, event, type, indexKey, indexLenKey, typeIndex;\n\n\t\t// types can be a string of space-separated words\n\t\ttypes = L.Util.splitWords(types);\n\n\t\tfor (i = 0, len = types.length; i < len; i++) {\n\t\t\tevent = {\n\t\t\t\taction: fn,\n\t\t\t\tcontext: context || this\n\t\t\t};\n\t\t\ttype = types[i];\n\n\t\t\tif (contextId) {\n\t\t\t\t// store listeners of a particular context in a separate hash (if it has an id)\n\t\t\t\t// gives a major performance boost when removing thousands of map layers\n\n\t\t\t\tindexKey = type + '_idx';\n\t\t\t\tindexLenKey = indexKey + '_len';\n\n\t\t\t\ttypeIndex = events[indexKey] = events[indexKey] || {};\n\n\t\t\t\tif (!typeIndex[contextId]) {\n\t\t\t\t\ttypeIndex[contextId] = [];\n\n\t\t\t\t\t// keep track of the number of keys in the index to quickly check if it's empty\n\t\t\t\t\tevents[indexLenKey] = (events[indexLenKey] || 0) + 1;\n\t\t\t\t}\n\n\t\t\t\ttypeIndex[contextId].push(event);\n\n\n\t\t\t} else {\n\t\t\t\tevents[type] = events[type] || [];\n\t\t\t\tevents[type].push(event);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\thasEventListeners: function (type) { // (String) -> Boolean\n\t\tvar events = this[eventsKey];\n\t\treturn !!events && ((type in events && events[type].length > 0) ||\n\t\t (type + '_idx' in events && events[type + '_idx_len'] > 0));\n\t},\n\n\tremoveEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object])\n\n\t\tif (!this[eventsKey]) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!types) {\n\t\t\treturn this.clearAllEventListeners();\n\t\t}\n\n\t\tif (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; }\n\n\t\tvar events = this[eventsKey],\n\t\t contextId = context && context !== this && L.stamp(context),\n\t\t i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed;\n\n\t\ttypes = L.Util.splitWords(types);\n\n\t\tfor (i = 0, len = types.length; i < len; i++) {\n\t\t\ttype = types[i];\n\t\t\tindexKey = type + '_idx';\n\t\t\tindexLenKey = indexKey + '_len';\n\n\t\t\ttypeIndex = events[indexKey];\n\n\t\t\tif (!fn) {\n\t\t\t\t// clear all listeners for a type if function isn't specified\n\t\t\t\tdelete events[type];\n\t\t\t\tdelete events[indexKey];\n\t\t\t\tdelete events[indexLenKey];\n\n\t\t\t} else {\n\t\t\t\tlisteners = contextId && typeIndex ? typeIndex[contextId] : events[type];\n\n\t\t\t\tif (listeners) {\n\t\t\t\t\tfor (j = listeners.length - 1; j >= 0; j--) {\n\t\t\t\t\t\tif ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) {\n\t\t\t\t\t\t\tremoved = listeners.splice(j, 1);\n\t\t\t\t\t\t\t// set the old action to a no-op, because it is possible\n\t\t\t\t\t\t\t// that the listener is being iterated over as part of a dispatch\n\t\t\t\t\t\t\tremoved[0].action = L.Util.falseFn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (context && typeIndex && (listeners.length === 0)) {\n\t\t\t\t\t\tdelete typeIndex[contextId];\n\t\t\t\t\t\tevents[indexLenKey]--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclearAllEventListeners: function () {\n\t\tdelete this[eventsKey];\n\t\treturn this;\n\t},\n\n\tfireEvent: function (type, data) { // (String[, Object])\n\t\tif (!this.hasEventListeners(type)) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar event = L.Util.extend({}, data, { type: type, target: this });\n\n\t\tvar events = this[eventsKey],\n\t\t listeners, i, len, typeIndex, contextId;\n\n\t\tif (events[type]) {\n\t\t\t// make sure adding/removing listeners inside other listeners won't cause infinite loop\n\t\t\tlisteners = events[type].slice();\n\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\n\t\t\t\tlisteners[i].action.call(listeners[i].context, event);\n\t\t\t}\n\t\t}\n\n\t\t// fire event for the context-indexed listeners as well\n\t\ttypeIndex = events[type + '_idx'];\n\n\t\tfor (contextId in typeIndex) {\n\t\t\tlisteners = typeIndex[contextId].slice();\n\n\t\t\tif (listeners) {\n\t\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\n\t\t\t\t\tlisteners[i].action.call(listeners[i].context, event);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\taddOneTimeEventListener: function (types, fn, context) {\n\n\t\tif (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; }\n\n\t\tvar handler = L.bind(function () {\n\t\t\tthis\n\t\t\t .removeEventListener(types, fn, context)\n\t\t\t .removeEventListener(types, handler, context);\n\t\t}, this);\n\n\t\treturn this\n\t\t .addEventListener(types, fn, context)\n\t\t .addEventListener(types, handler, context);\n\t}\n};\n\nL.Mixin.Events.on = L.Mixin.Events.addEventListener;\nL.Mixin.Events.off = L.Mixin.Events.removeEventListener;\nL.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener;\nL.Mixin.Events.fire = L.Mixin.Events.fireEvent;\n\n\n/*\n * L.Browser handles different browser and feature detections for internal Leaflet use.\n */\n\n(function () {\n\n\tvar ie = 'ActiveXObject' in window,\n\t\tielt9 = ie && !document.addEventListener,\n\n\t // terrible browser detection to work around Safari / iOS / Android browser bugs\n\t ua = navigator.userAgent.toLowerCase(),\n\t webkit = ua.indexOf('webkit') !== -1,\n\t chrome = ua.indexOf('chrome') !== -1,\n\t phantomjs = ua.indexOf('phantom') !== -1,\n\t android = ua.indexOf('android') !== -1,\n\t android23 = ua.search('android [23]') !== -1,\n\t\tgecko = ua.indexOf('gecko') !== -1,\n\n\t mobile = typeof orientation !== undefined + '',\n\t msPointer = !window.PointerEvent && window.MSPointerEvent,\n\t\tpointer = (window.PointerEvent && window.navigator.pointerEnabled) ||\n\t\t\t\t msPointer,\n\t retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) ||\n\t ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') &&\n\t window.matchMedia('(min-resolution:144dpi)').matches),\n\n\t doc = document.documentElement,\n\t ie3d = ie && ('transition' in doc.style),\n\t webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,\n\t gecko3d = 'MozPerspective' in doc.style,\n\t opera3d = 'OTransition' in doc.style,\n\t any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs;\n\n\tvar touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in window ||\n\t\t(window.DocumentTouch && document instanceof window.DocumentTouch));\n\n\tL.Browser = {\n\t\tie: ie,\n\t\tielt9: ielt9,\n\t\twebkit: webkit,\n\t\tgecko: gecko && !webkit && !window.opera && !ie,\n\n\t\tandroid: android,\n\t\tandroid23: android23,\n\n\t\tchrome: chrome,\n\n\t\tie3d: ie3d,\n\t\twebkit3d: webkit3d,\n\t\tgecko3d: gecko3d,\n\t\topera3d: opera3d,\n\t\tany3d: any3d,\n\n\t\tmobile: mobile,\n\t\tmobileWebkit: mobile && webkit,\n\t\tmobileWebkit3d: mobile && webkit3d,\n\t\tmobileOpera: mobile && window.opera,\n\n\t\ttouch: touch,\n\t\tmsPointer: msPointer,\n\t\tpointer: pointer,\n\n\t\tretina: retina\n\t};\n\n}());\n\n\n/*\n * L.Point represents a point with x and y coordinates.\n */\n\nL.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {\n\tthis.x = (round ? Math.round(x) : x);\n\tthis.y = (round ? Math.round(y) : y);\n};\n\nL.Point.prototype = {\n\n\tclone: function () {\n\t\treturn new L.Point(this.x, this.y);\n\t},\n\n\t// non-destructive, returns a new point\n\tadd: function (point) {\n\t\treturn this.clone()._add(L.point(point));\n\t},\n\n\t// destructive, used directly for performance in situations where it's safe to modify existing point\n\t_add: function (point) {\n\t\tthis.x += point.x;\n\t\tthis.y += point.y;\n\t\treturn this;\n\t},\n\n\tsubtract: function (point) {\n\t\treturn this.clone()._subtract(L.point(point));\n\t},\n\n\t_subtract: function (point) {\n\t\tthis.x -= point.x;\n\t\tthis.y -= point.y;\n\t\treturn this;\n\t},\n\n\tdivideBy: function (num) {\n\t\treturn this.clone()._divideBy(num);\n\t},\n\n\t_divideBy: function (num) {\n\t\tthis.x /= num;\n\t\tthis.y /= num;\n\t\treturn this;\n\t},\n\n\tmultiplyBy: function (num) {\n\t\treturn this.clone()._multiplyBy(num);\n\t},\n\n\t_multiplyBy: function (num) {\n\t\tthis.x *= num;\n\t\tthis.y *= num;\n\t\treturn this;\n\t},\n\n\tround: function () {\n\t\treturn this.clone()._round();\n\t},\n\n\t_round: function () {\n\t\tthis.x = Math.round(this.x);\n\t\tthis.y = Math.round(this.y);\n\t\treturn this;\n\t},\n\n\tfloor: function () {\n\t\treturn this.clone()._floor();\n\t},\n\n\t_floor: function () {\n\t\tthis.x = Math.floor(this.x);\n\t\tthis.y = Math.floor(this.y);\n\t\treturn this;\n\t},\n\n\tdistanceTo: function (point) {\n\t\tpoint = L.point(point);\n\n\t\tvar x = point.x - this.x,\n\t\t y = point.y - this.y;\n\n\t\treturn Math.sqrt(x * x + y * y);\n\t},\n\n\tequals: function (point) {\n\t\tpoint = L.point(point);\n\n\t\treturn point.x === this.x &&\n\t\t point.y === this.y;\n\t},\n\n\tcontains: function (point) {\n\t\tpoint = L.point(point);\n\n\t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\n\t\t Math.abs(point.y) <= Math.abs(this.y);\n\t},\n\n\ttoString: function () {\n\t\treturn 'Point(' +\n\t\t L.Util.formatNum(this.x) + ', ' +\n\t\t L.Util.formatNum(this.y) + ')';\n\t}\n};\n\nL.point = function (x, y, round) {\n\tif (x instanceof L.Point) {\n\t\treturn x;\n\t}\n\tif (L.Util.isArray(x)) {\n\t\treturn new L.Point(x[0], x[1]);\n\t}\n\tif (x === undefined || x === null) {\n\t\treturn x;\n\t}\n\treturn new L.Point(x, y, round);\n};\n\n\n/*\n * L.Bounds represents a rectangular area on the screen in pixel coordinates.\n */\n\nL.Bounds = function (a, b) { //(Point, Point) or Point[]\n\tif (!a) { return; }\n\n\tvar points = b ? [a, b] : a;\n\n\tfor (var i = 0, len = points.length; i < len; i++) {\n\t\tthis.extend(points[i]);\n\t}\n};\n\nL.Bounds.prototype = {\n\t// extend the bounds to contain the given point\n\textend: function (point) { // (Point)\n\t\tpoint = L.point(point);\n\n\t\tif (!this.min && !this.max) {\n\t\t\tthis.min = point.clone();\n\t\t\tthis.max = point.clone();\n\t\t} else {\n\t\t\tthis.min.x = Math.min(point.x, this.min.x);\n\t\t\tthis.max.x = Math.max(point.x, this.max.x);\n\t\t\tthis.min.y = Math.min(point.y, this.min.y);\n\t\t\tthis.max.y = Math.max(point.y, this.max.y);\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetCenter: function (round) { // (Boolean) -> Point\n\t\treturn new L.Point(\n\t\t (this.min.x + this.max.x) / 2,\n\t\t (this.min.y + this.max.y) / 2, round);\n\t},\n\n\tgetBottomLeft: function () { // -> Point\n\t\treturn new L.Point(this.min.x, this.max.y);\n\t},\n\n\tgetTopRight: function () { // -> Point\n\t\treturn new L.Point(this.max.x, this.min.y);\n\t},\n\n\tgetSize: function () {\n\t\treturn this.max.subtract(this.min);\n\t},\n\n\tcontains: function (obj) { // (Bounds) or (Point) -> Boolean\n\t\tvar min, max;\n\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.Point) {\n\t\t\tobj = L.point(obj);\n\t\t} else {\n\t\t\tobj = L.bounds(obj);\n\t\t}\n\n\t\tif (obj instanceof L.Bounds) {\n\t\t\tmin = obj.min;\n\t\t\tmax = obj.max;\n\t\t} else {\n\t\t\tmin = max = obj;\n\t\t}\n\n\t\treturn (min.x >= this.min.x) &&\n\t\t (max.x <= this.max.x) &&\n\t\t (min.y >= this.min.y) &&\n\t\t (max.y <= this.max.y);\n\t},\n\n\tintersects: function (bounds) { // (Bounds) -> Boolean\n\t\tbounds = L.bounds(bounds);\n\n\t\tvar min = this.min,\n\t\t max = this.max,\n\t\t min2 = bounds.min,\n\t\t max2 = bounds.max,\n\t\t xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\n\t\t yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\n\n\t\treturn xIntersects && yIntersects;\n\t},\n\n\tisValid: function () {\n\t\treturn !!(this.min && this.max);\n\t}\n};\n\nL.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[])\n\tif (!a || a instanceof L.Bounds) {\n\t\treturn a;\n\t}\n\treturn new L.Bounds(a, b);\n};\n\n\n/*\n * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix.\n */\n\nL.Transformation = function (a, b, c, d) {\n\tthis._a = a;\n\tthis._b = b;\n\tthis._c = c;\n\tthis._d = d;\n};\n\nL.Transformation.prototype = {\n\ttransform: function (point, scale) { // (Point, Number) -> Point\n\t\treturn this._transform(point.clone(), scale);\n\t},\n\n\t// destructive transform (faster)\n\t_transform: function (point, scale) {\n\t\tscale = scale || 1;\n\t\tpoint.x = scale * (this._a * point.x + this._b);\n\t\tpoint.y = scale * (this._c * point.y + this._d);\n\t\treturn point;\n\t},\n\n\tuntransform: function (point, scale) {\n\t\tscale = scale || 1;\n\t\treturn new L.Point(\n\t\t (point.x / scale - this._b) / this._a,\n\t\t (point.y / scale - this._d) / this._c);\n\t}\n};\n\n\n/*\n * L.DomUtil contains various utility functions for working with DOM.\n */\n\nL.DomUtil = {\n\tget: function (id) {\n\t\treturn (typeof id === 'string' ? document.getElementById(id) : id);\n\t},\n\n\tgetStyle: function (el, style) {\n\n\t\tvar value = el.style[style];\n\n\t\tif (!value && el.currentStyle) {\n\t\t\tvalue = el.currentStyle[style];\n\t\t}\n\n\t\tif ((!value || value === 'auto') && document.defaultView) {\n\t\t\tvar css = document.defaultView.getComputedStyle(el, null);\n\t\t\tvalue = css ? css[style] : null;\n\t\t}\n\n\t\treturn value === 'auto' ? null : value;\n\t},\n\n\tgetViewportOffset: function (element) {\n\n\t\tvar top = 0,\n\t\t left = 0,\n\t\t el = element,\n\t\t docBody = document.body,\n\t\t docEl = document.documentElement,\n\t\t pos;\n\n\t\tdo {\n\t\t\ttop += el.offsetTop || 0;\n\t\t\tleft += el.offsetLeft || 0;\n\n\t\t\t//add borders\n\t\t\ttop += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0;\n\t\t\tleft += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0;\n\n\t\t\tpos = L.DomUtil.getStyle(el, 'position');\n\n\t\t\tif (el.offsetParent === docBody && pos === 'absolute') { break; }\n\n\t\t\tif (pos === 'fixed') {\n\t\t\t\ttop += docBody.scrollTop || docEl.scrollTop || 0;\n\t\t\t\tleft += docBody.scrollLeft || docEl.scrollLeft || 0;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (pos === 'relative' && !el.offsetLeft) {\n\t\t\t\tvar width = L.DomUtil.getStyle(el, 'width'),\n\t\t\t\t maxWidth = L.DomUtil.getStyle(el, 'max-width'),\n\t\t\t\t r = el.getBoundingClientRect();\n\n\t\t\t\tif (width !== 'none' || maxWidth !== 'none') {\n\t\t\t\t\tleft += r.left + el.clientLeft;\n\t\t\t\t}\n\n\t\t\t\t//calculate full y offset since we're breaking out of the loop\n\t\t\t\ttop += r.top + (docBody.scrollTop || docEl.scrollTop || 0);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tel = el.offsetParent;\n\n\t\t} while (el);\n\n\t\tel = element;\n\n\t\tdo {\n\t\t\tif (el === docBody) { break; }\n\n\t\t\ttop -= el.scrollTop || 0;\n\t\t\tleft -= el.scrollLeft || 0;\n\n\t\t\tel = el.parentNode;\n\t\t} while (el);\n\n\t\treturn new L.Point(left, top);\n\t},\n\n\tdocumentIsLtr: function () {\n\t\tif (!L.DomUtil._docIsLtrCached) {\n\t\t\tL.DomUtil._docIsLtrCached = true;\n\t\t\tL.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr';\n\t\t}\n\t\treturn L.DomUtil._docIsLtr;\n\t},\n\n\tcreate: function (tagName, className, container) {\n\n\t\tvar el = document.createElement(tagName);\n\t\tel.className = className;\n\n\t\tif (container) {\n\t\t\tcontainer.appendChild(el);\n\t\t}\n\n\t\treturn el;\n\t},\n\n\thasClass: function (el, name) {\n\t\tif (el.classList !== undefined) {\n\t\t\treturn el.classList.contains(name);\n\t\t}\n\t\tvar className = L.DomUtil._getClass(el);\n\t\treturn className.length > 0 && new RegExp('(^|\\\\s)' + name + '(\\\\s|$)').test(className);\n\t},\n\n\taddClass: function (el, name) {\n\t\tif (el.classList !== undefined) {\n\t\t\tvar classes = L.Util.splitWords(name);\n\t\t\tfor (var i = 0, len = classes.length; i < len; i++) {\n\t\t\t\tel.classList.add(classes[i]);\n\t\t\t}\n\t\t} else if (!L.DomUtil.hasClass(el, name)) {\n\t\t\tvar className = L.DomUtil._getClass(el);\n\t\t\tL.DomUtil._setClass(el, (className ? className + ' ' : '') + name);\n\t\t}\n\t},\n\n\tremoveClass: function (el, name) {\n\t\tif (el.classList !== undefined) {\n\t\t\tel.classList.remove(name);\n\t\t} else {\n\t\t\tL.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' ')));\n\t\t}\n\t},\n\n\t_setClass: function (el, name) {\n\t\tif (el.className.baseVal === undefined) {\n\t\t\tel.className = name;\n\t\t} else {\n\t\t\t// in case of SVG element\n\t\t\tel.className.baseVal = name;\n\t\t}\n\t},\n\n\t_getClass: function (el) {\n\t\treturn el.className.baseVal === undefined ? el.className : el.className.baseVal;\n\t},\n\n\tsetOpacity: function (el, value) {\n\n\t\tif ('opacity' in el.style) {\n\t\t\tel.style.opacity = value;\n\n\t\t} else if ('filter' in el.style) {\n\n\t\t\tvar filter = false,\n\t\t\t filterName = 'DXImageTransform.Microsoft.Alpha';\n\n\t\t\t// filters collection throws an error if we try to retrieve a filter that doesn't exist\n\t\t\ttry {\n\t\t\t\tfilter = el.filters.item(filterName);\n\t\t\t} catch (e) {\n\t\t\t\t// don't set opacity to 1 if we haven't already set an opacity,\n\t\t\t\t// it isn't needed and breaks transparent pngs.\n\t\t\t\tif (value === 1) { return; }\n\t\t\t}\n\n\t\t\tvalue = Math.round(value * 100);\n\n\t\t\tif (filter) {\n\t\t\t\tfilter.Enabled = (value !== 100);\n\t\t\t\tfilter.Opacity = value;\n\t\t\t} else {\n\t\t\t\tel.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';\n\t\t\t}\n\t\t}\n\t},\n\n\ttestProp: function (props) {\n\n\t\tvar style = document.documentElement.style;\n\n\t\tfor (var i = 0; i < props.length; i++) {\n\t\t\tif (props[i] in style) {\n\t\t\t\treturn props[i];\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\tgetTranslateString: function (point) {\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\n\n\t\tvar is3d = L.Browser.webkit3d,\n\t\t open = 'translate' + (is3d ? '3d' : '') + '(',\n\t\t close = (is3d ? ',0' : '') + ')';\n\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\n\t},\n\n\tgetScaleString: function (scale, origin) {\n\n\t\tvar preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))),\n\t\t scaleStr = ' scale(' + scale + ') ';\n\n\t\treturn preTranslateStr + scaleStr;\n\t},\n\n\tsetPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean])\n\n\t\t// jshint camelcase: false\n\t\tel._leaflet_pos = point;\n\n\t\tif (!disable3D && L.Browser.any3d) {\n\t\t\tel.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point);\n\t\t} else {\n\t\t\tel.style.left = point.x + 'px';\n\t\t\tel.style.top = point.y + 'px';\n\t\t}\n\t},\n\n\tgetPosition: function (el) {\n\t\t// this method is only used for elements previously positioned using setPosition,\n\t\t// so it's safe to cache the position for performance\n\n\t\t// jshint camelcase: false\n\t\treturn el._leaflet_pos;\n\t}\n};\n\n\n// prefix style property names\n\nL.DomUtil.TRANSFORM = L.DomUtil.testProp(\n ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\n\n// webkitTransition comes first because some browser versions that drop vendor prefix don't do\n// the same for the transitionend event, in particular the Android 4.1 stock browser\n\nL.DomUtil.TRANSITION = L.DomUtil.testProp(\n ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\n\nL.DomUtil.TRANSITION_END =\n L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ?\n L.DomUtil.TRANSITION + 'End' : 'transitionend';\n\n(function () {\n if ('onselectstart' in document) {\n L.extend(L.DomUtil, {\n disableTextSelection: function () {\n L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);\n },\n\n enableTextSelection: function () {\n L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);\n }\n });\n } else {\n var userSelectProperty = L.DomUtil.testProp(\n ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);\n\n L.extend(L.DomUtil, {\n disableTextSelection: function () {\n if (userSelectProperty) {\n var style = document.documentElement.style;\n this._userSelect = style[userSelectProperty];\n style[userSelectProperty] = 'none';\n }\n },\n\n enableTextSelection: function () {\n if (userSelectProperty) {\n document.documentElement.style[userSelectProperty] = this._userSelect;\n delete this._userSelect;\n }\n }\n });\n }\n\n\tL.extend(L.DomUtil, {\n\t\tdisableImageDrag: function () {\n\t\t\tL.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);\n\t\t},\n\n\t\tenableImageDrag: function () {\n\t\t\tL.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);\n\t\t}\n\t});\n})();\n\n\n/*\n * L.LatLng represents a geographical point with latitude and longitude coordinates.\n */\n\nL.LatLng = function (lat, lng, alt) { // (Number, Number, Number)\n\tlat = parseFloat(lat);\n\tlng = parseFloat(lng);\n\n\tif (isNaN(lat) || isNaN(lng)) {\n\t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\n\t}\n\n\tthis.lat = lat;\n\tthis.lng = lng;\n\n\tif (alt !== undefined) {\n\t\tthis.alt = parseFloat(alt);\n\t}\n};\n\nL.extend(L.LatLng, {\n\tDEG_TO_RAD: Math.PI / 180,\n\tRAD_TO_DEG: 180 / Math.PI,\n\tMAX_MARGIN: 1.0E-9 // max margin of error for the \"equals\" check\n});\n\nL.LatLng.prototype = {\n\tequals: function (obj) { // (LatLng) -> Boolean\n\t\tif (!obj) { return false; }\n\n\t\tobj = L.latLng(obj);\n\n\t\tvar margin = Math.max(\n\t\t Math.abs(this.lat - obj.lat),\n\t\t Math.abs(this.lng - obj.lng));\n\n\t\treturn margin <= L.LatLng.MAX_MARGIN;\n\t},\n\n\ttoString: function (precision) { // (Number) -> String\n\t\treturn 'LatLng(' +\n\t\t L.Util.formatNum(this.lat, precision) + ', ' +\n\t\t L.Util.formatNum(this.lng, precision) + ')';\n\t},\n\n\t// Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula\n\t// TODO move to projection code, LatLng shouldn't know about Earth\n\tdistanceTo: function (other) { // (LatLng) -> Number\n\t\tother = L.latLng(other);\n\n\t\tvar R = 6378137, // earth radius in meters\n\t\t d2r = L.LatLng.DEG_TO_RAD,\n\t\t dLat = (other.lat - this.lat) * d2r,\n\t\t dLon = (other.lng - this.lng) * d2r,\n\t\t lat1 = this.lat * d2r,\n\t\t lat2 = other.lat * d2r,\n\t\t sin1 = Math.sin(dLat / 2),\n\t\t sin2 = Math.sin(dLon / 2);\n\n\t\tvar a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2);\n\n\t\treturn R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\t},\n\n\twrap: function (a, b) { // (Number, Number) -> LatLng\n\t\tvar lng = this.lng;\n\n\t\ta = a || -180;\n\t\tb = b || 180;\n\n\t\tlng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a);\n\n\t\treturn new L.LatLng(this.lat, lng);\n\t}\n};\n\nL.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number)\n\tif (a instanceof L.LatLng) {\n\t\treturn a;\n\t}\n\tif (L.Util.isArray(a)) {\n\t\tif (typeof a[0] === 'number' || typeof a[0] === 'string') {\n\t\t\treturn new L.LatLng(a[0], a[1], a[2]);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (a === undefined || a === null) {\n\t\treturn a;\n\t}\n\tif (typeof a === 'object' && 'lat' in a) {\n\t\treturn new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon);\n\t}\n\tif (b === undefined) {\n\t\treturn null;\n\t}\n\treturn new L.LatLng(a, b);\n};\n\n\n\n/*\n * L.LatLngBounds represents a rectangular area on the map in geographical coordinates.\n */\n\nL.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[])\n\tif (!southWest) { return; }\n\n\tvar latlngs = northEast ? [southWest, northEast] : southWest;\n\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\n\t\tthis.extend(latlngs[i]);\n\t}\n};\n\nL.LatLngBounds.prototype = {\n\t// extend the bounds to contain the given point or bounds\n\textend: function (obj) { // (LatLng) or (LatLngBounds)\n\t\tif (!obj) { return this; }\n\n\t\tvar latLng = L.latLng(obj);\n\t\tif (latLng !== null) {\n\t\t\tobj = latLng;\n\t\t} else {\n\t\t\tobj = L.latLngBounds(obj);\n\t\t}\n\n\t\tif (obj instanceof L.LatLng) {\n\t\t\tif (!this._southWest && !this._northEast) {\n\t\t\t\tthis._southWest = new L.LatLng(obj.lat, obj.lng);\n\t\t\t\tthis._northEast = new L.LatLng(obj.lat, obj.lng);\n\t\t\t} else {\n\t\t\t\tthis._southWest.lat = Math.min(obj.lat, this._southWest.lat);\n\t\t\t\tthis._southWest.lng = Math.min(obj.lng, this._southWest.lng);\n\n\t\t\t\tthis._northEast.lat = Math.max(obj.lat, this._northEast.lat);\n\t\t\t\tthis._northEast.lng = Math.max(obj.lng, this._northEast.lng);\n\t\t\t}\n\t\t} else if (obj instanceof L.LatLngBounds) {\n\t\t\tthis.extend(obj._southWest);\n\t\t\tthis.extend(obj._northEast);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// extend the bounds by a percentage\n\tpad: function (bufferRatio) { // (Number) -> LatLngBounds\n\t\tvar sw = this._southWest,\n\t\t ne = this._northEast,\n\t\t heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\n\t\t widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\n\n\t\treturn new L.LatLngBounds(\n\t\t new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\n\t\t new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\n\t},\n\n\tgetCenter: function () { // -> LatLng\n\t\treturn new L.LatLng(\n\t\t (this._southWest.lat + this._northEast.lat) / 2,\n\t\t (this._southWest.lng + this._northEast.lng) / 2);\n\t},\n\n\tgetSouthWest: function () {\n\t\treturn this._southWest;\n\t},\n\n\tgetNorthEast: function () {\n\t\treturn this._northEast;\n\t},\n\n\tgetNorthWest: function () {\n\t\treturn new L.LatLng(this.getNorth(), this.getWest());\n\t},\n\n\tgetSouthEast: function () {\n\t\treturn new L.LatLng(this.getSouth(), this.getEast());\n\t},\n\n\tgetWest: function () {\n\t\treturn this._southWest.lng;\n\t},\n\n\tgetSouth: function () {\n\t\treturn this._southWest.lat;\n\t},\n\n\tgetEast: function () {\n\t\treturn this._northEast.lng;\n\t},\n\n\tgetNorth: function () {\n\t\treturn this._northEast.lat;\n\t},\n\n\tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.LatLng) {\n\t\t\tobj = L.latLng(obj);\n\t\t} else {\n\t\t\tobj = L.latLngBounds(obj);\n\t\t}\n\n\t\tvar sw = this._southWest,\n\t\t ne = this._northEast,\n\t\t sw2, ne2;\n\n\t\tif (obj instanceof L.LatLngBounds) {\n\t\t\tsw2 = obj.getSouthWest();\n\t\t\tne2 = obj.getNorthEast();\n\t\t} else {\n\t\t\tsw2 = ne2 = obj;\n\t\t}\n\n\t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\n\t\t (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\n\t},\n\n\tintersects: function (bounds) { // (LatLngBounds)\n\t\tbounds = L.latLngBounds(bounds);\n\n\t\tvar sw = this._southWest,\n\t\t ne = this._northEast,\n\t\t sw2 = bounds.getSouthWest(),\n\t\t ne2 = bounds.getNorthEast(),\n\n\t\t latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\n\t\t lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\n\n\t\treturn latIntersects && lngIntersects;\n\t},\n\n\ttoBBoxString: function () {\n\t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\n\t},\n\n\tequals: function (bounds) { // (LatLngBounds)\n\t\tif (!bounds) { return false; }\n\n\t\tbounds = L.latLngBounds(bounds);\n\n\t\treturn this._southWest.equals(bounds.getSouthWest()) &&\n\t\t this._northEast.equals(bounds.getNorthEast());\n\t},\n\n\tisValid: function () {\n\t\treturn !!(this._southWest && this._northEast);\n\t}\n};\n\n//TODO International date line?\n\nL.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng)\n\tif (!a || a instanceof L.LatLngBounds) {\n\t\treturn a;\n\t}\n\treturn new L.LatLngBounds(a, b);\n};\n\n\n/*\n * L.Projection contains various geographical projections used by CRS classes.\n */\n\nL.Projection = {};\n\n\n/*\n * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default.\n */\n\nL.Projection.SphericalMercator = {\n\tMAX_LATITUDE: 85.0511287798,\n\n\tproject: function (latlng) { // (LatLng) -> Point\n\t\tvar d = L.LatLng.DEG_TO_RAD,\n\t\t max = this.MAX_LATITUDE,\n\t\t lat = Math.max(Math.min(max, latlng.lat), -max),\n\t\t x = latlng.lng * d,\n\t\t y = lat * d;\n\n\t\ty = Math.log(Math.tan((Math.PI / 4) + (y / 2)));\n\n\t\treturn new L.Point(x, y);\n\t},\n\n\tunproject: function (point) { // (Point, Boolean) -> LatLng\n\t\tvar d = L.LatLng.RAD_TO_DEG,\n\t\t lng = point.x * d,\n\t\t lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;\n\n\t\treturn new L.LatLng(lat, lng);\n\t}\n};\n\n\n/*\n * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple.\n */\n\nL.Projection.LonLat = {\n\tproject: function (latlng) {\n\t\treturn new L.Point(latlng.lng, latlng.lat);\n\t},\n\n\tunproject: function (point) {\n\t\treturn new L.LatLng(point.y, point.x);\n\t}\n};\n\n\n/*\n * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet.\n */\n\nL.CRS = {\n\tlatLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point\n\t\tvar projectedPoint = this.projection.project(latlng),\n\t\t scale = this.scale(zoom);\n\n\t\treturn this.transformation._transform(projectedPoint, scale);\n\t},\n\n\tpointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng\n\t\tvar scale = this.scale(zoom),\n\t\t untransformedPoint = this.transformation.untransform(point, scale);\n\n\t\treturn this.projection.unproject(untransformedPoint);\n\t},\n\n\tproject: function (latlng) {\n\t\treturn this.projection.project(latlng);\n\t},\n\n\tscale: function (zoom) {\n\t\treturn 256 * Math.pow(2, zoom);\n\t},\n\n\tgetSize: function (zoom) {\n\t\tvar s = this.scale(zoom);\n\t\treturn L.point(s, s);\n\t}\n};\n\n\n/*\n * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps.\n */\n\nL.CRS.Simple = L.extend({}, L.CRS, {\n\tprojection: L.Projection.LonLat,\n\ttransformation: new L.Transformation(1, 0, -1, 0),\n\n\tscale: function (zoom) {\n\t\treturn Math.pow(2, zoom);\n\t}\n});\n\n\n/*\n * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping\n * and is used by Leaflet by default.\n */\n\nL.CRS.EPSG3857 = L.extend({}, L.CRS, {\n\tcode: 'EPSG:3857',\n\n\tprojection: L.Projection.SphericalMercator,\n\ttransformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5),\n\n\tproject: function (latlng) { // (LatLng) -> Point\n\t\tvar projectedPoint = this.projection.project(latlng),\n\t\t earthRadius = 6378137;\n\t\treturn projectedPoint.multiplyBy(earthRadius);\n\t}\n});\n\nL.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {\n\tcode: 'EPSG:900913'\n});\n\n\n/*\n * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n */\n\nL.CRS.EPSG4326 = L.extend({}, L.CRS, {\n\tcode: 'EPSG:4326',\n\n\tprojection: L.Projection.LonLat,\n\ttransformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5)\n});\n\n\n/*\n * L.Map is the central class of the API - it is used to create a map.\n */\n\nL.Map = L.Class.extend({\n\n\tincludes: L.Mixin.Events,\n\n\toptions: {\n\t\tcrs: L.CRS.EPSG3857,\n\n\t\t/*\n\t\tcenter: LatLng,\n\t\tzoom: Number,\n\t\tlayers: Array,\n\t\t*/\n\n\t\tfadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,\n\t\ttrackResize: true,\n\t\tmarkerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d\n\t},\n\n\tinitialize: function (id, options) { // (HTMLElement or String, Object)\n\t\toptions = L.setOptions(this, options);\n\n\n\t\tthis._initContainer(id);\n\t\tthis._initLayout();\n\n\t\t// hack for https://github.com/Leaflet/Leaflet/issues/1980\n\t\tthis._onResize = L.bind(this._onResize, this);\n\n\t\tthis._initEvents();\n\n\t\tif (options.maxBounds) {\n\t\t\tthis.setMaxBounds(options.maxBounds);\n\t\t}\n\n\t\tif (options.center && options.zoom !== undefined) {\n\t\t\tthis.setView(L.latLng(options.center), options.zoom, {reset: true});\n\t\t}\n\n\t\tthis._handlers = [];\n\n\t\tthis._layers = {};\n\t\tthis._zoomBoundLayers = {};\n\t\tthis._tileLayersNum = 0;\n\n\t\tthis.callInitHooks();\n\n\t\tthis._addLayers(options.layers);\n\t},\n\n\n\t// public methods that modify map state\n\n\t// replaced by animation-powered implementation in Map.PanAnimation.js\n\tsetView: function (center, zoom) {\n\t\tzoom = zoom === undefined ? this.getZoom() : zoom;\n\t\tthis._resetView(L.latLng(center), this._limitZoom(zoom));\n\t\treturn this;\n\t},\n\n\tsetZoom: function (zoom, options) {\n\t\tif (!this._loaded) {\n\t\t\tthis._zoom = this._limitZoom(zoom);\n\t\t\treturn this;\n\t\t}\n\t\treturn this.setView(this.getCenter(), zoom, {zoom: options});\n\t},\n\n\tzoomIn: function (delta, options) {\n\t\treturn this.setZoom(this._zoom + (delta || 1), options);\n\t},\n\n\tzoomOut: function (delta, options) {\n\t\treturn this.setZoom(this._zoom - (delta || 1), options);\n\t},\n\n\tsetZoomAround: function (latlng, zoom, options) {\n\t\tvar scale = this.getZoomScale(zoom),\n\t\t viewHalf = this.getSize().divideBy(2),\n\t\t containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),\n\n\t\t centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),\n\t\t newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));\n\n\t\treturn this.setView(newCenter, zoom, {zoom: options});\n\t},\n\n\tfitBounds: function (bounds, options) {\n\n\t\toptions = options || {};\n\t\tbounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);\n\n\t\tvar paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),\n\t\t paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),\n\n\t\t zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));\n\n\t\tzoom = (options.maxZoom) ? Math.min(options.maxZoom, zoom) : zoom;\n\n\t\tvar paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),\n\n\t\t swPoint = this.project(bounds.getSouthWest(), zoom),\n\t\t nePoint = this.project(bounds.getNorthEast(), zoom),\n\t\t center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);\n\n\t\treturn this.setView(center, zoom, options);\n\t},\n\n\tfitWorld: function (options) {\n\t\treturn this.fitBounds([[-90, -180], [90, 180]], options);\n\t},\n\n\tpanTo: function (center, options) { // (LatLng)\n\t\treturn this.setView(center, this._zoom, {pan: options});\n\t},\n\n\tpanBy: function (offset) { // (Point)\n\t\t// replaced with animated panBy in Map.PanAnimation.js\n\t\tthis.fire('movestart');\n\n\t\tthis._rawPanBy(L.point(offset));\n\n\t\tthis.fire('move');\n\t\treturn this.fire('moveend');\n\t},\n\n\tsetMaxBounds: function (bounds) {\n\t\tbounds = L.latLngBounds(bounds);\n\n\t\tthis.options.maxBounds = bounds;\n\n\t\tif (!bounds) {\n\t\t\treturn this.off('moveend', this._panInsideMaxBounds, this);\n\t\t}\n\n\t\tif (this._loaded) {\n\t\t\tthis._panInsideMaxBounds();\n\t\t}\n\n\t\treturn this.on('moveend', this._panInsideMaxBounds, this);\n\t},\n\n\tpanInsideBounds: function (bounds, options) {\n\t\tvar center = this.getCenter(),\n\t\t\tnewCenter = this._limitCenter(center, this._zoom, bounds);\n\n\t\tif (center.equals(newCenter)) { return this; }\n\n\t\treturn this.panTo(newCenter, options);\n\t},\n\n\taddLayer: function (layer) {\n\t\t// TODO method is too big, refactor\n\n\t\tvar id = L.stamp(layer);\n\n\t\tif (this._layers[id]) { return this; }\n\n\t\tthis._layers[id] = layer;\n\n\t\t// TODO getMaxZoom, getMinZoom in ILayer (instead of options)\n\t\tif (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) {\n\t\t\tthis._zoomBoundLayers[id] = layer;\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\n\t\t// TODO looks ugly, refactor!!!\n\t\tif (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {\n\t\t\tthis._tileLayersNum++;\n\t\t\tthis._tileLayersToLoad++;\n\t\t\tlayer.on('load', this._onTileLayerLoad, this);\n\t\t}\n\n\t\tif (this._loaded) {\n\t\t\tthis._layerAdd(layer);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveLayer: function (layer) {\n\t\tvar id = L.stamp(layer);\n\n\t\tif (!this._layers[id]) { return this; }\n\n\t\tif (this._loaded) {\n\t\t\tlayer.onRemove(this);\n\t\t}\n\n\t\tdelete this._layers[id];\n\n\t\tif (this._loaded) {\n\t\t\tthis.fire('layerremove', {layer: layer});\n\t\t}\n\n\t\tif (this._zoomBoundLayers[id]) {\n\t\t\tdelete this._zoomBoundLayers[id];\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\n\t\t// TODO looks ugly, refactor\n\t\tif (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {\n\t\t\tthis._tileLayersNum--;\n\t\t\tthis._tileLayersToLoad--;\n\t\t\tlayer.off('load', this._onTileLayerLoad, this);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\thasLayer: function (layer) {\n\t\tif (!layer) { return false; }\n\n\t\treturn (L.stamp(layer) in this._layers);\n\t},\n\n\teachLayer: function (method, context) {\n\t\tfor (var i in this._layers) {\n\t\t\tmethod.call(context, this._layers[i]);\n\t\t}\n\t\treturn this;\n\t},\n\n\tinvalidateSize: function (options) {\n\t\tif (!this._loaded) { return this; }\n\n\t\toptions = L.extend({\n\t\t\tanimate: false,\n\t\t\tpan: true\n\t\t}, options === true ? {animate: true} : options);\n\n\t\tvar oldSize = this.getSize();\n\t\tthis._sizeChanged = true;\n\t\tthis._initialCenter = null;\n\n\t\tvar newSize = this.getSize(),\n\t\t oldCenter = oldSize.divideBy(2).round(),\n\t\t newCenter = newSize.divideBy(2).round(),\n\t\t offset = oldCenter.subtract(newCenter);\n\n\t\tif (!offset.x && !offset.y) { return this; }\n\n\t\tif (options.animate && options.pan) {\n\t\t\tthis.panBy(offset);\n\n\t\t} else {\n\t\t\tif (options.pan) {\n\t\t\t\tthis._rawPanBy(offset);\n\t\t\t}\n\n\t\t\tthis.fire('move');\n\n\t\t\tif (options.debounceMoveend) {\n\t\t\t\tclearTimeout(this._sizeTimer);\n\t\t\t\tthis._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);\n\t\t\t} else {\n\t\t\t\tthis.fire('moveend');\n\t\t\t}\n\t\t}\n\n\t\treturn this.fire('resize', {\n\t\t\toldSize: oldSize,\n\t\t\tnewSize: newSize\n\t\t});\n\t},\n\n\t// TODO handler.addTo\n\taddHandler: function (name, HandlerClass) {\n\t\tif (!HandlerClass) { return this; }\n\n\t\tvar handler = this[name] = new HandlerClass(this);\n\n\t\tthis._handlers.push(handler);\n\n\t\tif (this.options[name]) {\n\t\t\thandler.enable();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremove: function () {\n\t\tif (this._loaded) {\n\t\t\tthis.fire('unload');\n\t\t}\n\n\t\tthis._initEvents('off');\n\n\t\ttry {\n\t\t\t// throws error in IE6-8\n\t\t\tdelete this._container._leaflet;\n\t\t} catch (e) {\n\t\t\tthis._container._leaflet = undefined;\n\t\t}\n\n\t\tthis._clearPanes();\n\t\tif (this._clearControlPos) {\n\t\t\tthis._clearControlPos();\n\t\t}\n\n\t\tthis._clearHandlers();\n\n\t\treturn this;\n\t},\n\n\n\t// public methods for getting map state\n\n\tgetCenter: function () { // (Boolean) -> LatLng\n\t\tthis._checkIfLoaded();\n\n\t\tif (this._initialCenter && !this._moved()) {\n\t\t\treturn this._initialCenter;\n\t\t}\n\t\treturn this.layerPointToLatLng(this._getCenterLayerPoint());\n\t},\n\n\tgetZoom: function () {\n\t\treturn this._zoom;\n\t},\n\n\tgetBounds: function () {\n\t\tvar bounds = this.getPixelBounds(),\n\t\t sw = this.unproject(bounds.getBottomLeft()),\n\t\t ne = this.unproject(bounds.getTopRight());\n\n\t\treturn new L.LatLngBounds(sw, ne);\n\t},\n\n\tgetMinZoom: function () {\n\t\treturn this.options.minZoom === undefined ?\n\t\t\t(this._layersMinZoom === undefined ? 0 : this._layersMinZoom) :\n\t\t\tthis.options.minZoom;\n\t},\n\n\tgetMaxZoom: function () {\n\t\treturn this.options.maxZoom === undefined ?\n\t\t\t(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :\n\t\t\tthis.options.maxZoom;\n\t},\n\n\tgetBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number\n\t\tbounds = L.latLngBounds(bounds);\n\n\t\tvar zoom = this.getMinZoom() - (inside ? 1 : 0),\n\t\t maxZoom = this.getMaxZoom(),\n\t\t size = this.getSize(),\n\n\t\t nw = bounds.getNorthWest(),\n\t\t se = bounds.getSouthEast(),\n\n\t\t zoomNotFound = true,\n\t\t boundsSize;\n\n\t\tpadding = L.point(padding || [0, 0]);\n\n\t\tdo {\n\t\t\tzoom++;\n\t\t\tboundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding);\n\t\t\tzoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y;\n\n\t\t} while (zoomNotFound && zoom <= maxZoom);\n\n\t\tif (zoomNotFound && inside) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn inside ? zoom : zoom - 1;\n\t},\n\n\tgetSize: function () {\n\t\tif (!this._size || this._sizeChanged) {\n\t\t\tthis._size = new L.Point(\n\t\t\t\tthis._container.clientWidth,\n\t\t\t\tthis._container.clientHeight);\n\n\t\t\tthis._sizeChanged = false;\n\t\t}\n\t\treturn this._size.clone();\n\t},\n\n\tgetPixelBounds: function () {\n\t\tvar topLeftPoint = this._getTopLeftPoint();\n\t\treturn new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));\n\t},\n\n\tgetPixelOrigin: function () {\n\t\tthis._checkIfLoaded();\n\t\treturn this._initialTopLeftPoint;\n\t},\n\n\tgetPanes: function () {\n\t\treturn this._panes;\n\t},\n\n\tgetContainer: function () {\n\t\treturn this._container;\n\t},\n\n\n\t// TODO replace with universal implementation after refactoring projections\n\n\tgetZoomScale: function (toZoom) {\n\t\tvar crs = this.options.crs;\n\t\treturn crs.scale(toZoom) / crs.scale(this._zoom);\n\t},\n\n\tgetScaleZoom: function (scale) {\n\t\treturn this._zoom + (Math.log(scale) / Math.LN2);\n\t},\n\n\n\t// conversion methods\n\n\tproject: function (latlng, zoom) { // (LatLng[, Number]) -> Point\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\n\t\treturn this.options.crs.latLngToPoint(L.latLng(latlng), zoom);\n\t},\n\n\tunproject: function (point, zoom) { // (Point[, Number]) -> LatLng\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\n\t\treturn this.options.crs.pointToLatLng(L.point(point), zoom);\n\t},\n\n\tlayerPointToLatLng: function (point) { // (Point)\n\t\tvar projectedPoint = L.point(point).add(this.getPixelOrigin());\n\t\treturn this.unproject(projectedPoint);\n\t},\n\n\tlatLngToLayerPoint: function (latlng) { // (LatLng)\n\t\tvar projectedPoint = this.project(L.latLng(latlng))._round();\n\t\treturn projectedPoint._subtract(this.getPixelOrigin());\n\t},\n\n\tcontainerPointToLayerPoint: function (point) { // (Point)\n\t\treturn L.point(point).subtract(this._getMapPanePos());\n\t},\n\n\tlayerPointToContainerPoint: function (point) { // (Point)\n\t\treturn L.point(point).add(this._getMapPanePos());\n\t},\n\n\tcontainerPointToLatLng: function (point) {\n\t\tvar layerPoint = this.containerPointToLayerPoint(L.point(point));\n\t\treturn this.layerPointToLatLng(layerPoint);\n\t},\n\n\tlatLngToContainerPoint: function (latlng) {\n\t\treturn this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));\n\t},\n\n\tmouseEventToContainerPoint: function (e) { // (MouseEvent)\n\t\treturn L.DomEvent.getMousePosition(e, this._container);\n\t},\n\n\tmouseEventToLayerPoint: function (e) { // (MouseEvent)\n\t\treturn this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));\n\t},\n\n\tmouseEventToLatLng: function (e) { // (MouseEvent)\n\t\treturn this.layerPointToLatLng(this.mouseEventToLayerPoint(e));\n\t},\n\n\n\t// map initialization methods\n\n\t_initContainer: function (id) {\n\t\tvar container = this._container = L.DomUtil.get(id);\n\n\t\tif (!container) {\n\t\t\tthrow new Error('Map container not found.');\n\t\t} else if (container._leaflet) {\n\t\t\tthrow new Error('Map container is already initialized.');\n\t\t}\n\n\t\tcontainer._leaflet = true;\n\t},\n\n\t_initLayout: function () {\n\t\tvar container = this._container;\n\n\t\tL.DomUtil.addClass(container, 'leaflet-container' +\n\t\t\t(L.Browser.touch ? ' leaflet-touch' : '') +\n\t\t\t(L.Browser.retina ? ' leaflet-retina' : '') +\n\t\t\t(L.Browser.ielt9 ? ' leaflet-oldie' : '') +\n\t\t\t(this.options.fadeAnimation ? ' leaflet-fade-anim' : ''));\n\n\t\tvar position = L.DomUtil.getStyle(container, 'position');\n\n\t\tif (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {\n\t\t\tcontainer.style.position = 'relative';\n\t\t}\n\n\t\tthis._initPanes();\n\n\t\tif (this._initControlPos) {\n\t\t\tthis._initControlPos();\n\t\t}\n\t},\n\n\t_initPanes: function () {\n\t\tvar panes = this._panes = {};\n\n\t\tthis._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container);\n\n\t\tthis._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane);\n\t\tpanes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane);\n\t\tpanes.shadowPane = this._createPane('leaflet-shadow-pane');\n\t\tpanes.overlayPane = this._createPane('leaflet-overlay-pane');\n\t\tpanes.markerPane = this._createPane('leaflet-marker-pane');\n\t\tpanes.popupPane = this._createPane('leaflet-popup-pane');\n\n\t\tvar zoomHide = ' leaflet-zoom-hide';\n\n\t\tif (!this.options.markerZoomAnimation) {\n\t\t\tL.DomUtil.addClass(panes.markerPane, zoomHide);\n\t\t\tL.DomUtil.addClass(panes.shadowPane, zoomHide);\n\t\t\tL.DomUtil.addClass(panes.popupPane, zoomHide);\n\t\t}\n\t},\n\n\t_createPane: function (className, container) {\n\t\treturn L.DomUtil.create('div', className, container || this._panes.objectsPane);\n\t},\n\n\t_clearPanes: function () {\n\t\tthis._container.removeChild(this._mapPane);\n\t},\n\n\t_addLayers: function (layers) {\n\t\tlayers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];\n\n\t\tfor (var i = 0, len = layers.length; i < len; i++) {\n\t\t\tthis.addLayer(layers[i]);\n\t\t}\n\t},\n\n\n\t// private methods that modify map state\n\n\t_resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {\n\n\t\tvar zoomChanged = (this._zoom !== zoom);\n\n\t\tif (!afterZoomAnim) {\n\t\t\tthis.fire('movestart');\n\n\t\t\tif (zoomChanged) {\n\t\t\t\tthis.fire('zoomstart');\n\t\t\t}\n\t\t}\n\n\t\tthis._zoom = zoom;\n\t\tthis._initialCenter = center;\n\n\t\tthis._initialTopLeftPoint = this._getNewTopLeftPoint(center);\n\n\t\tif (!preserveMapOffset) {\n\t\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\n\t\t} else {\n\t\t\tthis._initialTopLeftPoint._add(this._getMapPanePos());\n\t\t}\n\n\t\tthis._tileLayersToLoad = this._tileLayersNum;\n\n\t\tvar loading = !this._loaded;\n\t\tthis._loaded = true;\n\n\t\tthis.fire('viewreset', {hard: !preserveMapOffset});\n\n\t\tif (loading) {\n\t\t\tthis.fire('load');\n\t\t\tthis.eachLayer(this._layerAdd, this);\n\t\t}\n\n\t\tthis.fire('move');\n\n\t\tif (zoomChanged || afterZoomAnim) {\n\t\t\tthis.fire('zoomend');\n\t\t}\n\n\t\tthis.fire('moveend', {hard: !preserveMapOffset});\n\t},\n\n\t_rawPanBy: function (offset) {\n\t\tL.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));\n\t},\n\n\t_getZoomSpan: function () {\n\t\treturn this.getMaxZoom() - this.getMinZoom();\n\t},\n\n\t_updateZoomLevels: function () {\n\t\tvar i,\n\t\t\tminZoom = Infinity,\n\t\t\tmaxZoom = -Infinity,\n\t\t\toldZoomSpan = this._getZoomSpan();\n\n\t\tfor (i in this._zoomBoundLayers) {\n\t\t\tvar layer = this._zoomBoundLayers[i];\n\t\t\tif (!isNaN(layer.options.minZoom)) {\n\t\t\t\tminZoom = Math.min(minZoom, layer.options.minZoom);\n\t\t\t}\n\t\t\tif (!isNaN(layer.options.maxZoom)) {\n\t\t\t\tmaxZoom = Math.max(maxZoom, layer.options.maxZoom);\n\t\t\t}\n\t\t}\n\n\t\tif (i === undefined) { // we have no tilelayers\n\t\t\tthis._layersMaxZoom = this._layersMinZoom = undefined;\n\t\t} else {\n\t\t\tthis._layersMaxZoom = maxZoom;\n\t\t\tthis._layersMinZoom = minZoom;\n\t\t}\n\n\t\tif (oldZoomSpan !== this._getZoomSpan()) {\n\t\t\tthis.fire('zoomlevelschange');\n\t\t}\n\t},\n\n\t_panInsideMaxBounds: function () {\n\t\tthis.panInsideBounds(this.options.maxBounds);\n\t},\n\n\t_checkIfLoaded: function () {\n\t\tif (!this._loaded) {\n\t\t\tthrow new Error('Set map center and zoom first.');\n\t\t}\n\t},\n\n\t// map events\n\n\t_initEvents: function (onOff) {\n\t\tif (!L.DomEvent) { return; }\n\n\t\tonOff = onOff || 'on';\n\n\t\tL.DomEvent[onOff](this._container, 'click', this._onMouseClick, this);\n\n\t\tvar events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter',\n\t\t 'mouseleave', 'mousemove', 'contextmenu'],\n\t\t i, len;\n\n\t\tfor (i = 0, len = events.length; i < len; i++) {\n\t\t\tL.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this);\n\t\t}\n\n\t\tif (this.options.trackResize) {\n\t\t\tL.DomEvent[onOff](window, 'resize', this._onResize, this);\n\t\t}\n\t},\n\n\t_onResize: function () {\n\t\tL.Util.cancelAnimFrame(this._resizeRequest);\n\t\tthis._resizeRequest = L.Util.requestAnimFrame(\n\t\t function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container);\n\t},\n\n\t_onMouseClick: function (e) {\n\t\tif (!this._loaded || (!e._simulated &&\n\t\t ((this.dragging && this.dragging.moved()) ||\n\t\t (this.boxZoom && this.boxZoom.moved()))) ||\n\t\t L.DomEvent._skipped(e)) { return; }\n\n\t\tthis.fire('preclick');\n\t\tthis._fireMouseEvent(e);\n\t},\n\n\t_fireMouseEvent: function (e) {\n\t\tif (!this._loaded || L.DomEvent._skipped(e)) { return; }\n\n\t\tvar type = e.type;\n\n\t\ttype = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type));\n\n\t\tif (!this.hasEventListeners(type)) { return; }\n\n\t\tif (type === 'contextmenu') {\n\t\t\tL.DomEvent.preventDefault(e);\n\t\t}\n\n\t\tvar containerPoint = this.mouseEventToContainerPoint(e),\n\t\t layerPoint = this.containerPointToLayerPoint(containerPoint),\n\t\t latlng = this.layerPointToLatLng(layerPoint);\n\n\t\tthis.fire(type, {\n\t\t\tlatlng: latlng,\n\t\t\tlayerPoint: layerPoint,\n\t\t\tcontainerPoint: containerPoint,\n\t\t\toriginalEvent: e\n\t\t});\n\t},\n\n\t_onTileLayerLoad: function () {\n\t\tthis._tileLayersToLoad--;\n\t\tif (this._tileLayersNum && !this._tileLayersToLoad) {\n\t\t\tthis.fire('tilelayersload');\n\t\t}\n\t},\n\n\t_clearHandlers: function () {\n\t\tfor (var i = 0, len = this._handlers.length; i < len; i++) {\n\t\t\tthis._handlers[i].disable();\n\t\t}\n\t},\n\n\twhenReady: function (callback, context) {\n\t\tif (this._loaded) {\n\t\t\tcallback.call(context || this, this);\n\t\t} else {\n\t\t\tthis.on('load', callback, context);\n\t\t}\n\t\treturn this;\n\t},\n\n\t_layerAdd: function (layer) {\n\t\tlayer.onAdd(this);\n\t\tthis.fire('layeradd', {layer: layer});\n\t},\n\n\n\t// private methods for getting map state\n\n\t_getMapPanePos: function () {\n\t\treturn L.DomUtil.getPosition(this._mapPane);\n\t},\n\n\t_moved: function () {\n\t\tvar pos = this._getMapPanePos();\n\t\treturn pos && !pos.equals([0, 0]);\n\t},\n\n\t_getTopLeftPoint: function () {\n\t\treturn this.getPixelOrigin().subtract(this._getMapPanePos());\n\t},\n\n\t_getNewTopLeftPoint: function (center, zoom) {\n\t\tvar viewHalf = this.getSize()._divideBy(2);\n\t\t// TODO round on display, not calculation to increase precision?\n\t\treturn this.project(center, zoom)._subtract(viewHalf)._round();\n\t},\n\n\t_latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {\n\t\tvar topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());\n\t\treturn this.project(latlng, newZoom)._subtract(topLeft);\n\t},\n\n\t// layer point of the current center\n\t_getCenterLayerPoint: function () {\n\t\treturn this.containerPointToLayerPoint(this.getSize()._divideBy(2));\n\t},\n\n\t// offset of the specified place to the current center in pixels\n\t_getCenterOffset: function (latlng) {\n\t\treturn this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());\n\t},\n\n\t// adjust center for view to get inside bounds\n\t_limitCenter: function (center, zoom, bounds) {\n\n\t\tif (!bounds) { return center; }\n\n\t\tvar centerPoint = this.project(center, zoom),\n\t\t viewHalf = this.getSize().divideBy(2),\n\t\t viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),\n\t\t offset = this._getBoundsOffset(viewBounds, bounds, zoom);\n\n\t\treturn this.unproject(centerPoint.add(offset), zoom);\n\t},\n\n\t// adjust offset for view to get inside bounds\n\t_limitOffset: function (offset, bounds) {\n\t\tif (!bounds) { return offset; }\n\n\t\tvar viewBounds = this.getPixelBounds(),\n\t\t newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));\n\n\t\treturn offset.add(this._getBoundsOffset(newBounds, bounds));\n\t},\n\n\t// returns offset needed for pxBounds to get inside maxBounds at a specified zoom\n\t_getBoundsOffset: function (pxBounds, maxBounds, zoom) {\n\t\tvar nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min),\n\t\t seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max),\n\n\t\t dx = this._rebound(nwOffset.x, -seOffset.x),\n\t\t dy = this._rebound(nwOffset.y, -seOffset.y);\n\n\t\treturn new L.Point(dx, dy);\n\t},\n\n\t_rebound: function (left, right) {\n\t\treturn left + right > 0 ?\n\t\t\tMath.round(left - right) / 2 :\n\t\t\tMath.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));\n\t},\n\n\t_limitZoom: function (zoom) {\n\t\tvar min = this.getMinZoom(),\n\t\t max = this.getMaxZoom();\n\n\t\treturn Math.max(min, Math.min(max, zoom));\n\t}\n});\n\nL.map = function (id, options) {\n\treturn new L.Map(id, options);\n};\n\n\n/*\n * Mercator projection that takes into account that the Earth is not a perfect sphere.\n * Less popular than spherical mercator; used by projections like EPSG:3395.\n */\n\nL.Projection.Mercator = {\n\tMAX_LATITUDE: 85.0840591556,\n\n\tR_MINOR: 6356752.314245179,\n\tR_MAJOR: 6378137,\n\n\tproject: function (latlng) { // (LatLng) -> Point\n\t\tvar d = L.LatLng.DEG_TO_RAD,\n\t\t max = this.MAX_LATITUDE,\n\t\t lat = Math.max(Math.min(max, latlng.lat), -max),\n\t\t r = this.R_MAJOR,\n\t\t r2 = this.R_MINOR,\n\t\t x = latlng.lng * d * r,\n\t\t y = lat * d,\n\t\t tmp = r2 / r,\n\t\t eccent = Math.sqrt(1.0 - tmp * tmp),\n\t\t con = eccent * Math.sin(y);\n\n\t\tcon = Math.pow((1 - con) / (1 + con), eccent * 0.5);\n\n\t\tvar ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;\n\t\ty = -r * Math.log(ts);\n\n\t\treturn new L.Point(x, y);\n\t},\n\n\tunproject: function (point) { // (Point, Boolean) -> LatLng\n\t\tvar d = L.LatLng.RAD_TO_DEG,\n\t\t r = this.R_MAJOR,\n\t\t r2 = this.R_MINOR,\n\t\t lng = point.x * d / r,\n\t\t tmp = r2 / r,\n\t\t eccent = Math.sqrt(1 - (tmp * tmp)),\n\t\t ts = Math.exp(- point.y / r),\n\t\t phi = (Math.PI / 2) - 2 * Math.atan(ts),\n\t\t numIter = 15,\n\t\t tol = 1e-7,\n\t\t i = numIter,\n\t\t dphi = 0.1,\n\t\t con;\n\n\t\twhile ((Math.abs(dphi) > tol) && (--i > 0)) {\n\t\t\tcon = eccent * Math.sin(phi);\n\t\t\tdphi = (Math.PI / 2) - 2 * Math.atan(ts *\n\t\t\t Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi;\n\t\t\tphi += dphi;\n\t\t}\n\n\t\treturn new L.LatLng(phi * d, lng);\n\t}\n};\n\n\n\nL.CRS.EPSG3395 = L.extend({}, L.CRS, {\n\tcode: 'EPSG:3395',\n\n\tprojection: L.Projection.Mercator,\n\n\ttransformation: (function () {\n\t\tvar m = L.Projection.Mercator,\n\t\t r = m.R_MAJOR,\n\t\t scale = 0.5 / (Math.PI * r);\n\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\n\t}())\n});\n\n\n/*\n * L.TileLayer is used for standard xyz-numbered tile layers.\n */\n\nL.TileLayer = L.Class.extend({\n\tincludes: L.Mixin.Events,\n\n\toptions: {\n\t\tminZoom: 0,\n\t\tmaxZoom: 18,\n\t\ttileSize: 256,\n\t\tsubdomains: 'abc',\n\t\terrorTileUrl: '',\n\t\tattribution: '',\n\t\tzoomOffset: 0,\n\t\topacity: 1,\n\t\t/*\n\t\tmaxNativeZoom: null,\n\t\tzIndex: null,\n\t\ttms: false,\n\t\tcontinuousWorld: false,\n\t\tnoWrap: false,\n\t\tzoomReverse: false,\n\t\tdetectRetina: false,\n\t\treuseTiles: false,\n\t\tbounds: false,\n\t\t*/\n\t\tunloadInvisibleTiles: L.Browser.mobile,\n\t\tupdateWhenIdle: L.Browser.mobile\n\t},\n\n\tinitialize: function (url, options) {\n\t\toptions = L.setOptions(this, options);\n\n\t\t// detecting retina displays, adjusting tileSize and zoom levels\n\t\tif (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {\n\n\t\t\toptions.tileSize = Math.floor(options.tileSize / 2);\n\t\t\toptions.zoomOffset++;\n\n\t\t\tif (options.minZoom > 0) {\n\t\t\t\toptions.minZoom--;\n\t\t\t}\n\t\t\tthis.options.maxZoom--;\n\t\t}\n\n\t\tif (options.bounds) {\n\t\t\toptions.bounds = L.latLngBounds(options.bounds);\n\t\t}\n\n\t\tthis._url = url;\n\n\t\tvar subdomains = this.options.subdomains;\n\n\t\tif (typeof subdomains === 'string') {\n\t\t\tthis.options.subdomains = subdomains.split('');\n\t\t}\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\t\tthis._animated = map._zoomAnimated;\n\n\t\t// create a container div for tiles\n\t\tthis._initContainer();\n\n\t\t// set up events\n\t\tmap.on({\n\t\t\t'viewreset': this._reset,\n\t\t\t'moveend': this._update\n\t\t}, this);\n\n\t\tif (this._animated) {\n\t\t\tmap.on({\n\t\t\t\t'zoomanim': this._animateZoom,\n\t\t\t\t'zoomend': this._endZoomAnim\n\t\t\t}, this);\n\t\t}\n\n\t\tif (!this.options.updateWhenIdle) {\n\t\t\tthis._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this);\n\t\t\tmap.on('move', this._limitedUpdate, this);\n\t\t}\n\n\t\tthis._reset();\n\t\tthis._update();\n\t},\n\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\tonRemove: function (map) {\n\t\tthis._container.parentNode.removeChild(this._container);\n\n\t\tmap.off({\n\t\t\t'viewreset': this._reset,\n\t\t\t'moveend': this._update\n\t\t}, this);\n\n\t\tif (this._animated) {\n\t\t\tmap.off({\n\t\t\t\t'zoomanim': this._animateZoom,\n\t\t\t\t'zoomend': this._endZoomAnim\n\t\t\t}, this);\n\t\t}\n\n\t\tif (!this.options.updateWhenIdle) {\n\t\t\tmap.off('move', this._limitedUpdate, this);\n\t\t}\n\n\t\tthis._container = null;\n\t\tthis._map = null;\n\t},\n\n\tbringToFront: function () {\n\t\tvar pane = this._map._panes.tilePane;\n\n\t\tif (this._container) {\n\t\t\tpane.appendChild(this._container);\n\t\t\tthis._setAutoZIndex(pane, Math.max);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tbringToBack: function () {\n\t\tvar pane = this._map._panes.tilePane;\n\n\t\tif (this._container) {\n\t\t\tpane.insertBefore(this._container, pane.firstChild);\n\t\t\tthis._setAutoZIndex(pane, Math.min);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tgetAttribution: function () {\n\t\treturn this.options.attribution;\n\t},\n\n\tgetContainer: function () {\n\t\treturn this._container;\n\t},\n\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\n\t\tif (this._map) {\n\t\t\tthis._updateOpacity();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tsetZIndex: function (zIndex) {\n\t\tthis.options.zIndex = zIndex;\n\t\tthis._updateZIndex();\n\n\t\treturn this;\n\t},\n\n\tsetUrl: function (url, noRedraw) {\n\t\tthis._url = url;\n\n\t\tif (!noRedraw) {\n\t\t\tthis.redraw();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._reset({hard: true});\n\t\t\tthis._update();\n\t\t}\n\t\treturn this;\n\t},\n\n\t_updateZIndex: function () {\n\t\tif (this._container && this.options.zIndex !== undefined) {\n\t\t\tthis._container.style.zIndex = this.options.zIndex;\n\t\t}\n\t},\n\n\t_setAutoZIndex: function (pane, compare) {\n\n\t\tvar layers = pane.children,\n\t\t edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min\n\t\t zIndex, i, len;\n\n\t\tfor (i = 0, len = layers.length; i < len; i++) {\n\n\t\t\tif (layers[i] !== this._container) {\n\t\t\t\tzIndex = parseInt(layers[i].style.zIndex, 10);\n\n\t\t\t\tif (!isNaN(zIndex)) {\n\t\t\t\t\tedgeZIndex = compare(edgeZIndex, zIndex);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.options.zIndex = this._container.style.zIndex =\n\t\t (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1);\n\t},\n\n\t_updateOpacity: function () {\n\t\tvar i,\n\t\t tiles = this._tiles;\n\n\t\tif (L.Browser.ielt9) {\n\t\t\tfor (i in tiles) {\n\t\t\t\tL.DomUtil.setOpacity(tiles[i], this.options.opacity);\n\t\t\t}\n\t\t} else {\n\t\t\tL.DomUtil.setOpacity(this._container, this.options.opacity);\n\t\t}\n\t},\n\n\t_initContainer: function () {\n\t\tvar tilePane = this._map._panes.tilePane;\n\n\t\tif (!this._container) {\n\t\t\tthis._container = L.DomUtil.create('div', 'leaflet-layer');\n\n\t\t\tthis._updateZIndex();\n\n\t\t\tif (this._animated) {\n\t\t\t\tvar className = 'leaflet-tile-container';\n\n\t\t\t\tthis._bgBuffer = L.DomUtil.create('div', className, this._container);\n\t\t\t\tthis._tileContainer = L.DomUtil.create('div', className, this._container);\n\n\t\t\t} else {\n\t\t\t\tthis._tileContainer = this._container;\n\t\t\t}\n\n\t\t\ttilePane.appendChild(this._container);\n\n\t\t\tif (this.options.opacity < 1) {\n\t\t\t\tthis._updateOpacity();\n\t\t\t}\n\t\t}\n\t},\n\n\t_reset: function (e) {\n\t\tfor (var key in this._tiles) {\n\t\t\tthis.fire('tileunload', {tile: this._tiles[key]});\n\t\t}\n\n\t\tthis._tiles = {};\n\t\tthis._tilesToLoad = 0;\n\n\t\tif (this.options.reuseTiles) {\n\t\t\tthis._unusedTiles = [];\n\t\t}\n\n\t\tthis._tileContainer.innerHTML = '';\n\n\t\tif (this._animated && e && e.hard) {\n\t\t\tthis._clearBgBuffer();\n\t\t}\n\n\t\tthis._initContainer();\n\t},\n\n\t_getTileSize: function () {\n\t\tvar map = this._map,\n\t\t zoom = map.getZoom() + this.options.zoomOffset,\n\t\t zoomN = this.options.maxNativeZoom,\n\t\t tileSize = this.options.tileSize;\n\n\t\tif (zoomN && zoom > zoomN) {\n\t\t\ttileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize);\n\t\t}\n\n\t\treturn tileSize;\n\t},\n\n\t_update: function () {\n\n\t\tif (!this._map) { return; }\n\n\t\tvar map = this._map,\n\t\t bounds = map.getPixelBounds(),\n\t\t zoom = map.getZoom(),\n\t\t tileSize = this._getTileSize();\n\n\t\tif (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tileBounds = L.bounds(\n\t\t bounds.min.divideBy(tileSize)._floor(),\n\t\t bounds.max.divideBy(tileSize)._floor());\n\n\t\tthis._addTilesFromCenterOut(tileBounds);\n\n\t\tif (this.options.unloadInvisibleTiles || this.options.reuseTiles) {\n\t\t\tthis._removeOtherTiles(tileBounds);\n\t\t}\n\t},\n\n\t_addTilesFromCenterOut: function (bounds) {\n\t\tvar queue = [],\n\t\t center = bounds.getCenter();\n\n\t\tvar j, i, point;\n\n\t\tfor (j = bounds.min.y; j <= bounds.max.y; j++) {\n\t\t\tfor (i = bounds.min.x; i <= bounds.max.x; i++) {\n\t\t\t\tpoint = new L.Point(i, j);\n\n\t\t\t\tif (this._tileShouldBeLoaded(point)) {\n\t\t\t\t\tqueue.push(point);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar tilesToLoad = queue.length;\n\n\t\tif (tilesToLoad === 0) { return; }\n\n\t\t// load tiles in order of their distance to center\n\t\tqueue.sort(function (a, b) {\n\t\t\treturn a.distanceTo(center) - b.distanceTo(center);\n\t\t});\n\n\t\tvar fragment = document.createDocumentFragment();\n\n\t\t// if its the first batch of tiles to load\n\t\tif (!this._tilesToLoad) {\n\t\t\tthis.fire('loading');\n\t\t}\n\n\t\tthis._tilesToLoad += tilesToLoad;\n\n\t\tfor (i = 0; i < tilesToLoad; i++) {\n\t\t\tthis._addTile(queue[i], fragment);\n\t\t}\n\n\t\tthis._tileContainer.appendChild(fragment);\n\t},\n\n\t_tileShouldBeLoaded: function (tilePoint) {\n\t\tif ((tilePoint.x + ':' + tilePoint.y) in this._tiles) {\n\t\t\treturn false; // already loaded\n\t\t}\n\n\t\tvar options = this.options;\n\n\t\tif (!options.continuousWorld) {\n\t\t\tvar limit = this._getWrapTileNum();\n\n\t\t\t// don't load if exceeds world bounds\n\t\t\tif ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) ||\n\t\t\t\ttilePoint.y < 0 || tilePoint.y >= limit.y) { return false; }\n\t\t}\n\n\t\tif (options.bounds) {\n\t\t\tvar tileSize = this._getTileSize(),\n\t\t\t nwPoint = tilePoint.multiplyBy(tileSize),\n\t\t\t sePoint = nwPoint.add([tileSize, tileSize]),\n\t\t\t nw = this._map.unproject(nwPoint),\n\t\t\t se = this._map.unproject(sePoint);\n\n\t\t\t// TODO temporary hack, will be removed after refactoring projections\n\t\t\t// https://github.com/Leaflet/Leaflet/issues/1618\n\t\t\tif (!options.continuousWorld && !options.noWrap) {\n\t\t\t\tnw = nw.wrap();\n\t\t\t\tse = se.wrap();\n\t\t\t}\n\n\t\t\tif (!options.bounds.intersects([nw, se])) { return false; }\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t_removeOtherTiles: function (bounds) {\n\t\tvar kArr, x, y, key;\n\n\t\tfor (key in this._tiles) {\n\t\t\tkArr = key.split(':');\n\t\t\tx = parseInt(kArr[0], 10);\n\t\t\ty = parseInt(kArr[1], 10);\n\n\t\t\t// remove tile if it's out of bounds\n\t\t\tif (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) {\n\t\t\t\tthis._removeTile(key);\n\t\t\t}\n\t\t}\n\t},\n\n\t_removeTile: function (key) {\n\t\tvar tile = this._tiles[key];\n\n\t\tthis.fire('tileunload', {tile: tile, url: tile.src});\n\n\t\tif (this.options.reuseTiles) {\n\t\t\tL.DomUtil.removeClass(tile, 'leaflet-tile-loaded');\n\t\t\tthis._unusedTiles.push(tile);\n\n\t\t} else if (tile.parentNode === this._tileContainer) {\n\t\t\tthis._tileContainer.removeChild(tile);\n\t\t}\n\n\t\t// for https://github.com/CloudMade/Leaflet/issues/137\n\t\tif (!L.Browser.android) {\n\t\t\ttile.onload = null;\n\t\t\ttile.src = L.Util.emptyImageUrl;\n\t\t}\n\n\t\tdelete this._tiles[key];\n\t},\n\n\t_addTile: function (tilePoint, container) {\n\t\tvar tilePos = this._getTilePos(tilePoint);\n\n\t\t// get unused tile - or create a new tile\n\t\tvar tile = this._getTile();\n\n\t\t/*\n\t\tChrome 20 layouts much faster with top/left (verify with timeline, frames)\n\t\tAndroid 4 browser has display issues with top/left and requires transform instead\n\t\t(other browsers don't currently care) - see debug/hacks/jitter.html for an example\n\t\t*/\n\t\tL.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);\n\n\t\tthis._tiles[tilePoint.x + ':' + tilePoint.y] = tile;\n\n\t\tthis._loadTile(tile, tilePoint);\n\n\t\tif (tile.parentNode !== this._tileContainer) {\n\t\t\tcontainer.appendChild(tile);\n\t\t}\n\t},\n\n\t_getZoomForUrl: function () {\n\n\t\tvar options = this.options,\n\t\t zoom = this._map.getZoom();\n\n\t\tif (options.zoomReverse) {\n\t\t\tzoom = options.maxZoom - zoom;\n\t\t}\n\n\t\tzoom += options.zoomOffset;\n\n\t\treturn options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom;\n\t},\n\n\t_getTilePos: function (tilePoint) {\n\t\tvar origin = this._map.getPixelOrigin(),\n\t\t tileSize = this._getTileSize();\n\n\t\treturn tilePoint.multiplyBy(tileSize).subtract(origin);\n\t},\n\n\t// image-specific code (override to implement e.g. Canvas or SVG tile layer)\n\n\tgetTileUrl: function (tilePoint) {\n\t\treturn L.Util.template(this._url, L.extend({\n\t\t\ts: this._getSubdomain(tilePoint),\n\t\t\tz: tilePoint.z,\n\t\t\tx: tilePoint.x,\n\t\t\ty: tilePoint.y\n\t\t}, this.options));\n\t},\n\n\t_getWrapTileNum: function () {\n\t\tvar crs = this._map.options.crs,\n\t\t size = crs.getSize(this._map.getZoom());\n\t\treturn size.divideBy(this._getTileSize())._floor();\n\t},\n\n\t_adjustTilePoint: function (tilePoint) {\n\n\t\tvar limit = this._getWrapTileNum();\n\n\t\t// wrap tile coordinates\n\t\tif (!this.options.continuousWorld && !this.options.noWrap) {\n\t\t\ttilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x;\n\t\t}\n\n\t\tif (this.options.tms) {\n\t\t\ttilePoint.y = limit.y - tilePoint.y - 1;\n\t\t}\n\n\t\ttilePoint.z = this._getZoomForUrl();\n\t},\n\n\t_getSubdomain: function (tilePoint) {\n\t\tvar index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;\n\t\treturn this.options.subdomains[index];\n\t},\n\n\t_getTile: function () {\n\t\tif (this.options.reuseTiles && this._unusedTiles.length > 0) {\n\t\t\tvar tile = this._unusedTiles.pop();\n\t\t\tthis._resetTile(tile);\n\t\t\treturn tile;\n\t\t}\n\t\treturn this._createTile();\n\t},\n\n\t// Override if data stored on a tile needs to be cleaned up before reuse\n\t_resetTile: function (/*tile*/) {},\n\n\t_createTile: function () {\n\t\tvar tile = L.DomUtil.create('img', 'leaflet-tile');\n\t\ttile.style.width = tile.style.height = this._getTileSize() + 'px';\n\t\ttile.galleryimg = 'no';\n\n\t\ttile.onselectstart = tile.onmousemove = L.Util.falseFn;\n\n\t\tif (L.Browser.ielt9 && this.options.opacity !== undefined) {\n\t\t\tL.DomUtil.setOpacity(tile, this.options.opacity);\n\t\t}\n\t\t// without this hack, tiles disappear after zoom on Chrome for Android\n\t\t// https://github.com/Leaflet/Leaflet/issues/2078\n\t\tif (L.Browser.mobileWebkit3d) {\n\t\t\ttile.style.WebkitBackfaceVisibility = 'hidden';\n\t\t}\n\t\treturn tile;\n\t},\n\n\t_loadTile: function (tile, tilePoint) {\n\t\ttile._layer = this;\n\t\ttile.onload = this._tileOnLoad;\n\t\ttile.onerror = this._tileOnError;\n\n\t\tthis._adjustTilePoint(tilePoint);\n\t\ttile.src = this.getTileUrl(tilePoint);\n\n\t\tthis.fire('tileloadstart', {\n\t\t\ttile: tile,\n\t\t\turl: tile.src\n\t\t});\n\t},\n\n\t_tileLoaded: function () {\n\t\tthis._tilesToLoad--;\n\n\t\tif (this._animated) {\n\t\t\tL.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated');\n\t\t}\n\n\t\tif (!this._tilesToLoad) {\n\t\t\tthis.fire('load');\n\n\t\t\tif (this._animated) {\n\t\t\t\t// clear scaled tiles after all new tiles are loaded (for performance)\n\t\t\t\tclearTimeout(this._clearBgBufferTimer);\n\t\t\t\tthis._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500);\n\t\t\t}\n\t\t}\n\t},\n\n\t_tileOnLoad: function () {\n\t\tvar layer = this._layer;\n\n\t\t//Only if we are loading an actual image\n\t\tif (this.src !== L.Util.emptyImageUrl) {\n\t\t\tL.DomUtil.addClass(this, 'leaflet-tile-loaded');\n\n\t\t\tlayer.fire('tileload', {\n\t\t\t\ttile: this,\n\t\t\t\turl: this.src\n\t\t\t});\n\t\t}\n\n\t\tlayer._tileLoaded();\n\t},\n\n\t_tileOnError: function () {\n\t\tvar layer = this._layer;\n\n\t\tlayer.fire('tileerror', {\n\t\t\ttile: this,\n\t\t\turl: this.src\n\t\t});\n\n\t\tvar newUrl = layer.options.errorTileUrl;\n\t\tif (newUrl) {\n\t\t\tthis.src = newUrl;\n\t\t}\n\n\t\tlayer._tileLoaded();\n\t}\n});\n\nL.tileLayer = function (url, options) {\n\treturn new L.TileLayer(url, options);\n};\n\n\n/*\n * L.TileLayer.WMS is used for putting WMS tile layers on the map.\n */\n\nL.TileLayer.WMS = L.TileLayer.extend({\n\n\tdefaultWmsParams: {\n\t\tservice: 'WMS',\n\t\trequest: 'GetMap',\n\t\tversion: '1.1.1',\n\t\tlayers: '',\n\t\tstyles: '',\n\t\tformat: 'image/jpeg',\n\t\ttransparent: false\n\t},\n\n\tinitialize: function (url, options) { // (String, Object)\n\n\t\tthis._url = url;\n\n\t\tvar wmsParams = L.extend({}, this.defaultWmsParams),\n\t\t tileSize = options.tileSize || this.options.tileSize;\n\n\t\tif (options.detectRetina && L.Browser.retina) {\n\t\t\twmsParams.width = wmsParams.height = tileSize * 2;\n\t\t} else {\n\t\t\twmsParams.width = wmsParams.height = tileSize;\n\t\t}\n\n\t\tfor (var i in options) {\n\t\t\t// all keys that are not TileLayer options go to WMS params\n\t\t\tif (!this.options.hasOwnProperty(i) && i !== 'crs') {\n\t\t\t\twmsParams[i] = options[i];\n\t\t\t}\n\t\t}\n\n\t\tthis.wmsParams = wmsParams;\n\n\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function (map) {\n\n\t\tthis._crs = this.options.crs || map.options.crs;\n\n\t\tthis._wmsVersion = parseFloat(this.wmsParams.version);\n\n\t\tvar projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';\n\t\tthis.wmsParams[projectionKey] = this._crs.code;\n\n\t\tL.TileLayer.prototype.onAdd.call(this, map);\n\t},\n\n\tgetTileUrl: function (tilePoint) { // (Point, Number) -> String\n\n\t\tvar map = this._map,\n\t\t tileSize = this.options.tileSize,\n\n\t\t nwPoint = tilePoint.multiplyBy(tileSize),\n\t\t sePoint = nwPoint.add([tileSize, tileSize]),\n\n\t\t nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)),\n\t\t se = this._crs.project(map.unproject(sePoint, tilePoint.z)),\n\t\t bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?\n\t\t [se.y, nw.x, nw.y, se.x].join(',') :\n\t\t [nw.x, se.y, se.x, nw.y].join(','),\n\n\t\t url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)});\n\n\t\treturn url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox;\n\t},\n\n\tsetParams: function (params, noRedraw) {\n\n\t\tL.extend(this.wmsParams, params);\n\n\t\tif (!noRedraw) {\n\t\t\tthis.redraw();\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nL.tileLayer.wms = function (url, options) {\n\treturn new L.TileLayer.WMS(url, options);\n};\n\n\n/*\n * L.TileLayer.Canvas is a class that you can use as a base for creating\n * dynamically drawn Canvas-based tile layers.\n */\n\nL.TileLayer.Canvas = L.TileLayer.extend({\n\toptions: {\n\t\tasync: false\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\t},\n\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._reset({hard: true});\n\t\t\tthis._update();\n\t\t}\n\n\t\tfor (var i in this._tiles) {\n\t\t\tthis._redrawTile(this._tiles[i]);\n\t\t}\n\t\treturn this;\n\t},\n\n\t_redrawTile: function (tile) {\n\t\tthis.drawTile(tile, tile._tilePoint, this._map._zoom);\n\t},\n\n\t_createTile: function () {\n\t\tvar tile = L.DomUtil.create('canvas', 'leaflet-tile');\n\t\ttile.width = tile.height = this.options.tileSize;\n\t\ttile.onselectstart = tile.onmousemove = L.Util.falseFn;\n\t\treturn tile;\n\t},\n\n\t_loadTile: function (tile, tilePoint) {\n\t\ttile._layer = this;\n\t\ttile._tilePoint = tilePoint;\n\n\t\tthis._redrawTile(tile);\n\n\t\tif (!this.options.async) {\n\t\t\tthis.tileDrawn(tile);\n\t\t}\n\t},\n\n\tdrawTile: function (/*tile, tilePoint*/) {\n\t\t// override with rendering code\n\t},\n\n\ttileDrawn: function (tile) {\n\t\tthis._tileOnLoad.call(tile);\n\t}\n});\n\n\nL.tileLayer.canvas = function (options) {\n\treturn new L.TileLayer.Canvas(options);\n};\n\n\n/*\n * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds).\n */\n\nL.ImageOverlay = L.Class.extend({\n\tincludes: L.Mixin.Events,\n\n\toptions: {\n\t\topacity: 1\n\t},\n\n\tinitialize: function (url, bounds, options) { // (String, LatLngBounds, Object)\n\t\tthis._url = url;\n\t\tthis._bounds = L.latLngBounds(bounds);\n\n\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\n\t\tif (!this._image) {\n\t\t\tthis._initImage();\n\t\t}\n\n\t\tmap._panes.overlayPane.appendChild(this._image);\n\n\t\tmap.on('viewreset', this._reset, this);\n\n\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t}\n\n\t\tthis._reset();\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.getPanes().overlayPane.removeChild(this._image);\n\n\t\tmap.off('viewreset', this._reset, this);\n\n\t\tif (map.options.zoomAnimation) {\n\t\t\tmap.off('zoomanim', this._animateZoom, this);\n\t\t}\n\t},\n\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\t\tthis._updateOpacity();\n\t\treturn this;\n\t},\n\n\t// TODO remove bringToFront/bringToBack duplication from TileLayer/Path\n\tbringToFront: function () {\n\t\tif (this._image) {\n\t\t\tthis._map._panes.overlayPane.appendChild(this._image);\n\t\t}\n\t\treturn this;\n\t},\n\n\tbringToBack: function () {\n\t\tvar pane = this._map._panes.overlayPane;\n\t\tif (this._image) {\n\t\t\tpane.insertBefore(this._image, pane.firstChild);\n\t\t}\n\t\treturn this;\n\t},\n\n\tsetUrl: function (url) {\n\t\tthis._url = url;\n\t\tthis._image.src = this._url;\n\t},\n\n\tgetAttribution: function () {\n\t\treturn this.options.attribution;\n\t},\n\n\t_initImage: function () {\n\t\tthis._image = L.DomUtil.create('img', 'leaflet-image-layer');\n\n\t\tif (this._map.options.zoomAnimation && L.Browser.any3d) {\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-zoom-animated');\n\t\t} else {\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-zoom-hide');\n\t\t}\n\n\t\tthis._updateOpacity();\n\n\t\t//TODO createImage util method to remove duplication\n\t\tL.extend(this._image, {\n\t\t\tgalleryimg: 'no',\n\t\t\tonselectstart: L.Util.falseFn,\n\t\t\tonmousemove: L.Util.falseFn,\n\t\t\tonload: L.bind(this._onImageLoad, this),\n\t\t\tsrc: this._url\n\t\t});\n\t},\n\n\t_animateZoom: function (e) {\n\t\tvar map = this._map,\n\t\t image = this._image,\n\t\t scale = map.getZoomScale(e.zoom),\n\t\t nw = this._bounds.getNorthWest(),\n\t\t se = this._bounds.getSouthEast(),\n\n\t\t topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center),\n\t\t size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft),\n\t\t origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale)));\n\n\t\timage.style[L.DomUtil.TRANSFORM] =\n\t\t L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') ';\n\t},\n\n\t_reset: function () {\n\t\tvar image = this._image,\n\t\t topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()),\n\t\t size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft);\n\n\t\tL.DomUtil.setPosition(image, topLeft);\n\n\t\timage.style.width = size.x + 'px';\n\t\timage.style.height = size.y + 'px';\n\t},\n\n\t_onImageLoad: function () {\n\t\tthis.fire('load');\n\t},\n\n\t_updateOpacity: function () {\n\t\tL.DomUtil.setOpacity(this._image, this.options.opacity);\n\t}\n});\n\nL.imageOverlay = function (url, bounds, options) {\n\treturn new L.ImageOverlay(url, bounds, options);\n};\n\n\n/*\n * L.Icon is an image-based icon class that you can use with L.Marker for custom markers.\n */\n\nL.Icon = L.Class.extend({\n\toptions: {\n\t\t/*\n\t\ticonUrl: (String) (required)\n\t\ticonRetinaUrl: (String) (optional, used for retina devices if detected)\n\t\ticonSize: (Point) (can be set through CSS)\n\t\ticonAnchor: (Point) (centered by default, can be set in CSS with negative margins)\n\t\tpopupAnchor: (Point) (if not specified, popup opens in the anchor point)\n\t\tshadowUrl: (String) (no shadow by default)\n\t\tshadowRetinaUrl: (String) (optional, used for retina devices if detected)\n\t\tshadowSize: (Point)\n\t\tshadowAnchor: (Point)\n\t\t*/\n\t\tclassName: ''\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\treturn this._createIcon('icon', oldIcon);\n\t},\n\n\tcreateShadow: function (oldIcon) {\n\t\treturn this._createIcon('shadow', oldIcon);\n\t},\n\n\t_createIcon: function (name, oldIcon) {\n\t\tvar src = this._getIconUrl(name);\n\n\t\tif (!src) {\n\t\t\tif (name === 'icon') {\n\t\t\t\tthrow new Error('iconUrl not set in Icon options (see the docs).');\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tvar img;\n\t\tif (!oldIcon || oldIcon.tagName !== 'IMG') {\n\t\t\timg = this._createImg(src);\n\t\t} else {\n\t\t\timg = this._createImg(src, oldIcon);\n\t\t}\n\t\tthis._setIconStyles(img, name);\n\n\t\treturn img;\n\t},\n\n\t_setIconStyles: function (img, name) {\n\t\tvar options = this.options,\n\t\t size = L.point(options[name + 'Size']),\n\t\t anchor;\n\n\t\tif (name === 'shadow') {\n\t\t\tanchor = L.point(options.shadowAnchor || options.iconAnchor);\n\t\t} else {\n\t\t\tanchor = L.point(options.iconAnchor);\n\t\t}\n\n\t\tif (!anchor && size) {\n\t\t\tanchor = size.divideBy(2, true);\n\t\t}\n\n\t\timg.className = 'leaflet-marker-' + name + ' ' + options.className;\n\n\t\tif (anchor) {\n\t\t\timg.style.marginLeft = (-anchor.x) + 'px';\n\t\t\timg.style.marginTop = (-anchor.y) + 'px';\n\t\t}\n\n\t\tif (size) {\n\t\t\timg.style.width = size.x + 'px';\n\t\t\timg.style.height = size.y + 'px';\n\t\t}\n\t},\n\n\t_createImg: function (src, el) {\n\t\tel = el || document.createElement('img');\n\t\tel.src = src;\n\t\treturn el;\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tif (L.Browser.retina && this.options[name + 'RetinaUrl']) {\n\t\t\treturn this.options[name + 'RetinaUrl'];\n\t\t}\n\t\treturn this.options[name + 'Url'];\n\t}\n});\n\nL.icon = function (options) {\n\treturn new L.Icon(options);\n};\n\n\n/*\n * L.Icon.Default is the blue marker icon used by default in Leaflet.\n */\n\nL.Icon.Default = L.Icon.extend({\n\n\toptions: {\n\t\ticonSize: [25, 41],\n\t\ticonAnchor: [12, 41],\n\t\tpopupAnchor: [1, -34],\n\n\t\tshadowSize: [41, 41]\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tvar key = name + 'Url';\n\n\t\tif (this.options[key]) {\n\t\t\treturn this.options[key];\n\t\t}\n\n\t\tif (L.Browser.retina && name === 'icon') {\n\t\t\tname += '-2x';\n\t\t}\n\n\t\tvar path = L.Icon.Default.imagePath;\n\n\t\tif (!path) {\n\t\t\tthrow new Error('Couldn\\'t autodetect L.Icon.Default.imagePath, set it manually.');\n\t\t}\n\n\t\treturn path + '/marker-' + name + '.png';\n\t}\n});\n\nL.Icon.Default.imagePath = (function () {\n\tvar scripts = document.getElementsByTagName('script'),\n\t leafletRe = /[\\/^]leaflet[\\-\\._]?([\\w\\-\\._]*)\\.js\\??/;\n\n\tvar i, len, src, matches, path;\n\n\tfor (i = 0, len = scripts.length; i < len; i++) {\n\t\tsrc = scripts[i].src;\n\t\tmatches = src.match(leafletRe);\n\n\t\tif (matches) {\n\t\t\tpath = src.split(leafletRe)[0];\n\t\t\treturn (path ? path + '/' : '') + 'images';\n\t\t}\n\t}\n}());\n\n\n/*\n * L.Marker is used to display clickable/draggable icons on the map.\n */\n\nL.Marker = L.Class.extend({\n\n\tincludes: L.Mixin.Events,\n\n\toptions: {\n\t\ticon: new L.Icon.Default(),\n\t\ttitle: '',\n\t\talt: '',\n\t\tclickable: true,\n\t\tdraggable: false,\n\t\tkeyboard: true,\n\t\tzIndexOffset: 0,\n\t\topacity: 1,\n\t\triseOnHover: false,\n\t\triseOffset: 250\n\t},\n\n\tinitialize: function (latlng, options) {\n\t\tL.setOptions(this, options);\n\t\tthis._latlng = L.latLng(latlng);\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\n\t\tmap.on('viewreset', this.update, this);\n\n\t\tthis._initIcon();\n\t\tthis.update();\n\t\tthis.fire('add');\n\n\t\tif (map.options.zoomAnimation && map.options.markerZoomAnimation) {\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\n\t\t}\n\t},\n\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\tonRemove: function (map) {\n\t\tif (this.dragging) {\n\t\t\tthis.dragging.disable();\n\t\t}\n\n\t\tthis._removeIcon();\n\t\tthis._removeShadow();\n\n\t\tthis.fire('remove');\n\n\t\tmap.off({\n\t\t\t'viewreset': this.update,\n\t\t\t'zoomanim': this._animateZoom\n\t\t}, this);\n\n\t\tthis._map = null;\n\t},\n\n\tgetLatLng: function () {\n\t\treturn this._latlng;\n\t},\n\n\tsetLatLng: function (latlng) {\n\t\tthis._latlng = L.latLng(latlng);\n\n\t\tthis.update();\n\n\t\treturn this.fire('move', { latlng: this._latlng });\n\t},\n\n\tsetZIndexOffset: function (offset) {\n\t\tthis.options.zIndexOffset = offset;\n\t\tthis.update();\n\n\t\treturn this;\n\t},\n\n\tsetIcon: function (icon) {\n\n\t\tthis.options.icon = icon;\n\n\t\tif (this._map) {\n\t\t\tthis._initIcon();\n\t\t\tthis.update();\n\t\t}\n\n\t\tif (this._popup) {\n\t\t\tthis.bindPopup(this._popup);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tupdate: function () {\n\t\tif (this._icon) {\n\t\t\tthis._setPos(this._map.latLngToLayerPoint(this._latlng).round());\n\t\t}\n\t\treturn this;\n\t},\n\n\t_initIcon: function () {\n\t\tvar options = this.options,\n\t\t map = this._map,\n\t\t animation = (map.options.zoomAnimation && map.options.markerZoomAnimation),\n\t\t classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide';\n\n\t\tvar icon = options.icon.createIcon(this._icon),\n\t\t\taddIcon = false;\n\n\t\t// if we're not reusing the icon, remove the old one and init new one\n\t\tif (icon !== this._icon) {\n\t\t\tif (this._icon) {\n\t\t\t\tthis._removeIcon();\n\t\t\t}\n\t\t\taddIcon = true;\n\n\t\t\tif (options.title) {\n\t\t\t\ticon.title = options.title;\n\t\t\t}\n\n\t\t\tif (options.alt) {\n\t\t\t\ticon.alt = options.alt;\n\t\t\t}\n\t\t}\n\n\t\tL.DomUtil.addClass(icon, classToAdd);\n\n\t\tif (options.keyboard) {\n\t\t\ticon.tabIndex = '0';\n\t\t}\n\n\t\tthis._icon = icon;\n\n\t\tthis._initInteraction();\n\n\t\tif (options.riseOnHover) {\n\t\t\tL.DomEvent\n\t\t\t\t.on(icon, 'mouseover', this._bringToFront, this)\n\t\t\t\t.on(icon, 'mouseout', this._resetZIndex, this);\n\t\t}\n\n\t\tvar newShadow = options.icon.createShadow(this._shadow),\n\t\t\taddShadow = false;\n\n\t\tif (newShadow !== this._shadow) {\n\t\t\tthis._removeShadow();\n\t\t\taddShadow = true;\n\t\t}\n\n\t\tif (newShadow) {\n\t\t\tL.DomUtil.addClass(newShadow, classToAdd);\n\t\t}\n\t\tthis._shadow = newShadow;\n\n\n\t\tif (options.opacity < 1) {\n\t\t\tthis._updateOpacity();\n\t\t}\n\n\n\t\tvar panes = this._map._panes;\n\n\t\tif (addIcon) {\n\t\t\tpanes.markerPane.appendChild(this._icon);\n\t\t}\n\n\t\tif (newShadow && addShadow) {\n\t\t\tpanes.shadowPane.appendChild(this._shadow);\n\t\t}\n\t},\n\n\t_removeIcon: function () {\n\t\tif (this.options.riseOnHover) {\n\t\t\tL.DomEvent\n\t\t\t .off(this._icon, 'mouseover', this._bringToFront)\n\t\t\t .off(this._icon, 'mouseout', this._resetZIndex);\n\t\t}\n\n\t\tthis._map._panes.markerPane.removeChild(this._icon);\n\n\t\tthis._icon = null;\n\t},\n\n\t_removeShadow: function () {\n\t\tif (this._shadow) {\n\t\t\tthis._map._panes.shadowPane.removeChild(this._shadow);\n\t\t}\n\t\tthis._shadow = null;\n\t},\n\n\t_setPos: function (pos) {\n\t\tL.DomUtil.setPosition(this._icon, pos);\n\n\t\tif (this._shadow) {\n\t\t\tL.DomUtil.setPosition(this._shadow, pos);\n\t\t}\n\n\t\tthis._zIndex = pos.y + this.options.zIndexOffset;\n\n\t\tthis._resetZIndex();\n\t},\n\n\t_updateZIndex: function (offset) {\n\t\tthis._icon.style.zIndex = this._zIndex + offset;\n\t},\n\n\t_animateZoom: function (opt) {\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();\n\n\t\tthis._setPos(pos);\n\t},\n\n\t_initInteraction: function () {\n\n\t\tif (!this.options.clickable) { return; }\n\n\t\t// TODO refactor into something shared with Map/Path/etc. to DRY it up\n\n\t\tvar icon = this._icon,\n\t\t events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu'];\n\n\t\tL.DomUtil.addClass(icon, 'leaflet-clickable');\n\t\tL.DomEvent.on(icon, 'click', this._onMouseClick, this);\n\t\tL.DomEvent.on(icon, 'keypress', this._onKeyPress, this);\n\n\t\tfor (var i = 0; i < events.length; i++) {\n\t\t\tL.DomEvent.on(icon, events[i], this._fireMouseEvent, this);\n\t\t}\n\n\t\tif (L.Handler.MarkerDrag) {\n\t\t\tthis.dragging = new L.Handler.MarkerDrag(this);\n\n\t\t\tif (this.options.draggable) {\n\t\t\t\tthis.dragging.enable();\n\t\t\t}\n\t\t}\n\t},\n\n\t_onMouseClick: function (e) {\n\t\tvar wasDragged = this.dragging && this.dragging.moved();\n\n\t\tif (this.hasEventListeners(e.type) || wasDragged) {\n\t\t\tL.DomEvent.stopPropagation(e);\n\t\t}\n\n\t\tif (wasDragged) { return; }\n\n\t\tif ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; }\n\n\t\tthis.fire(e.type, {\n\t\t\toriginalEvent: e,\n\t\t\tlatlng: this._latlng\n\t\t});\n\t},\n\n\t_onKeyPress: function (e) {\n\t\tif (e.keyCode === 13) {\n\t\t\tthis.fire('click', {\n\t\t\t\toriginalEvent: e,\n\t\t\t\tlatlng: this._latlng\n\t\t\t});\n\t\t}\n\t},\n\n\t_fireMouseEvent: function (e) {\n\n\t\tthis.fire(e.type, {\n\t\t\toriginalEvent: e,\n\t\t\tlatlng: this._latlng\n\t\t});\n\n\t\t// TODO proper custom event propagation\n\t\t// this line will always be called if marker is in a FeatureGroup\n\t\tif (e.type === 'contextmenu' && this.hasEventListeners(e.type)) {\n\t\t\tL.DomEvent.preventDefault(e);\n\t\t}\n\t\tif (e.type !== 'mousedown') {\n\t\t\tL.DomEvent.stopPropagation(e);\n\t\t} else {\n\t\t\tL.DomEvent.preventDefault(e);\n\t\t}\n\t},\n\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\t\tif (this._map) {\n\t\t\tthis._updateOpacity();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_updateOpacity: function () {\n\t\tL.DomUtil.setOpacity(this._icon, this.options.opacity);\n\t\tif (this._shadow) {\n\t\t\tL.DomUtil.setOpacity(this._shadow, this.options.opacity);\n\t\t}\n\t},\n\n\t_bringToFront: function () {\n\t\tthis._updateZIndex(this.options.riseOffset);\n\t},\n\n\t_resetZIndex: function () {\n\t\tthis._updateZIndex(0);\n\t}\n});\n\nL.marker = function (latlng, options) {\n\treturn new L.Marker(latlng, options);\n};\n\n\n/*\n * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon)\n * to use with L.Marker.\n */\n\nL.DivIcon = L.Icon.extend({\n\toptions: {\n\t\ticonSize: [12, 12], // also can be set through CSS\n\t\t/*\n\t\ticonAnchor: (Point)\n\t\tpopupAnchor: (Point)\n\t\thtml: (String)\n\t\tbgPos: (Point)\n\t\t*/\n\t\tclassName: 'leaflet-div-icon',\n\t\thtml: false\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\tvar div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n\t\t options = this.options;\n\n\t\tif (options.html !== false) {\n\t\t\tdiv.innerHTML = options.html;\n\t\t} else {\n\t\t\tdiv.innerHTML = '';\n\t\t}\n\n\t\tif (options.bgPos) {\n\t\t\tdiv.style.backgroundPosition =\n\t\t\t (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';\n\t\t}\n\n\t\tthis._setIconStyles(div, 'icon');\n\t\treturn div;\n\t},\n\n\tcreateShadow: function () {\n\t\treturn null;\n\t}\n});\n\nL.divIcon = function (options) {\n\treturn new L.DivIcon(options);\n};\n\n\n/*\n * L.Popup is used for displaying popups on the map.\n */\n\nL.Map.mergeOptions({\n\tclosePopupOnClick: true\n});\n\nL.Popup = L.Class.extend({\n\tincludes: L.Mixin.Events,\n\n\toptions: {\n\t\tminWidth: 50,\n\t\tmaxWidth: 300,\n\t\t// maxHeight: null,\n\t\tautoPan: true,\n\t\tcloseButton: true,\n\t\toffset: [0, 7],\n\t\tautoPanPadding: [5, 5],\n\t\t// autoPanPaddingTopLeft: null,\n\t\t// autoPanPaddingBottomRight: null,\n\t\tkeepInView: false,\n\t\tclassName: '',\n\t\tzoomAnimation: true\n\t},\n\n\tinitialize: function (options, source) {\n\t\tL.setOptions(this, options);\n\n\t\tthis._source = source;\n\t\tthis._animated = L.Browser.any3d && this.options.zoomAnimation;\n\t\tthis._isOpen = false;\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\n\t\tif (!this._container) {\n\t\t\tthis._initLayout();\n\t\t}\n\n\t\tvar animFade = map.options.fadeAnimation;\n\n\t\tif (animFade) {\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\n\t\t}\n\t\tmap._panes.popupPane.appendChild(this._container);\n\n\t\tmap.on(this._getEvents(), this);\n\n\t\tthis.update();\n\n\t\tif (animFade) {\n\t\t\tL.DomUtil.setOpacity(this._container, 1);\n\t\t}\n\n\t\tthis.fire('open');\n\n\t\tmap.fire('popupopen', {popup: this});\n\n\t\tif (this._source) {\n\t\t\tthis._source.fire('popupopen', {popup: this});\n\t\t}\n\t},\n\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\topenOn: function (map) {\n\t\tmap.openPopup(this);\n\t\treturn this;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap._panes.popupPane.removeChild(this._container);\n\n\t\tL.Util.falseFn(this._container.offsetWidth); // force reflow\n\n\t\tmap.off(this._getEvents(), this);\n\n\t\tif (map.options.fadeAnimation) {\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\n\t\t}\n\n\t\tthis._map = null;\n\n\t\tthis.fire('close');\n\n\t\tmap.fire('popupclose', {popup: this});\n\n\t\tif (this._source) {\n\t\t\tthis._source.fire('popupclose', {popup: this});\n\t\t}\n\t},\n\n\tgetLatLng: function () {\n\t\treturn this._latlng;\n\t},\n\n\tsetLatLng: function (latlng) {\n\t\tthis._latlng = L.latLng(latlng);\n\t\tif (this._map) {\n\t\t\tthis._updatePosition();\n\t\t\tthis._adjustPan();\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetContent: function () {\n\t\treturn this._content;\n\t},\n\n\tsetContent: function (content) {\n\t\tthis._content = content;\n\t\tthis.update();\n\t\treturn this;\n\t},\n\n\tupdate: function () {\n\t\tif (!this._map) { return; }\n\n\t\tthis._container.style.visibility = 'hidden';\n\n\t\tthis._updateContent();\n\t\tthis._updateLayout();\n\t\tthis._updatePosition();\n\n\t\tthis._container.style.visibility = '';\n\n\t\tthis._adjustPan();\n\t},\n\n\t_getEvents: function () {\n\t\tvar events = {\n\t\t\tviewreset: this._updatePosition\n\t\t};\n\n\t\tif (this._animated) {\n\t\t\tevents.zoomanim = this._zoomAnimation;\n\t\t}\n\t\tif ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {\n\t\t\tevents.preclick = this._close;\n\t\t}\n\t\tif (this.options.keepInView) {\n\t\t\tevents.moveend = this._adjustPan;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t_close: function () {\n\t\tif (this._map) {\n\t\t\tthis._map.closePopup(this);\n\t\t}\n\t},\n\n\t_initLayout: function () {\n\t\tvar prefix = 'leaflet-popup',\n\t\t\tcontainerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' +\n\t\t\t (this._animated ? 'animated' : 'hide'),\n\t\t\tcontainer = this._container = L.DomUtil.create('div', containerClass),\n\t\t\tcloseButton;\n\n\t\tif (this.options.closeButton) {\n\t\t\tcloseButton = this._closeButton =\n\t\t\t L.DomUtil.create('a', prefix + '-close-button', container);\n\t\t\tcloseButton.href = '#close';\n\t\t\tcloseButton.innerHTML = '×';\n\t\t\tL.DomEvent.disableClickPropagation(closeButton);\n\n\t\t\tL.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);\n\t\t}\n\n\t\tvar wrapper = this._wrapper =\n\t\t L.DomUtil.create('div', prefix + '-content-wrapper', container);\n\t\tL.DomEvent.disableClickPropagation(wrapper);\n\n\t\tthis._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);\n\n\t\tL.DomEvent.disableScrollPropagation(this._contentNode);\n\t\tL.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);\n\n\t\tthis._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);\n\t\tthis._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);\n\t},\n\n\t_updateContent: function () {\n\t\tif (!this._content) { return; }\n\n\t\tif (typeof this._content === 'string') {\n\t\t\tthis._contentNode.innerHTML = this._content;\n\t\t} else {\n\t\t\twhile (this._contentNode.hasChildNodes()) {\n\t\t\t\tthis._contentNode.removeChild(this._contentNode.firstChild);\n\t\t\t}\n\t\t\tthis._contentNode.appendChild(this._content);\n\t\t}\n\t\tthis.fire('contentupdate');\n\t},\n\n\t_updateLayout: function () {\n\t\tvar container = this._contentNode,\n\t\t style = container.style;\n\n\t\tstyle.width = '';\n\t\tstyle.whiteSpace = 'nowrap';\n\n\t\tvar width = container.offsetWidth;\n\t\twidth = Math.min(width, this.options.maxWidth);\n\t\twidth = Math.max(width, this.options.minWidth);\n\n\t\tstyle.width = (width + 1) + 'px';\n\t\tstyle.whiteSpace = '';\n\n\t\tstyle.height = '';\n\n\t\tvar height = container.offsetHeight,\n\t\t maxHeight = this.options.maxHeight,\n\t\t scrolledClass = 'leaflet-popup-scrolled';\n\n\t\tif (maxHeight && height > maxHeight) {\n\t\t\tstyle.height = maxHeight + 'px';\n\t\t\tL.DomUtil.addClass(container, scrolledClass);\n\t\t} else {\n\t\t\tL.DomUtil.removeClass(container, scrolledClass);\n\t\t}\n\n\t\tthis._containerWidth = this._container.offsetWidth;\n\t},\n\n\t_updatePosition: function () {\n\t\tif (!this._map) { return; }\n\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng),\n\t\t animated = this._animated,\n\t\t offset = L.point(this.options.offset);\n\n\t\tif (animated) {\n\t\t\tL.DomUtil.setPosition(this._container, pos);\n\t\t}\n\n\t\tthis._containerBottom = -offset.y - (animated ? 0 : pos.y);\n\t\tthis._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x);\n\n\t\t// bottom position the popup in case the height of the popup changes (images loading etc)\n\t\tthis._container.style.bottom = this._containerBottom + 'px';\n\t\tthis._container.style.left = this._containerLeft + 'px';\n\t},\n\n\t_zoomAnimation: function (opt) {\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);\n\n\t\tL.DomUtil.setPosition(this._container, pos);\n\t},\n\n\t_adjustPan: function () {\n\t\tif (!this.options.autoPan) { return; }\n\n\t\tvar map = this._map,\n\t\t containerHeight = this._container.offsetHeight,\n\t\t containerWidth = this._containerWidth,\n\n\t\t layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);\n\n\t\tif (this._animated) {\n\t\t\tlayerPos._add(L.DomUtil.getPosition(this._container));\n\t\t}\n\n\t\tvar containerPos = map.layerPointToContainerPoint(layerPos),\n\t\t padding = L.point(this.options.autoPanPadding),\n\t\t paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),\n\t\t paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),\n\t\t size = map.getSize(),\n\t\t dx = 0,\n\t\t dy = 0;\n\n\t\tif (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\n\t\t\tdx = containerPos.x + containerWidth - size.x + paddingBR.x;\n\t\t}\n\t\tif (containerPos.x - dx - paddingTL.x < 0) { // left\n\t\t\tdx = containerPos.x - paddingTL.x;\n\t\t}\n\t\tif (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\n\t\t\tdy = containerPos.y + containerHeight - size.y + paddingBR.y;\n\t\t}\n\t\tif (containerPos.y - dy - paddingTL.y < 0) { // top\n\t\t\tdy = containerPos.y - paddingTL.y;\n\t\t}\n\n\t\tif (dx || dy) {\n\t\t\tmap\n\t\t\t .fire('autopanstart')\n\t\t\t .panBy([dx, dy]);\n\t\t}\n\t},\n\n\t_onCloseButtonClick: function (e) {\n\t\tthis._close();\n\t\tL.DomEvent.stop(e);\n\t}\n});\n\nL.popup = function (options, source) {\n\treturn new L.Popup(options, source);\n};\n\n\nL.Map.include({\n\topenPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object])\n\t\tthis.closePopup();\n\n\t\tif (!(popup instanceof L.Popup)) {\n\t\t\tvar content = popup;\n\n\t\t\tpopup = new L.Popup(options)\n\t\t\t .setLatLng(latlng)\n\t\t\t .setContent(content);\n\t\t}\n\t\tpopup._isOpen = true;\n\n\t\tthis._popup = popup;\n\t\treturn this.addLayer(popup);\n\t},\n\n\tclosePopup: function (popup) {\n\t\tif (!popup || popup === this._popup) {\n\t\t\tpopup = this._popup;\n\t\t\tthis._popup = null;\n\t\t}\n\t\tif (popup) {\n\t\t\tthis.removeLayer(popup);\n\t\t\tpopup._isOpen = false;\n\t\t}\n\t\treturn this;\n\t}\n});\n\n\n/*\n * Popup extension to L.Marker, adding popup-related methods.\n */\n\nL.Marker.include({\n\topenPopup: function () {\n\t\tif (this._popup && this._map && !this._map.hasLayer(this._popup)) {\n\t\t\tthis._popup.setLatLng(this._latlng);\n\t\t\tthis._map.openPopup(this._popup);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclosePopup: function () {\n\t\tif (this._popup) {\n\t\t\tthis._popup._close();\n\t\t}\n\t\treturn this;\n\t},\n\n\ttogglePopup: function () {\n\t\tif (this._popup) {\n\t\t\tif (this._popup._isOpen) {\n\t\t\t\tthis.closePopup();\n\t\t\t} else {\n\t\t\t\tthis.openPopup();\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\tbindPopup: function (content, options) {\n\t\tvar anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]);\n\n\t\tanchor = anchor.add(L.Popup.prototype.options.offset);\n\n\t\tif (options && options.offset) {\n\t\t\tanchor = anchor.add(options.offset);\n\t\t}\n\n\t\toptions = L.extend({offset: anchor}, options);\n\n\t\tif (!this._popupHandlersAdded) {\n\t\t\tthis\n\t\t\t .on('click', this.togglePopup, this)\n\t\t\t .on('remove', this.closePopup, this)\n\t\t\t .on('move', this._movePopup, this);\n\t\t\tthis._popupHandlersAdded = true;\n\t\t}\n\n\t\tif (content instanceof L.Popup) {\n\t\t\tL.setOptions(content, options);\n\t\t\tthis._popup = content;\n\t\t\tcontent._source = this;\n\t\t} else {\n\t\t\tthis._popup = new L.Popup(options, this)\n\t\t\t\t.setContent(content);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tsetPopupContent: function (content) {\n\t\tif (this._popup) {\n\t\t\tthis._popup.setContent(content);\n\t\t}\n\t\treturn this;\n\t},\n\n\tunbindPopup: function () {\n\t\tif (this._popup) {\n\t\t\tthis._popup = null;\n\t\t\tthis\n\t\t\t .off('click', this.togglePopup, this)\n\t\t\t .off('remove', this.closePopup, this)\n\t\t\t .off('move', this._movePopup, this);\n\t\t\tthis._popupHandlersAdded = false;\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetPopup: function () {\n\t\treturn this._popup;\n\t},\n\n\t_movePopup: function (e) {\n\t\tthis._popup.setLatLng(e.latlng);\n\t}\n});\n\n\n/*\n * L.LayerGroup is a class to combine several layers into one so that\n * you can manipulate the group (e.g. add/remove it) as one layer.\n */\n\nL.LayerGroup = L.Class.extend({\n\tinitialize: function (layers) {\n\t\tthis._layers = {};\n\n\t\tvar i, len;\n\n\t\tif (layers) {\n\t\t\tfor (i = 0, len = layers.length; i < len; i++) {\n\t\t\t\tthis.addLayer(layers[i]);\n\t\t\t}\n\t\t}\n\t},\n\n\taddLayer: function (layer) {\n\t\tvar id = this.getLayerId(layer);\n\n\t\tthis._layers[id] = layer;\n\n\t\tif (this._map) {\n\t\t\tthis._map.addLayer(layer);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveLayer: function (layer) {\n\t\tvar id = layer in this._layers ? layer : this.getLayerId(layer);\n\n\t\tif (this._map && this._layers[id]) {\n\t\t\tthis._map.removeLayer(this._layers[id]);\n\t\t}\n\n\t\tdelete this._layers[id];\n\n\t\treturn this;\n\t},\n\n\thasLayer: function (layer) {\n\t\tif (!layer) { return false; }\n\n\t\treturn (layer in this._layers || this.getLayerId(layer) in this._layers);\n\t},\n\n\tclearLayers: function () {\n\t\tthis.eachLayer(this.removeLayer, this);\n\t\treturn this;\n\t},\n\n\tinvoke: function (methodName) {\n\t\tvar args = Array.prototype.slice.call(arguments, 1),\n\t\t i, layer;\n\n\t\tfor (i in this._layers) {\n\t\t\tlayer = this._layers[i];\n\n\t\t\tif (layer[methodName]) {\n\t\t\t\tlayer[methodName].apply(layer, args);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\t\tthis.eachLayer(map.addLayer, map);\n\t},\n\n\tonRemove: function (map) {\n\t\tthis.eachLayer(map.removeLayer, map);\n\t\tthis._map = null;\n\t},\n\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\teachLayer: function (method, context) {\n\t\tfor (var i in this._layers) {\n\t\t\tmethod.call(context, this._layers[i]);\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetLayer: function (id) {\n\t\treturn this._layers[id];\n\t},\n\n\tgetLayers: function () {\n\t\tvar layers = [];\n\n\t\tfor (var i in this._layers) {\n\t\t\tlayers.push(this._layers[i]);\n\t\t}\n\t\treturn layers;\n\t},\n\n\tsetZIndex: function (zIndex) {\n\t\treturn this.invoke('setZIndex', zIndex);\n\t},\n\n\tgetLayerId: function (layer) {\n\t\treturn L.stamp(layer);\n\t}\n});\n\nL.layerGroup = function (layers) {\n\treturn new L.LayerGroup(layers);\n};\n\n\n/*\n * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods\n * shared between a group of interactive layers (like vectors or markers).\n */\n\nL.FeatureGroup = L.LayerGroup.extend({\n\tincludes: L.Mixin.Events,\n\n\tstatics: {\n\t\tEVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose'\n\t},\n\n\taddLayer: function (layer) {\n\t\tif (this.hasLayer(layer)) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ('on' in layer) {\n\t\t\tlayer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);\n\t\t}\n\n\t\tL.LayerGroup.prototype.addLayer.call(this, layer);\n\n\t\tif (this._popupContent && layer.bindPopup) {\n\t\t\tlayer.bindPopup(this._popupContent, this._popupOptions);\n\t\t}\n\n\t\treturn this.fire('layeradd', {layer: layer});\n\t},\n\n\tremoveLayer: function (layer) {\n\t\tif (!this.hasLayer(layer)) {\n\t\t\treturn this;\n\t\t}\n\t\tif (layer in this._layers) {\n\t\t\tlayer = this._layers[layer];\n\t\t}\n\n\t\tif ('off' in layer) {\n\t\t\tlayer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this);\n\t\t}\n\n\t\tL.LayerGroup.prototype.removeLayer.call(this, layer);\n\n\t\tif (this._popupContent) {\n\t\t\tthis.invoke('unbindPopup');\n\t\t}\n\n\t\treturn this.fire('layerremove', {layer: layer});\n\t},\n\n\tbindPopup: function (content, options) {\n\t\tthis._popupContent = content;\n\t\tthis._popupOptions = options;\n\t\treturn this.invoke('bindPopup', content, options);\n\t},\n\n\topenPopup: function (latlng) {\n\t\t// open popup on the first layer\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id].openPopup(latlng);\n\t\t\tbreak;\n\t\t}\n\t\treturn this;\n\t},\n\n\tsetStyle: function (style) {\n\t\treturn this.invoke('setStyle', style);\n\t},\n\n\tbringToFront: function () {\n\t\treturn this.invoke('bringToFront');\n\t},\n\n\tbringToBack: function () {\n\t\treturn this.invoke('bringToBack');\n\t},\n\n\tgetBounds: function () {\n\t\tvar bounds = new L.LatLngBounds();\n\n\t\tthis.eachLayer(function (layer) {\n\t\t\tbounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds());\n\t\t});\n\n\t\treturn bounds;\n\t},\n\n\t_propagateEvent: function (e) {\n\t\te = L.extend({\n\t\t\tlayer: e.target,\n\t\t\ttarget: this\n\t\t}, e);\n\t\tthis.fire(e.type, e);\n\t}\n});\n\nL.featureGroup = function (layers) {\n\treturn new L.FeatureGroup(layers);\n};\n\n\n/*\n * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc.\n */\n\nL.Path = L.Class.extend({\n\tincludes: [L.Mixin.Events],\n\n\tstatics: {\n\t\t// how much to extend the clip area around the map view\n\t\t// (relative to its size, e.g. 0.5 is half the screen in each direction)\n\t\t// set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is)\n\t\tCLIP_PADDING: (function () {\n\t\t\tvar max = L.Browser.mobile ? 1280 : 2000,\n\t\t\t target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2;\n\t\t\treturn Math.max(0, Math.min(0.5, target));\n\t\t})()\n\t},\n\n\toptions: {\n\t\tstroke: true,\n\t\tcolor: '#0033ff',\n\t\tdashArray: null,\n\t\tlineCap: null,\n\t\tlineJoin: null,\n\t\tweight: 5,\n\t\topacity: 0.5,\n\n\t\tfill: false,\n\t\tfillColor: null, //same as color by default\n\t\tfillOpacity: 0.2,\n\n\t\tclickable: true\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\n\t\tif (!this._container) {\n\t\t\tthis._initElements();\n\t\t\tthis._initEvents();\n\t\t}\n\n\t\tthis.projectLatlngs();\n\t\tthis._updatePath();\n\n\t\tif (this._container) {\n\t\t\tthis._map._pathRoot.appendChild(this._container);\n\t\t}\n\n\t\tthis.fire('add');\n\n\t\tmap.on({\n\t\t\t'viewreset': this.projectLatlngs,\n\t\t\t'moveend': this._updatePath\n\t\t}, this);\n\t},\n\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap._pathRoot.removeChild(this._container);\n\n\t\t// Need to fire remove event before we set _map to null as the event hooks might need the object\n\t\tthis.fire('remove');\n\t\tthis._map = null;\n\n\t\tif (L.Browser.vml) {\n\t\t\tthis._container = null;\n\t\t\tthis._stroke = null;\n\t\t\tthis._fill = null;\n\t\t}\n\n\t\tmap.off({\n\t\t\t'viewreset': this.projectLatlngs,\n\t\t\t'moveend': this._updatePath\n\t\t}, this);\n\t},\n\n\tprojectLatlngs: function () {\n\t\t// do all projection stuff here\n\t},\n\n\tsetStyle: function (style) {\n\t\tL.setOptions(this, style);\n\n\t\tif (this._container) {\n\t\t\tthis._updateStyle();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis.projectLatlngs();\n\t\t\tthis._updatePath();\n\t\t}\n\t\treturn this;\n\t}\n});\n\nL.Map.include({\n\t_updatePathViewport: function () {\n\t\tvar p = L.Path.CLIP_PADDING,\n\t\t size = this.getSize(),\n\t\t panePos = L.DomUtil.getPosition(this._mapPane),\n\t\t min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()),\n\t\t max = min.add(size.multiplyBy(1 + p * 2)._round());\n\n\t\tthis._pathViewport = new L.Bounds(min, max);\n\t}\n});\n\n\n/*\n * Extends L.Path with SVG-specific rendering code.\n */\n\nL.Path.SVG_NS = 'http://www.w3.org/2000/svg';\n\nL.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect);\n\nL.Path = L.Path.extend({\n\tstatics: {\n\t\tSVG: L.Browser.svg\n\t},\n\n\tbringToFront: function () {\n\t\tvar root = this._map._pathRoot,\n\t\t path = this._container;\n\n\t\tif (path && root.lastChild !== path) {\n\t\t\troot.appendChild(path);\n\t\t}\n\t\treturn this;\n\t},\n\n\tbringToBack: function () {\n\t\tvar root = this._map._pathRoot,\n\t\t path = this._container,\n\t\t first = root.firstChild;\n\n\t\tif (path && first !== path) {\n\t\t\troot.insertBefore(path, first);\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetPathString: function () {\n\t\t// form path string here\n\t},\n\n\t_createElement: function (name) {\n\t\treturn document.createElementNS(L.Path.SVG_NS, name);\n\t},\n\n\t_initElements: function () {\n\t\tthis._map._initPathRoot();\n\t\tthis._initPath();\n\t\tthis._initStyle();\n\t},\n\n\t_initPath: function () {\n\t\tthis._container = this._createElement('g');\n\n\t\tthis._path = this._createElement('path');\n\n\t\tif (this.options.className) {\n\t\t\tL.DomUtil.addClass(this._path, this.options.className);\n\t\t}\n\n\t\tthis._container.appendChild(this._path);\n\t},\n\n\t_initStyle: function () {\n\t\tif (this.options.stroke) {\n\t\t\tthis._path.setAttribute('stroke-linejoin', 'round');\n\t\t\tthis._path.setAttribute('stroke-linecap', 'round');\n\t\t}\n\t\tif (this.options.fill) {\n\t\t\tthis._path.setAttribute('fill-rule', 'evenodd');\n\t\t}\n\t\tif (this.options.pointerEvents) {\n\t\t\tthis._path.setAttribute('pointer-events', this.options.pointerEvents);\n\t\t}\n\t\tif (!this.options.clickable && !this.options.pointerEvents) {\n\t\t\tthis._path.setAttribute('pointer-events', 'none');\n\t\t}\n\t\tthis._updateStyle();\n\t},\n\n\t_updateStyle: function () {\n\t\tif (this.options.stroke) {\n\t\t\tthis._path.setAttribute('stroke', this.options.color);\n\t\t\tthis._path.setAttribute('stroke-opacity', this.options.opacity);\n\t\t\tthis._path.setAttribute('stroke-width', this.options.weight);\n\t\t\tif (this.options.dashArray) {\n\t\t\t\tthis._path.setAttribute('stroke-dasharray', this.options.dashArray);\n\t\t\t} else {\n\t\t\t\tthis._path.removeAttribute('stroke-dasharray');\n\t\t\t}\n\t\t\tif (this.options.lineCap) {\n\t\t\t\tthis._path.setAttribute('stroke-linecap', this.options.lineCap);\n\t\t\t}\n\t\t\tif (this.options.lineJoin) {\n\t\t\t\tthis._path.setAttribute('stroke-linejoin', this.options.lineJoin);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._path.setAttribute('stroke', 'none');\n\t\t}\n\t\tif (this.options.fill) {\n\t\t\tthis._path.setAttribute('fill', this.options.fillColor || this.options.color);\n\t\t\tthis._path.setAttribute('fill-opacity', this.options.fillOpacity);\n\t\t} else {\n\t\t\tthis._path.setAttribute('fill', 'none');\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tvar str = this.getPathString();\n\t\tif (!str) {\n\t\t\t// fix webkit empty string parsing bug\n\t\t\tstr = 'M0 0';\n\t\t}\n\t\tthis._path.setAttribute('d', str);\n\t},\n\n\t// TODO remove duplication with L.Map\n\t_initEvents: function () {\n\t\tif (this.options.clickable) {\n\t\t\tif (L.Browser.svg || !L.Browser.vml) {\n\t\t\t\tL.DomUtil.addClass(this._path, 'leaflet-clickable');\n\t\t\t}\n\n\t\t\tL.DomEvent.on(this._container, 'click', this._onMouseClick, this);\n\n\t\t\tvar events = ['dblclick', 'mousedown', 'mouseover',\n\t\t\t 'mouseout', 'mousemove', 'contextmenu'];\n\t\t\tfor (var i = 0; i < events.length; i++) {\n\t\t\t\tL.DomEvent.on(this._container, events[i], this._fireMouseEvent, this);\n\t\t\t}\n\t\t}\n\t},\n\n\t_onMouseClick: function (e) {\n\t\tif (this._map.dragging && this._map.dragging.moved()) { return; }\n\n\t\tthis._fireMouseEvent(e);\n\t},\n\n\t_fireMouseEvent: function (e) {\n\t\tif (!this._map || !this.hasEventListeners(e.type)) { return; }\n\n\t\tvar map = this._map,\n\t\t containerPoint = map.mouseEventToContainerPoint(e),\n\t\t layerPoint = map.containerPointToLayerPoint(containerPoint),\n\t\t latlng = map.layerPointToLatLng(layerPoint);\n\n\t\tthis.fire(e.type, {\n\t\t\tlatlng: latlng,\n\t\t\tlayerPoint: layerPoint,\n\t\t\tcontainerPoint: containerPoint,\n\t\t\toriginalEvent: e\n\t\t});\n\n\t\tif (e.type === 'contextmenu') {\n\t\t\tL.DomEvent.preventDefault(e);\n\t\t}\n\t\tif (e.type !== 'mousemove') {\n\t\t\tL.DomEvent.stopPropagation(e);\n\t\t}\n\t}\n});\n\nL.Map.include({\n\t_initPathRoot: function () {\n\t\tif (!this._pathRoot) {\n\t\t\tthis._pathRoot = L.Path.prototype._createElement('svg');\n\t\t\tthis._panes.overlayPane.appendChild(this._pathRoot);\n\n\t\t\tif (this.options.zoomAnimation && L.Browser.any3d) {\n\t\t\t\tL.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated');\n\n\t\t\t\tthis.on({\n\t\t\t\t\t'zoomanim': this._animatePathZoom,\n\t\t\t\t\t'zoomend': this._endPathZoom\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tL.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide');\n\t\t\t}\n\n\t\t\tthis.on('moveend', this._updateSvgViewport);\n\t\t\tthis._updateSvgViewport();\n\t\t}\n\t},\n\n\t_animatePathZoom: function (e) {\n\t\tvar scale = this.getZoomScale(e.zoom),\n\t\t offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min);\n\n\t\tthis._pathRoot.style[L.DomUtil.TRANSFORM] =\n\t\t L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') ';\n\n\t\tthis._pathZooming = true;\n\t},\n\n\t_endPathZoom: function () {\n\t\tthis._pathZooming = false;\n\t},\n\n\t_updateSvgViewport: function () {\n\n\t\tif (this._pathZooming) {\n\t\t\t// Do not update SVGs while a zoom animation is going on otherwise the animation will break.\n\t\t\t// When the zoom animation ends we will be updated again anyway\n\t\t\t// This fixes the case where you do a momentum move and zoom while the move is still ongoing.\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updatePathViewport();\n\n\t\tvar vp = this._pathViewport,\n\t\t min = vp.min,\n\t\t max = vp.max,\n\t\t width = max.x - min.x,\n\t\t height = max.y - min.y,\n\t\t root = this._pathRoot,\n\t\t pane = this._panes.overlayPane;\n\n\t\t// Hack to make flicker on drag end on mobile webkit less irritating\n\t\tif (L.Browser.mobileWebkit) {\n\t\t\tpane.removeChild(root);\n\t\t}\n\n\t\tL.DomUtil.setPosition(root, min);\n\t\troot.setAttribute('width', width);\n\t\troot.setAttribute('height', height);\n\t\troot.setAttribute('viewBox', [min.x, min.y, width, height].join(' '));\n\n\t\tif (L.Browser.mobileWebkit) {\n\t\t\tpane.appendChild(root);\n\t\t}\n\t}\n});\n\n\n/*\n * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods.\n */\n\nL.Path.include({\n\n\tbindPopup: function (content, options) {\n\n\t\tif (content instanceof L.Popup) {\n\t\t\tthis._popup = content;\n\t\t} else {\n\t\t\tif (!this._popup || options) {\n\t\t\t\tthis._popup = new L.Popup(options, this);\n\t\t\t}\n\t\t\tthis._popup.setContent(content);\n\t\t}\n\n\t\tif (!this._popupHandlersAdded) {\n\t\t\tthis\n\t\t\t .on('click', this._openPopup, this)\n\t\t\t .on('remove', this.closePopup, this);\n\n\t\t\tthis._popupHandlersAdded = true;\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tunbindPopup: function () {\n\t\tif (this._popup) {\n\t\t\tthis._popup = null;\n\t\t\tthis\n\t\t\t .off('click', this._openPopup)\n\t\t\t .off('remove', this.closePopup);\n\n\t\t\tthis._popupHandlersAdded = false;\n\t\t}\n\t\treturn this;\n\t},\n\n\topenPopup: function (latlng) {\n\n\t\tif (this._popup) {\n\t\t\t// open the popup from one of the path's points if not specified\n\t\t\tlatlng = latlng || this._latlng ||\n\t\t\t this._latlngs[Math.floor(this._latlngs.length / 2)];\n\n\t\t\tthis._openPopup({latlng: latlng});\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclosePopup: function () {\n\t\tif (this._popup) {\n\t\t\tthis._popup._close();\n\t\t}\n\t\treturn this;\n\t},\n\n\t_openPopup: function (e) {\n\t\tthis._popup.setLatLng(e.latlng);\n\t\tthis._map.openPopup(this._popup);\n\t}\n});\n\n\n/*\n * Vector rendering for IE6-8 through VML.\n * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!\n */\n\nL.Browser.vml = !L.Browser.svg && (function () {\n\ttry {\n\t\tvar div = document.createElement('div');\n\t\tdiv.innerHTML = '';\n\n\t\tvar shape = div.firstChild;\n\t\tshape.style.behavior = 'url(#default#VML)';\n\n\t\treturn shape && (typeof shape.adj === 'object');\n\n\t} catch (e) {\n\t\treturn false;\n\t}\n}());\n\nL.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({\n\tstatics: {\n\t\tVML: true,\n\t\tCLIP_PADDING: 0.02\n\t},\n\n\t_createElement: (function () {\n\t\ttry {\n\t\t\tdocument.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');\n\t\t\treturn function (name) {\n\t\t\t\treturn document.createElement('');\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn function (name) {\n\t\t\t\treturn document.createElement(\n\t\t\t\t '<' + name + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">');\n\t\t\t};\n\t\t}\n\t}()),\n\n\t_initPath: function () {\n\t\tvar container = this._container = this._createElement('shape');\n\n\t\tL.DomUtil.addClass(container, 'leaflet-vml-shape' +\n\t\t\t(this.options.className ? ' ' + this.options.className : ''));\n\n\t\tif (this.options.clickable) {\n\t\t\tL.DomUtil.addClass(container, 'leaflet-clickable');\n\t\t}\n\n\t\tcontainer.coordsize = '1 1';\n\n\t\tthis._path = this._createElement('path');\n\t\tcontainer.appendChild(this._path);\n\n\t\tthis._map._pathRoot.appendChild(container);\n\t},\n\n\t_initStyle: function () {\n\t\tthis._updateStyle();\n\t},\n\n\t_updateStyle: function () {\n\t\tvar stroke = this._stroke,\n\t\t fill = this._fill,\n\t\t options = this.options,\n\t\t container = this._container;\n\n\t\tcontainer.stroked = options.stroke;\n\t\tcontainer.filled = options.fill;\n\n\t\tif (options.stroke) {\n\t\t\tif (!stroke) {\n\t\t\t\tstroke = this._stroke = this._createElement('stroke');\n\t\t\t\tstroke.endcap = 'round';\n\t\t\t\tcontainer.appendChild(stroke);\n\t\t\t}\n\t\t\tstroke.weight = options.weight + 'px';\n\t\t\tstroke.color = options.color;\n\t\t\tstroke.opacity = options.opacity;\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tstroke.dashStyle = L.Util.isArray(options.dashArray) ?\n\t\t\t\t options.dashArray.join(' ') :\n\t\t\t\t options.dashArray.replace(/( *, *)/g, ' ');\n\t\t\t} else {\n\t\t\t\tstroke.dashStyle = '';\n\t\t\t}\n\t\t\tif (options.lineCap) {\n\t\t\t\tstroke.endcap = options.lineCap.replace('butt', 'flat');\n\t\t\t}\n\t\t\tif (options.lineJoin) {\n\t\t\t\tstroke.joinstyle = options.lineJoin;\n\t\t\t}\n\n\t\t} else if (stroke) {\n\t\t\tcontainer.removeChild(stroke);\n\t\t\tthis._stroke = null;\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tif (!fill) {\n\t\t\t\tfill = this._fill = this._createElement('fill');\n\t\t\t\tcontainer.appendChild(fill);\n\t\t\t}\n\t\t\tfill.color = options.fillColor || options.color;\n\t\t\tfill.opacity = options.fillOpacity;\n\n\t\t} else if (fill) {\n\t\t\tcontainer.removeChild(fill);\n\t\t\tthis._fill = null;\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tvar style = this._container.style;\n\n\t\tstyle.display = 'none';\n\t\tthis._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug\n\t\tstyle.display = '';\n\t}\n});\n\nL.Map.include(L.Browser.svg || !L.Browser.vml ? {} : {\n\t_initPathRoot: function () {\n\t\tif (this._pathRoot) { return; }\n\n\t\tvar root = this._pathRoot = document.createElement('div');\n\t\troot.className = 'leaflet-vml-container';\n\t\tthis._panes.overlayPane.appendChild(root);\n\n\t\tthis.on('moveend', this._updatePathViewport);\n\t\tthis._updatePathViewport();\n\t}\n});\n\n\n/*\n * Vector rendering for all browsers that support canvas.\n */\n\nL.Browser.canvas = (function () {\n\treturn !!document.createElement('canvas').getContext;\n}());\n\nL.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({\n\tstatics: {\n\t\t//CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value\n\t\tCANVAS: true,\n\t\tSVG: false\n\t},\n\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis.projectLatlngs();\n\t\t\tthis._requestUpdate();\n\t\t}\n\t\treturn this;\n\t},\n\n\tsetStyle: function (style) {\n\t\tL.setOptions(this, style);\n\n\t\tif (this._map) {\n\t\t\tthis._updateStyle();\n\t\t\tthis._requestUpdate();\n\t\t}\n\t\treturn this;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap\n\t\t .off('viewreset', this.projectLatlngs, this)\n\t\t .off('moveend', this._updatePath, this);\n\n\t\tif (this.options.clickable) {\n\t\t\tthis._map.off('click', this._onClick, this);\n\t\t\tthis._map.off('mousemove', this._onMouseMove, this);\n\t\t}\n\n\t\tthis._requestUpdate();\n\t\t\n\t\tthis.fire('remove');\n\t\tthis._map = null;\n\t},\n\n\t_requestUpdate: function () {\n\t\tif (this._map && !L.Path._updateRequest) {\n\t\t\tL.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map);\n\t\t}\n\t},\n\n\t_fireMapMoveEnd: function () {\n\t\tL.Path._updateRequest = null;\n\t\tthis.fire('moveend');\n\t},\n\n\t_initElements: function () {\n\t\tthis._map._initPathRoot();\n\t\tthis._ctx = this._map._canvasCtx;\n\t},\n\n\t_updateStyle: function () {\n\t\tvar options = this.options;\n\n\t\tif (options.stroke) {\n\t\t\tthis._ctx.lineWidth = options.weight;\n\t\t\tthis._ctx.strokeStyle = options.color;\n\t\t}\n\t\tif (options.fill) {\n\t\t\tthis._ctx.fillStyle = options.fillColor || options.color;\n\t\t}\n\n\t\tif (options.lineCap) {\n\t\t\tthis._ctx.lineCap = options.lineCap;\n\t\t}\n\t\tif (options.lineJoin) {\n\t\t\tthis._ctx.lineJoin = options.lineJoin;\n\t\t}\n\t},\n\n\t_drawPath: function () {\n\t\tvar i, j, len, len2, point, drawMethod;\n\n\t\tthis._ctx.beginPath();\n\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\t\tfor (j = 0, len2 = this._parts[i].length; j < len2; j++) {\n\t\t\t\tpoint = this._parts[i][j];\n\t\t\t\tdrawMethod = (j === 0 ? 'move' : 'line') + 'To';\n\n\t\t\t\tthis._ctx[drawMethod](point.x, point.y);\n\t\t\t}\n\t\t\t// TODO refactor ugly hack\n\t\t\tif (this instanceof L.Polygon) {\n\t\t\t\tthis._ctx.closePath();\n\t\t\t}\n\t\t}\n\t},\n\n\t_checkIfEmpty: function () {\n\t\treturn !this._parts.length;\n\t},\n\n\t_updatePath: function () {\n\t\tif (this._checkIfEmpty()) { return; }\n\n\t\tvar ctx = this._ctx,\n\t\t options = this.options;\n\n\t\tthis._drawPath();\n\t\tctx.save();\n\t\tthis._updateStyle();\n\n\t\tif (options.fill) {\n\t\t\tctx.globalAlpha = options.fillOpacity;\n\t\t\tctx.fill(options.fillRule || 'evenodd');\n\t\t}\n\n\t\tif (options.stroke) {\n\t\t\tctx.globalAlpha = options.opacity;\n\t\t\tctx.stroke();\n\t\t}\n\n\t\tctx.restore();\n\n\t\t// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature\n\t},\n\n\t_initEvents: function () {\n\t\tif (this.options.clickable) {\n\t\t\tthis._map.on('mousemove', this._onMouseMove, this);\n\t\t\tthis._map.on('click dblclick contextmenu', this._fireMouseEvent, this);\n\t\t}\n\t},\n\n\t_fireMouseEvent: function (e) {\n\t\tif (this._containsPoint(e.layerPoint)) {\n\t\t\tthis.fire(e.type, e);\n\t\t}\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._map || this._map._animatingZoom) { return; }\n\n\t\t// TODO don't do on each move\n\t\tif (this._containsPoint(e.layerPoint)) {\n\t\t\tthis._ctx.canvas.style.cursor = 'pointer';\n\t\t\tthis._mouseInside = true;\n\t\t\tthis.fire('mouseover', e);\n\n\t\t} else if (this._mouseInside) {\n\t\t\tthis._ctx.canvas.style.cursor = '';\n\t\t\tthis._mouseInside = false;\n\t\t\tthis.fire('mouseout', e);\n\t\t}\n\t}\n});\n\nL.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : {\n\t_initPathRoot: function () {\n\t\tvar root = this._pathRoot,\n\t\t ctx;\n\n\t\tif (!root) {\n\t\t\troot = this._pathRoot = document.createElement('canvas');\n\t\t\troot.style.position = 'absolute';\n\t\t\tctx = this._canvasCtx = root.getContext('2d');\n\n\t\t\tctx.lineCap = 'round';\n\t\t\tctx.lineJoin = 'round';\n\n\t\t\tthis._panes.overlayPane.appendChild(root);\n\n\t\t\tif (this.options.zoomAnimation) {\n\t\t\t\tthis._pathRoot.className = 'leaflet-zoom-animated';\n\t\t\t\tthis.on('zoomanim', this._animatePathZoom);\n\t\t\t\tthis.on('zoomend', this._endPathZoom);\n\t\t\t}\n\t\t\tthis.on('moveend', this._updateCanvasViewport);\n\t\t\tthis._updateCanvasViewport();\n\t\t}\n\t},\n\n\t_updateCanvasViewport: function () {\n\t\t// don't redraw while zooming. See _updateSvgViewport for more details\n\t\tif (this._pathZooming) { return; }\n\t\tthis._updatePathViewport();\n\n\t\tvar vp = this._pathViewport,\n\t\t min = vp.min,\n\t\t size = vp.max.subtract(min),\n\t\t root = this._pathRoot;\n\n\t\t//TODO check if this works properly on mobile webkit\n\t\tL.DomUtil.setPosition(root, min);\n\t\troot.width = size.x;\n\t\troot.height = size.y;\n\t\troot.getContext('2d').translate(-min.x, -min.y);\n\t}\n});\n\n\n/*\n * L.LineUtil contains different utility functions for line segments\n * and polylines (clipping, simplification, distances, etc.)\n */\n\n/*jshint bitwise:false */ // allow bitwise operations for this file\n\nL.LineUtil = {\n\n\t// Simplify polyline with vertex reduction and Douglas-Peucker simplification.\n\t// Improves rendering performance dramatically by lessening the number of points to draw.\n\n\tsimplify: function (/*Point[]*/ points, /*Number*/ tolerance) {\n\t\tif (!tolerance || !points.length) {\n\t\t\treturn points.slice();\n\t\t}\n\n\t\tvar sqTolerance = tolerance * tolerance;\n\n\t\t// stage 1: vertex reduction\n\t\tpoints = this._reducePoints(points, sqTolerance);\n\n\t\t// stage 2: Douglas-Peucker simplification\n\t\tpoints = this._simplifyDP(points, sqTolerance);\n\n\t\treturn points;\n\t},\n\n\t// distance from a point to a segment between two points\n\tpointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {\n\t\treturn Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));\n\t},\n\n\tclosestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {\n\t\treturn this._sqClosestPointOnSegment(p, p1, p2);\n\t},\n\n\t// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm\n\t_simplifyDP: function (points, sqTolerance) {\n\n\t\tvar len = points.length,\n\t\t ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,\n\t\t markers = new ArrayConstructor(len);\n\n\t\tmarkers[0] = markers[len - 1] = 1;\n\n\t\tthis._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);\n\n\t\tvar i,\n\t\t newPoints = [];\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (markers[i]) {\n\t\t\t\tnewPoints.push(points[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn newPoints;\n\t},\n\n\t_simplifyDPStep: function (points, markers, sqTolerance, first, last) {\n\n\t\tvar maxSqDist = 0,\n\t\t index, i, sqDist;\n\n\t\tfor (i = first + 1; i <= last - 1; i++) {\n\t\t\tsqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);\n\n\t\t\tif (sqDist > maxSqDist) {\n\t\t\t\tindex = i;\n\t\t\t\tmaxSqDist = sqDist;\n\t\t\t}\n\t\t}\n\n\t\tif (maxSqDist > sqTolerance) {\n\t\t\tmarkers[index] = 1;\n\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, first, index);\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, index, last);\n\t\t}\n\t},\n\n\t// reduce points that are too close to each other to a single point\n\t_reducePoints: function (points, sqTolerance) {\n\t\tvar reducedPoints = [points[0]];\n\n\t\tfor (var i = 1, prev = 0, len = points.length; i < len; i++) {\n\t\t\tif (this._sqDist(points[i], points[prev]) > sqTolerance) {\n\t\t\t\treducedPoints.push(points[i]);\n\t\t\t\tprev = i;\n\t\t\t}\n\t\t}\n\t\tif (prev < len - 1) {\n\t\t\treducedPoints.push(points[len - 1]);\n\t\t}\n\t\treturn reducedPoints;\n\t},\n\n\t// Cohen-Sutherland line clipping algorithm.\n\t// Used to avoid rendering parts of a polyline that are not currently visible.\n\n\tclipSegment: function (a, b, bounds, useLastCode) {\n\t\tvar codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),\n\t\t codeB = this._getBitCode(b, bounds),\n\n\t\t codeOut, p, newCode;\n\n\t\t// save 2nd code to avoid calculating it on the next segment\n\t\tthis._lastCode = codeB;\n\n\t\twhile (true) {\n\t\t\t// if a,b is inside the clip window (trivial accept)\n\t\t\tif (!(codeA | codeB)) {\n\t\t\t\treturn [a, b];\n\t\t\t// if a,b is outside the clip window (trivial reject)\n\t\t\t} else if (codeA & codeB) {\n\t\t\t\treturn false;\n\t\t\t// other cases\n\t\t\t} else {\n\t\t\t\tcodeOut = codeA || codeB;\n\t\t\t\tp = this._getEdgeIntersection(a, b, codeOut, bounds);\n\t\t\t\tnewCode = this._getBitCode(p, bounds);\n\n\t\t\t\tif (codeOut === codeA) {\n\t\t\t\t\ta = p;\n\t\t\t\t\tcodeA = newCode;\n\t\t\t\t} else {\n\t\t\t\t\tb = p;\n\t\t\t\t\tcodeB = newCode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_getEdgeIntersection: function (a, b, code, bounds) {\n\t\tvar dx = b.x - a.x,\n\t\t dy = b.y - a.y,\n\t\t min = bounds.min,\n\t\t max = bounds.max;\n\n\t\tif (code & 8) { // top\n\t\t\treturn new L.Point(a.x + dx * (max.y - a.y) / dy, max.y);\n\t\t} else if (code & 4) { // bottom\n\t\t\treturn new L.Point(a.x + dx * (min.y - a.y) / dy, min.y);\n\t\t} else if (code & 2) { // right\n\t\t\treturn new L.Point(max.x, a.y + dy * (max.x - a.x) / dx);\n\t\t} else if (code & 1) { // left\n\t\t\treturn new L.Point(min.x, a.y + dy * (min.x - a.x) / dx);\n\t\t}\n\t},\n\n\t_getBitCode: function (/*Point*/ p, bounds) {\n\t\tvar code = 0;\n\n\t\tif (p.x < bounds.min.x) { // left\n\t\t\tcode |= 1;\n\t\t} else if (p.x > bounds.max.x) { // right\n\t\t\tcode |= 2;\n\t\t}\n\t\tif (p.y < bounds.min.y) { // bottom\n\t\t\tcode |= 4;\n\t\t} else if (p.y > bounds.max.y) { // top\n\t\t\tcode |= 8;\n\t\t}\n\n\t\treturn code;\n\t},\n\n\t// square distance (to avoid unnecessary Math.sqrt calls)\n\t_sqDist: function (p1, p2) {\n\t\tvar dx = p2.x - p1.x,\n\t\t dy = p2.y - p1.y;\n\t\treturn dx * dx + dy * dy;\n\t},\n\n\t// return closest point on segment or distance to that point\n\t_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {\n\t\tvar x = p1.x,\n\t\t y = p1.y,\n\t\t dx = p2.x - x,\n\t\t dy = p2.y - y,\n\t\t dot = dx * dx + dy * dy,\n\t\t t;\n\n\t\tif (dot > 0) {\n\t\t\tt = ((p.x - x) * dx + (p.y - y) * dy) / dot;\n\n\t\t\tif (t > 1) {\n\t\t\t\tx = p2.x;\n\t\t\t\ty = p2.y;\n\t\t\t} else if (t > 0) {\n\t\t\t\tx += dx * t;\n\t\t\t\ty += dy * t;\n\t\t\t}\n\t\t}\n\n\t\tdx = p.x - x;\n\t\tdy = p.y - y;\n\n\t\treturn sqDist ? dx * dx + dy * dy : new L.Point(x, y);\n\t}\n};\n\n\n/*\n * L.Polyline is used to display polylines on a map.\n */\n\nL.Polyline = L.Path.extend({\n\tinitialize: function (latlngs, options) {\n\t\tL.Path.prototype.initialize.call(this, options);\n\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\n\t},\n\n\toptions: {\n\t\t// how much to simplify the polyline on each zoom level\n\t\t// more = better performance and smoother look, less = more accurate\n\t\tsmoothFactor: 1.0,\n\t\tnoClip: false\n\t},\n\n\tprojectLatlngs: function () {\n\t\tthis._originalPoints = [];\n\n\t\tfor (var i = 0, len = this._latlngs.length; i < len; i++) {\n\t\t\tthis._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]);\n\t\t}\n\t},\n\n\tgetPathString: function () {\n\t\tfor (var i = 0, len = this._parts.length, str = ''; i < len; i++) {\n\t\t\tstr += this._getPathPartStr(this._parts[i]);\n\t\t}\n\t\treturn str;\n\t},\n\n\tgetLatLngs: function () {\n\t\treturn this._latlngs;\n\t},\n\n\tsetLatLngs: function (latlngs) {\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\n\t\treturn this.redraw();\n\t},\n\n\taddLatLng: function (latlng) {\n\t\tthis._latlngs.push(L.latLng(latlng));\n\t\treturn this.redraw();\n\t},\n\n\tspliceLatLngs: function () { // (Number index, Number howMany)\n\t\tvar removed = [].splice.apply(this._latlngs, arguments);\n\t\tthis._convertLatLngs(this._latlngs, true);\n\t\tthis.redraw();\n\t\treturn removed;\n\t},\n\n\tclosestLayerPoint: function (p) {\n\t\tvar minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null;\n\n\t\tfor (var j = 0, jLen = parts.length; j < jLen; j++) {\n\t\t\tvar points = parts[j];\n\t\t\tfor (var i = 1, len = points.length; i < len; i++) {\n\t\t\t\tp1 = points[i - 1];\n\t\t\t\tp2 = points[i];\n\t\t\t\tvar sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true);\n\t\t\t\tif (sqDist < minDistance) {\n\t\t\t\t\tminDistance = sqDist;\n\t\t\t\t\tminPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (minPoint) {\n\t\t\tminPoint.distance = Math.sqrt(minDistance);\n\t\t}\n\t\treturn minPoint;\n\t},\n\n\tgetBounds: function () {\n\t\treturn new L.LatLngBounds(this.getLatLngs());\n\t},\n\n\t_convertLatLngs: function (latlngs, overwrite) {\n\t\tvar i, len, target = overwrite ? latlngs : [];\n\n\t\tfor (i = 0, len = latlngs.length; i < len; i++) {\n\t\t\tif (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttarget[i] = L.latLng(latlngs[i]);\n\t\t}\n\t\treturn target;\n\t},\n\n\t_initEvents: function () {\n\t\tL.Path.prototype._initEvents.call(this);\n\t},\n\n\t_getPathPartStr: function (points) {\n\t\tvar round = L.Path.VML;\n\n\t\tfor (var j = 0, len2 = points.length, str = '', p; j < len2; j++) {\n\t\t\tp = points[j];\n\t\t\tif (round) {\n\t\t\t\tp._round();\n\t\t\t}\n\t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\n\t\t}\n\t\treturn str;\n\t},\n\n\t_clipPoints: function () {\n\t\tvar points = this._originalPoints,\n\t\t len = points.length,\n\t\t i, k, segment;\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = [points];\n\t\t\treturn;\n\t\t}\n\n\t\tthis._parts = [];\n\n\t\tvar parts = this._parts,\n\t\t vp = this._map._pathViewport,\n\t\t lu = L.LineUtil;\n\n\t\tfor (i = 0, k = 0; i < len - 1; i++) {\n\t\t\tsegment = lu.clipSegment(points[i], points[i + 1], vp, i);\n\t\t\tif (!segment) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tparts[k] = parts[k] || [];\n\t\t\tparts[k].push(segment[0]);\n\n\t\t\t// if segment goes out of screen, or it's the last one, it's the end of the line part\n\t\t\tif ((segment[1] !== points[i + 1]) || (i === len - 2)) {\n\t\t\t\tparts[k].push(segment[1]);\n\t\t\t\tk++;\n\t\t\t}\n\t\t}\n\t},\n\n\t// simplify each clipped part of the polyline\n\t_simplifyPoints: function () {\n\t\tvar parts = this._parts,\n\t\t lu = L.LineUtil;\n\n\t\tfor (var i = 0, len = parts.length; i < len; i++) {\n\t\t\tparts[i] = lu.simplify(parts[i], this.options.smoothFactor);\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tif (!this._map) { return; }\n\n\t\tthis._clipPoints();\n\t\tthis._simplifyPoints();\n\n\t\tL.Path.prototype._updatePath.call(this);\n\t}\n});\n\nL.polyline = function (latlngs, options) {\n\treturn new L.Polyline(latlngs, options);\n};\n\n\n/*\n * L.PolyUtil contains utility functions for polygons (clipping, etc.).\n */\n\n/*jshint bitwise:false */ // allow bitwise operations here\n\nL.PolyUtil = {};\n\n/*\n * Sutherland-Hodgeman polygon clipping algorithm.\n * Used to avoid rendering parts of a polygon that are not currently visible.\n */\nL.PolyUtil.clipPolygon = function (points, bounds) {\n\tvar clippedPoints,\n\t edges = [1, 4, 2, 8],\n\t i, j, k,\n\t a, b,\n\t len, edge, p,\n\t lu = L.LineUtil;\n\n\tfor (i = 0, len = points.length; i < len; i++) {\n\t\tpoints[i]._code = lu._getBitCode(points[i], bounds);\n\t}\n\n\t// for each edge (left, bottom, right, top)\n\tfor (k = 0; k < 4; k++) {\n\t\tedge = edges[k];\n\t\tclippedPoints = [];\n\n\t\tfor (i = 0, len = points.length, j = len - 1; i < len; j = i++) {\n\t\t\ta = points[i];\n\t\t\tb = points[j];\n\n\t\t\t// if a is inside the clip window\n\t\t\tif (!(a._code & edge)) {\n\t\t\t\t// if b is outside the clip window (a->b goes out of screen)\n\t\t\t\tif (b._code & edge) {\n\t\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds);\n\t\t\t\t\tp._code = lu._getBitCode(p, bounds);\n\t\t\t\t\tclippedPoints.push(p);\n\t\t\t\t}\n\t\t\t\tclippedPoints.push(a);\n\n\t\t\t// else if b is inside the clip window (a->b enters the screen)\n\t\t\t} else if (!(b._code & edge)) {\n\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds);\n\t\t\t\tp._code = lu._getBitCode(p, bounds);\n\t\t\t\tclippedPoints.push(p);\n\t\t\t}\n\t\t}\n\t\tpoints = clippedPoints;\n\t}\n\n\treturn points;\n};\n\n\n/*\n * L.Polygon is used to display polygons on a map.\n */\n\nL.Polygon = L.Polyline.extend({\n\toptions: {\n\t\tfill: true\n\t},\n\n\tinitialize: function (latlngs, options) {\n\t\tL.Polyline.prototype.initialize.call(this, latlngs, options);\n\t\tthis._initWithHoles(latlngs);\n\t},\n\n\t_initWithHoles: function (latlngs) {\n\t\tvar i, len, hole;\n\t\tif (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {\n\t\t\tthis._latlngs = this._convertLatLngs(latlngs[0]);\n\t\t\tthis._holes = latlngs.slice(1);\n\n\t\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\n\t\t\t\thole = this._holes[i] = this._convertLatLngs(this._holes[i]);\n\t\t\t\tif (hole[0].equals(hole[hole.length - 1])) {\n\t\t\t\t\thole.pop();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// filter out last point if its equal to the first one\n\t\tlatlngs = this._latlngs;\n\n\t\tif (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) {\n\t\t\tlatlngs.pop();\n\t\t}\n\t},\n\n\tprojectLatlngs: function () {\n\t\tL.Polyline.prototype.projectLatlngs.call(this);\n\n\t\t// project polygon holes points\n\t\t// TODO move this logic to Polyline to get rid of duplication\n\t\tthis._holePoints = [];\n\n\t\tif (!this._holes) { return; }\n\n\t\tvar i, j, len, len2;\n\n\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\n\t\t\tthis._holePoints[i] = [];\n\n\t\t\tfor (j = 0, len2 = this._holes[i].length; j < len2; j++) {\n\t\t\t\tthis._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]);\n\t\t\t}\n\t\t}\n\t},\n\n\tsetLatLngs: function (latlngs) {\n\t\tif (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {\n\t\t\tthis._initWithHoles(latlngs);\n\t\t\treturn this.redraw();\n\t\t} else {\n\t\t\treturn L.Polyline.prototype.setLatLngs.call(this, latlngs);\n\t\t}\n\t},\n\n\t_clipPoints: function () {\n\t\tvar points = this._originalPoints,\n\t\t newParts = [];\n\n\t\tthis._parts = [points].concat(this._holePoints);\n\n\t\tif (this.options.noClip) { return; }\n\n\t\tfor (var i = 0, len = this._parts.length; i < len; i++) {\n\t\t\tvar clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport);\n\t\t\tif (clipped.length) {\n\t\t\t\tnewParts.push(clipped);\n\t\t\t}\n\t\t}\n\n\t\tthis._parts = newParts;\n\t},\n\n\t_getPathPartStr: function (points) {\n\t\tvar str = L.Polyline.prototype._getPathPartStr.call(this, points);\n\t\treturn str + (L.Browser.svg ? 'z' : 'x');\n\t}\n});\n\nL.polygon = function (latlngs, options) {\n\treturn new L.Polygon(latlngs, options);\n};\n\n\n/*\n * Contains L.MultiPolyline and L.MultiPolygon layers.\n */\n\n(function () {\n\tfunction createMulti(Klass) {\n\n\t\treturn L.FeatureGroup.extend({\n\n\t\t\tinitialize: function (latlngs, options) {\n\t\t\t\tthis._layers = {};\n\t\t\t\tthis._options = options;\n\t\t\t\tthis.setLatLngs(latlngs);\n\t\t\t},\n\n\t\t\tsetLatLngs: function (latlngs) {\n\t\t\t\tvar i = 0,\n\t\t\t\t len = latlngs.length;\n\n\t\t\t\tthis.eachLayer(function (layer) {\n\t\t\t\t\tif (i < len) {\n\t\t\t\t\t\tlayer.setLatLngs(latlngs[i++]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.removeLayer(layer);\n\t\t\t\t\t}\n\t\t\t\t}, this);\n\n\t\t\t\twhile (i < len) {\n\t\t\t\t\tthis.addLayer(new Klass(latlngs[i++], this._options));\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tgetLatLngs: function () {\n\t\t\t\tvar latlngs = [];\n\n\t\t\t\tthis.eachLayer(function (layer) {\n\t\t\t\t\tlatlngs.push(layer.getLatLngs());\n\t\t\t\t});\n\n\t\t\t\treturn latlngs;\n\t\t\t}\n\t\t});\n\t}\n\n\tL.MultiPolyline = createMulti(L.Polyline);\n\tL.MultiPolygon = createMulti(L.Polygon);\n\n\tL.multiPolyline = function (latlngs, options) {\n\t\treturn new L.MultiPolyline(latlngs, options);\n\t};\n\n\tL.multiPolygon = function (latlngs, options) {\n\t\treturn new L.MultiPolygon(latlngs, options);\n\t};\n}());\n\n\n/*\n * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.\n */\n\nL.Rectangle = L.Polygon.extend({\n\tinitialize: function (latLngBounds, options) {\n\t\tL.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);\n\t},\n\n\tsetBounds: function (latLngBounds) {\n\t\tthis.setLatLngs(this._boundsToLatLngs(latLngBounds));\n\t},\n\n\t_boundsToLatLngs: function (latLngBounds) {\n\t\tlatLngBounds = L.latLngBounds(latLngBounds);\n\t\treturn [\n\t\t\tlatLngBounds.getSouthWest(),\n\t\t\tlatLngBounds.getNorthWest(),\n\t\t\tlatLngBounds.getNorthEast(),\n\t\t\tlatLngBounds.getSouthEast()\n\t\t];\n\t}\n});\n\nL.rectangle = function (latLngBounds, options) {\n\treturn new L.Rectangle(latLngBounds, options);\n};\n\n\n/*\n * L.Circle is a circle overlay (with a certain radius in meters).\n */\n\nL.Circle = L.Path.extend({\n\tinitialize: function (latlng, radius, options) {\n\t\tL.Path.prototype.initialize.call(this, options);\n\n\t\tthis._latlng = L.latLng(latlng);\n\t\tthis._mRadius = radius;\n\t},\n\n\toptions: {\n\t\tfill: true\n\t},\n\n\tsetLatLng: function (latlng) {\n\t\tthis._latlng = L.latLng(latlng);\n\t\treturn this.redraw();\n\t},\n\n\tsetRadius: function (radius) {\n\t\tthis._mRadius = radius;\n\t\treturn this.redraw();\n\t},\n\n\tprojectLatlngs: function () {\n\t\tvar lngRadius = this._getLngRadius(),\n\t\t latlng = this._latlng,\n\t\t pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]);\n\n\t\tthis._point = this._map.latLngToLayerPoint(latlng);\n\t\tthis._radius = Math.max(this._point.x - pointLeft.x, 1);\n\t},\n\n\tgetBounds: function () {\n\t\tvar lngRadius = this._getLngRadius(),\n\t\t latRadius = (this._mRadius / 40075017) * 360,\n\t\t latlng = this._latlng;\n\n\t\treturn new L.LatLngBounds(\n\t\t [latlng.lat - latRadius, latlng.lng - lngRadius],\n\t\t [latlng.lat + latRadius, latlng.lng + lngRadius]);\n\t},\n\n\tgetLatLng: function () {\n\t\treturn this._latlng;\n\t},\n\n\tgetPathString: function () {\n\t\tvar p = this._point,\n\t\t r = this._radius;\n\n\t\tif (this._checkIfEmpty()) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (L.Browser.svg) {\n\t\t\treturn 'M' + p.x + ',' + (p.y - r) +\n\t\t\t 'A' + r + ',' + r + ',0,1,1,' +\n\t\t\t (p.x - 0.1) + ',' + (p.y - r) + ' z';\n\t\t} else {\n\t\t\tp._round();\n\t\t\tr = Math.round(r);\n\t\t\treturn 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360);\n\t\t}\n\t},\n\n\tgetRadius: function () {\n\t\treturn this._mRadius;\n\t},\n\n\t// TODO Earth hardcoded, move into projection code!\n\n\t_getLatRadius: function () {\n\t\treturn (this._mRadius / 40075017) * 360;\n\t},\n\n\t_getLngRadius: function () {\n\t\treturn this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat);\n\t},\n\n\t_checkIfEmpty: function () {\n\t\tif (!this._map) {\n\t\t\treturn false;\n\t\t}\n\t\tvar vp = this._map._pathViewport,\n\t\t r = this._radius,\n\t\t p = this._point;\n\n\t\treturn p.x - r > vp.max.x || p.y - r > vp.max.y ||\n\t\t p.x + r < vp.min.x || p.y + r < vp.min.y;\n\t}\n});\n\nL.circle = function (latlng, radius, options) {\n\treturn new L.Circle(latlng, radius, options);\n};\n\n\n/*\n * L.CircleMarker is a circle overlay with a permanent pixel radius.\n */\n\nL.CircleMarker = L.Circle.extend({\n\toptions: {\n\t\tradius: 10,\n\t\tweight: 2\n\t},\n\n\tinitialize: function (latlng, options) {\n\t\tL.Circle.prototype.initialize.call(this, latlng, null, options);\n\t\tthis._radius = this.options.radius;\n\t},\n\n\tprojectLatlngs: function () {\n\t\tthis._point = this._map.latLngToLayerPoint(this._latlng);\n\t},\n\n\t_updateStyle : function () {\n\t\tL.Circle.prototype._updateStyle.call(this);\n\t\tthis.setRadius(this.options.radius);\n\t},\n\n\tsetLatLng: function (latlng) {\n\t\tL.Circle.prototype.setLatLng.call(this, latlng);\n\t\tif (this._popup && this._popup._isOpen) {\n\t\t\tthis._popup.setLatLng(latlng);\n\t\t}\n\t\treturn this;\n\t},\n\n\tsetRadius: function (radius) {\n\t\tthis.options.radius = this._radius = radius;\n\t\treturn this.redraw();\n\t},\n\n\tgetRadius: function () {\n\t\treturn this._radius;\n\t}\n});\n\nL.circleMarker = function (latlng, options) {\n\treturn new L.CircleMarker(latlng, options);\n};\n\n\n/*\n * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines.\n */\n\nL.Polyline.include(!L.Path.CANVAS ? {} : {\n\t_containsPoint: function (p, closed) {\n\t\tvar i, j, k, len, len2, dist, part,\n\t\t w = this.options.weight / 2;\n\n\t\tif (L.Browser.touch) {\n\t\t\tw += 10; // polyline click tolerance on touch devices\n\t\t}\n\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\t\tpart = this._parts[i];\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\t\tif (!closed && (j === 0)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tdist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]);\n\n\t\t\t\tif (dist <= w) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n});\n\n\n/*\n * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons.\n */\n\nL.Polygon.include(!L.Path.CANVAS ? {} : {\n\t_containsPoint: function (p) {\n\t\tvar inside = false,\n\t\t part, p1, p2,\n\t\t i, j, k,\n\t\t len, len2;\n\n\t\t// TODO optimization: check if within bounds first\n\n\t\tif (L.Polyline.prototype._containsPoint.call(this, p, true)) {\n\t\t\t// click on polygon border\n\t\t\treturn true;\n\t\t}\n\n\t\t// ray casting algorithm for detecting if point is in polygon\n\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\t\tpart = this._parts[i];\n\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\t\tp1 = part[j];\n\t\t\t\tp2 = part[k];\n\n\t\t\t\tif (((p1.y > p.y) !== (p2.y > p.y)) &&\n\t\t\t\t\t\t(p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n\t\t\t\t\tinside = !inside;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn inside;\n\t}\n});\n\n\n/*\n * Extends L.Circle with Canvas-specific code.\n */\n\nL.Circle.include(!L.Path.CANVAS ? {} : {\n\t_drawPath: function () {\n\t\tvar p = this._point;\n\t\tthis._ctx.beginPath();\n\t\tthis._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false);\n\t},\n\n\t_containsPoint: function (p) {\n\t\tvar center = this._point,\n\t\t w2 = this.options.stroke ? this.options.weight / 2 : 0;\n\n\t\treturn (p.distanceTo(center) <= this._radius + w2);\n\t}\n});\n\n\n/*\n * CircleMarker canvas specific drawing parts.\n */\n\nL.CircleMarker.include(!L.Path.CANVAS ? {} : {\n\t_updateStyle: function () {\n\t\tL.Path.prototype._updateStyle.call(this);\n\t}\n});\n\n\n/*\n * L.GeoJSON turns any GeoJSON data into a Leaflet layer.\n */\n\nL.GeoJSON = L.FeatureGroup.extend({\n\n\tinitialize: function (geojson, options) {\n\t\tL.setOptions(this, options);\n\n\t\tthis._layers = {};\n\n\t\tif (geojson) {\n\t\t\tthis.addData(geojson);\n\t\t}\n\t},\n\n\taddData: function (geojson) {\n\t\tvar features = L.Util.isArray(geojson) ? geojson : geojson.features,\n\t\t i, len, feature;\n\n\t\tif (features) {\n\t\t\tfor (i = 0, len = features.length; i < len; i++) {\n\t\t\t\t// Only add this if geometry or geometries are set and not null\n\t\t\t\tfeature = features[i];\n\t\t\t\tif (feature.geometries || feature.geometry || feature.features || feature.coordinates) {\n\t\t\t\t\tthis.addData(features[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tvar options = this.options;\n\n\t\tif (options.filter && !options.filter(geojson)) { return; }\n\n\t\tvar layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options);\n\t\tlayer.feature = L.GeoJSON.asFeature(geojson);\n\n\t\tlayer.defaultOptions = layer.options;\n\t\tthis.resetStyle(layer);\n\n\t\tif (options.onEachFeature) {\n\t\t\toptions.onEachFeature(geojson, layer);\n\t\t}\n\n\t\treturn this.addLayer(layer);\n\t},\n\n\tresetStyle: function (layer) {\n\t\tvar style = this.options.style;\n\t\tif (style) {\n\t\t\t// reset any custom styles\n\t\t\tL.Util.extend(layer.options, layer.defaultOptions);\n\n\t\t\tthis._setLayerStyle(layer, style);\n\t\t}\n\t},\n\n\tsetStyle: function (style) {\n\t\tthis.eachLayer(function (layer) {\n\t\t\tthis._setLayerStyle(layer, style);\n\t\t}, this);\n\t},\n\n\t_setLayerStyle: function (layer, style) {\n\t\tif (typeof style === 'function') {\n\t\t\tstyle = style(layer.feature);\n\t\t}\n\t\tif (layer.setStyle) {\n\t\t\tlayer.setStyle(style);\n\t\t}\n\t}\n});\n\nL.extend(L.GeoJSON, {\n\tgeometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) {\n\t\tvar geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,\n\t\t coords = geometry.coordinates,\n\t\t layers = [],\n\t\t latlng, latlngs, i, len;\n\n\t\tcoordsToLatLng = coordsToLatLng || this.coordsToLatLng;\n\n\t\tswitch (geometry.type) {\n\t\tcase 'Point':\n\t\t\tlatlng = coordsToLatLng(coords);\n\t\t\treturn pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);\n\n\t\tcase 'MultiPoint':\n\t\t\tfor (i = 0, len = coords.length; i < len; i++) {\n\t\t\t\tlatlng = coordsToLatLng(coords[i]);\n\t\t\t\tlayers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));\n\t\t\t}\n\t\t\treturn new L.FeatureGroup(layers);\n\n\t\tcase 'LineString':\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng);\n\t\t\treturn new L.Polyline(latlngs, vectorOptions);\n\n\t\tcase 'Polygon':\n\t\t\tif (coords.length === 2 && !coords[1].length) {\n\t\t\t\tthrow new Error('Invalid GeoJSON object.');\n\t\t\t}\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);\n\t\t\treturn new L.Polygon(latlngs, vectorOptions);\n\n\t\tcase 'MultiLineString':\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);\n\t\t\treturn new L.MultiPolyline(latlngs, vectorOptions);\n\n\t\tcase 'MultiPolygon':\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng);\n\t\t\treturn new L.MultiPolygon(latlngs, vectorOptions);\n\n\t\tcase 'GeometryCollection':\n\t\t\tfor (i = 0, len = geometry.geometries.length; i < len; i++) {\n\n\t\t\t\tlayers.push(this.geometryToLayer({\n\t\t\t\t\tgeometry: geometry.geometries[i],\n\t\t\t\t\ttype: 'Feature',\n\t\t\t\t\tproperties: geojson.properties\n\t\t\t\t}, pointToLayer, coordsToLatLng, vectorOptions));\n\t\t\t}\n\t\t\treturn new L.FeatureGroup(layers);\n\n\t\tdefault:\n\t\t\tthrow new Error('Invalid GeoJSON object.');\n\t\t}\n\t},\n\n\tcoordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng\n\t\treturn new L.LatLng(coords[1], coords[0], coords[2]);\n\t},\n\n\tcoordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array\n\t\tvar latlng, i, len,\n\t\t latlngs = [];\n\n\t\tfor (i = 0, len = coords.length; i < len; i++) {\n\t\t\tlatlng = levelsDeep ?\n\t\t\t this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :\n\t\t\t (coordsToLatLng || this.coordsToLatLng)(coords[i]);\n\n\t\t\tlatlngs.push(latlng);\n\t\t}\n\n\t\treturn latlngs;\n\t},\n\n\tlatLngToCoords: function (latlng) {\n\t\tvar coords = [latlng.lng, latlng.lat];\n\n\t\tif (latlng.alt !== undefined) {\n\t\t\tcoords.push(latlng.alt);\n\t\t}\n\t\treturn coords;\n\t},\n\n\tlatLngsToCoords: function (latLngs) {\n\t\tvar coords = [];\n\n\t\tfor (var i = 0, len = latLngs.length; i < len; i++) {\n\t\t\tcoords.push(L.GeoJSON.latLngToCoords(latLngs[i]));\n\t\t}\n\n\t\treturn coords;\n\t},\n\n\tgetFeature: function (layer, newGeometry) {\n\t\treturn layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry);\n\t},\n\n\tasFeature: function (geoJSON) {\n\t\tif (geoJSON.type === 'Feature') {\n\t\t\treturn geoJSON;\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'Feature',\n\t\t\tproperties: {},\n\t\t\tgeometry: geoJSON\n\t\t};\n\t}\n});\n\nvar PointToGeoJSON = {\n\ttoGeoJSON: function () {\n\t\treturn L.GeoJSON.getFeature(this, {\n\t\t\ttype: 'Point',\n\t\t\tcoordinates: L.GeoJSON.latLngToCoords(this.getLatLng())\n\t\t});\n\t}\n};\n\nL.Marker.include(PointToGeoJSON);\nL.Circle.include(PointToGeoJSON);\nL.CircleMarker.include(PointToGeoJSON);\n\nL.Polyline.include({\n\ttoGeoJSON: function () {\n\t\treturn L.GeoJSON.getFeature(this, {\n\t\t\ttype: 'LineString',\n\t\t\tcoordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs())\n\t\t});\n\t}\n});\n\nL.Polygon.include({\n\ttoGeoJSON: function () {\n\t\tvar coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())],\n\t\t i, len, hole;\n\n\t\tcoords[0].push(coords[0][0]);\n\n\t\tif (this._holes) {\n\t\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\n\t\t\t\thole = L.GeoJSON.latLngsToCoords(this._holes[i]);\n\t\t\t\thole.push(hole[0]);\n\t\t\t\tcoords.push(hole);\n\t\t\t}\n\t\t}\n\n\t\treturn L.GeoJSON.getFeature(this, {\n\t\t\ttype: 'Polygon',\n\t\t\tcoordinates: coords\n\t\t});\n\t}\n});\n\n(function () {\n\tfunction multiToGeoJSON(type) {\n\t\treturn function () {\n\t\t\tvar coords = [];\n\n\t\t\tthis.eachLayer(function (layer) {\n\t\t\t\tcoords.push(layer.toGeoJSON().geometry.coordinates);\n\t\t\t});\n\n\t\t\treturn L.GeoJSON.getFeature(this, {\n\t\t\t\ttype: type,\n\t\t\t\tcoordinates: coords\n\t\t\t});\n\t\t};\n\t}\n\n\tL.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')});\n\tL.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')});\n\n\tL.LayerGroup.include({\n\t\ttoGeoJSON: function () {\n\n\t\t\tvar geometry = this.feature && this.feature.geometry,\n\t\t\t\tjsons = [],\n\t\t\t\tjson;\n\n\t\t\tif (geometry && geometry.type === 'MultiPoint') {\n\t\t\t\treturn multiToGeoJSON('MultiPoint').call(this);\n\t\t\t}\n\n\t\t\tvar isGeometryCollection = geometry && geometry.type === 'GeometryCollection';\n\n\t\t\tthis.eachLayer(function (layer) {\n\t\t\t\tif (layer.toGeoJSON) {\n\t\t\t\t\tjson = layer.toGeoJSON();\n\t\t\t\t\tjsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (isGeometryCollection) {\n\t\t\t\treturn L.GeoJSON.getFeature(this, {\n\t\t\t\t\tgeometries: jsons,\n\t\t\t\t\ttype: 'GeometryCollection'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: 'FeatureCollection',\n\t\t\t\tfeatures: jsons\n\t\t\t};\n\t\t}\n\t});\n}());\n\nL.geoJson = function (geojson, options) {\n\treturn new L.GeoJSON(geojson, options);\n};\n\n\n/*\n * L.DomEvent contains functions for working with DOM events.\n */\n\nL.DomEvent = {\n\t/* inspired by John Resig, Dean Edwards and YUI addEvent implementations */\n\taddListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object])\n\n\t\tvar id = L.stamp(fn),\n\t\t key = '_leaflet_' + type + id,\n\t\t handler, originalHandler, newType;\n\n\t\tif (obj[key]) { return this; }\n\n\t\thandler = function (e) {\n\t\t\treturn fn.call(context || obj, e || L.DomEvent._getEvent());\n\t\t};\n\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\n\t\t\treturn this.addPointerListener(obj, type, handler, id);\n\t\t}\n\t\tif (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {\n\t\t\tthis.addDoubleTapListener(obj, handler, id);\n\t\t}\n\n\t\tif ('addEventListener' in obj) {\n\n\t\t\tif (type === 'mousewheel') {\n\t\t\t\tobj.addEventListener('DOMMouseScroll', handler, false);\n\t\t\t\tobj.addEventListener(type, handler, false);\n\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\n\n\t\t\t\toriginalHandler = handler;\n\t\t\t\tnewType = (type === 'mouseenter' ? 'mouseover' : 'mouseout');\n\n\t\t\t\thandler = function (e) {\n\t\t\t\t\tif (!L.DomEvent._checkMouse(obj, e)) { return; }\n\t\t\t\t\treturn originalHandler(e);\n\t\t\t\t};\n\n\t\t\t\tobj.addEventListener(newType, handler, false);\n\n\t\t\t} else if (type === 'click' && L.Browser.android) {\n\t\t\t\toriginalHandler = handler;\n\t\t\t\thandler = function (e) {\n\t\t\t\t\treturn L.DomEvent._filterClick(e, originalHandler);\n\t\t\t\t};\n\n\t\t\t\tobj.addEventListener(type, handler, false);\n\t\t\t} else {\n\t\t\t\tobj.addEventListener(type, handler, false);\n\t\t\t}\n\n\t\t} else if ('attachEvent' in obj) {\n\t\t\tobj.attachEvent('on' + type, handler);\n\t\t}\n\n\t\tobj[key] = handler;\n\n\t\treturn this;\n\t},\n\n\tremoveListener: function (obj, type, fn) { // (HTMLElement, String, Function)\n\n\t\tvar id = L.stamp(fn),\n\t\t key = '_leaflet_' + type + id,\n\t\t handler = obj[key];\n\n\t\tif (!handler) { return this; }\n\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\n\t\t\tthis.removePointerListener(obj, type, id);\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {\n\t\t\tthis.removeDoubleTapListener(obj, id);\n\n\t\t} else if ('removeEventListener' in obj) {\n\n\t\t\tif (type === 'mousewheel') {\n\t\t\t\tobj.removeEventListener('DOMMouseScroll', handler, false);\n\t\t\t\tobj.removeEventListener(type, handler, false);\n\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\n\t\t\t\tobj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false);\n\t\t\t} else {\n\t\t\t\tobj.removeEventListener(type, handler, false);\n\t\t\t}\n\t\t} else if ('detachEvent' in obj) {\n\t\t\tobj.detachEvent('on' + type, handler);\n\t\t}\n\n\t\tobj[key] = null;\n\n\t\treturn this;\n\t},\n\n\tstopPropagation: function (e) {\n\n\t\tif (e.stopPropagation) {\n\t\t\te.stopPropagation();\n\t\t} else {\n\t\t\te.cancelBubble = true;\n\t\t}\n\t\tL.DomEvent._skipped(e);\n\n\t\treturn this;\n\t},\n\n\tdisableScrollPropagation: function (el) {\n\t\tvar stop = L.DomEvent.stopPropagation;\n\n\t\treturn L.DomEvent\n\t\t\t.on(el, 'mousewheel', stop)\n\t\t\t.on(el, 'MozMousePixelScroll', stop);\n\t},\n\n\tdisableClickPropagation: function (el) {\n\t\tvar stop = L.DomEvent.stopPropagation;\n\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\n\t\t\tL.DomEvent.on(el, L.Draggable.START[i], stop);\n\t\t}\n\n\t\treturn L.DomEvent\n\t\t\t.on(el, 'click', L.DomEvent._fakeStop)\n\t\t\t.on(el, 'dblclick', stop);\n\t},\n\n\tpreventDefault: function (e) {\n\n\t\tif (e.preventDefault) {\n\t\t\te.preventDefault();\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t\treturn this;\n\t},\n\n\tstop: function (e) {\n\t\treturn L.DomEvent\n\t\t\t.preventDefault(e)\n\t\t\t.stopPropagation(e);\n\t},\n\n\tgetMousePosition: function (e, container) {\n\t\tif (!container) {\n\t\t\treturn new L.Point(e.clientX, e.clientY);\n\t\t}\n\n\t\tvar rect = container.getBoundingClientRect();\n\n\t\treturn new L.Point(\n\t\t\te.clientX - rect.left - container.clientLeft,\n\t\t\te.clientY - rect.top - container.clientTop);\n\t},\n\n\tgetWheelDelta: function (e) {\n\n\t\tvar delta = 0;\n\n\t\tif (e.wheelDelta) {\n\t\t\tdelta = e.wheelDelta / 120;\n\t\t}\n\t\tif (e.detail) {\n\t\t\tdelta = -e.detail / 3;\n\t\t}\n\t\treturn delta;\n\t},\n\n\t_skipEvents: {},\n\n\t_fakeStop: function (e) {\n\t\t// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)\n\t\tL.DomEvent._skipEvents[e.type] = true;\n\t},\n\n\t_skipped: function (e) {\n\t\tvar skipped = this._skipEvents[e.type];\n\t\t// reset when checking, as it's only used in map container and propagates outside of the map\n\t\tthis._skipEvents[e.type] = false;\n\t\treturn skipped;\n\t},\n\n\t// check if element really left/entered the event target (for mouseenter/mouseleave)\n\t_checkMouse: function (el, e) {\n\n\t\tvar related = e.relatedTarget;\n\n\t\tif (!related) { return true; }\n\n\t\ttry {\n\t\t\twhile (related && (related !== el)) {\n\t\t\t\trelated = related.parentNode;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (related !== el);\n\t},\n\n\t_getEvent: function () { // evil magic for IE\n\t\t/*jshint noarg:false */\n\t\tvar e = window.event;\n\t\tif (!e) {\n\t\t\tvar caller = arguments.callee.caller;\n\t\t\twhile (caller) {\n\t\t\t\te = caller['arguments'][0];\n\t\t\t\tif (e && window.Event === e.constructor) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcaller = caller.caller;\n\t\t\t}\n\t\t}\n\t\treturn e;\n\t},\n\n\t// this is a horrible workaround for a bug in Android where a single touch triggers two click events\n\t_filterClick: function (e, handler) {\n\t\tvar timeStamp = (e.timeStamp || e.originalEvent.timeStamp),\n\t\t\telapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);\n\n\t\t// are they closer together than 500ms yet more than 100ms?\n\t\t// Android typically triggers them ~300ms apart while multiple listeners\n\t\t// on the same event should be triggered far faster;\n\t\t// or check if click is simulated on the element, and if it is, reject any non-simulated events\n\n\t\tif ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {\n\t\t\tL.DomEvent.stop(e);\n\t\t\treturn;\n\t\t}\n\t\tL.DomEvent._lastClick = timeStamp;\n\n\t\treturn handler(e);\n\t}\n};\n\nL.DomEvent.on = L.DomEvent.addListener;\nL.DomEvent.off = L.DomEvent.removeListener;\n\n\n/*\n * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.\n */\n\nL.Draggable = L.Class.extend({\n\tincludes: L.Mixin.Events,\n\n\tstatics: {\n\t\tSTART: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],\n\t\tEND: {\n\t\t\tmousedown: 'mouseup',\n\t\t\ttouchstart: 'touchend',\n\t\t\tpointerdown: 'touchend',\n\t\t\tMSPointerDown: 'touchend'\n\t\t},\n\t\tMOVE: {\n\t\t\tmousedown: 'mousemove',\n\t\t\ttouchstart: 'touchmove',\n\t\t\tpointerdown: 'touchmove',\n\t\t\tMSPointerDown: 'touchmove'\n\t\t}\n\t},\n\n\tinitialize: function (element, dragStartTarget) {\n\t\tthis._element = element;\n\t\tthis._dragStartTarget = dragStartTarget || element;\n\t},\n\n\tenable: function () {\n\t\tif (this._enabled) { return; }\n\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\n\t\t\tL.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);\n\t\t}\n\n\t\tthis._enabled = true;\n\t},\n\n\tdisable: function () {\n\t\tif (!this._enabled) { return; }\n\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\n\t\t\tL.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);\n\t\t}\n\n\t\tthis._enabled = false;\n\t\tthis._moved = false;\n\t},\n\n\t_onDown: function (e) {\n\t\tthis._moved = false;\n\n\t\tif (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }\n\n\t\tL.DomEvent.stopPropagation(e);\n\n\t\tif (L.Draggable._disabled) { return; }\n\n\t\tL.DomUtil.disableImageDrag();\n\t\tL.DomUtil.disableTextSelection();\n\n\t\tif (this._moving) { return; }\n\n\t\tvar first = e.touches ? e.touches[0] : e;\n\n\t\tthis._startPoint = new L.Point(first.clientX, first.clientY);\n\t\tthis._startPos = this._newPos = L.DomUtil.getPosition(this._element);\n\n\t\tL.DomEvent\n\t\t .on(document, L.Draggable.MOVE[e.type], this._onMove, this)\n\t\t .on(document, L.Draggable.END[e.type], this._onUp, this);\n\t},\n\n\t_onMove: function (e) {\n\t\tif (e.touches && e.touches.length > 1) {\n\t\t\tthis._moved = true;\n\t\t\treturn;\n\t\t}\n\n\t\tvar first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\n\t\t newPoint = new L.Point(first.clientX, first.clientY),\n\t\t offset = newPoint.subtract(this._startPoint);\n\n\t\tif (!offset.x && !offset.y) { return; }\n\t\tif (L.Browser.touch && Math.abs(offset.x) + Math.abs(offset.y) < 3) { return; }\n\n\t\tL.DomEvent.preventDefault(e);\n\n\t\tif (!this._moved) {\n\t\t\tthis.fire('dragstart');\n\n\t\t\tthis._moved = true;\n\t\t\tthis._startPos = L.DomUtil.getPosition(this._element).subtract(offset);\n\n\t\t\tL.DomUtil.addClass(document.body, 'leaflet-dragging');\n\t\t\tthis._lastTarget = e.target || e.srcElement;\n\t\t\tL.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target');\n\t\t}\n\n\t\tthis._newPos = this._startPos.add(offset);\n\t\tthis._moving = true;\n\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\t\tthis._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget);\n\t},\n\n\t_updatePosition: function () {\n\t\tthis.fire('predrag');\n\t\tL.DomUtil.setPosition(this._element, this._newPos);\n\t\tthis.fire('drag');\n\t},\n\n\t_onUp: function () {\n\t\tL.DomUtil.removeClass(document.body, 'leaflet-dragging');\n\n\t\tif (this._lastTarget) {\n\t\t\tL.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');\n\t\t\tthis._lastTarget = null;\n\t\t}\n\n\t\tfor (var i in L.Draggable.MOVE) {\n\t\t\tL.DomEvent\n\t\t\t .off(document, L.Draggable.MOVE[i], this._onMove)\n\t\t\t .off(document, L.Draggable.END[i], this._onUp);\n\t\t}\n\n\t\tL.DomUtil.enableImageDrag();\n\t\tL.DomUtil.enableTextSelection();\n\n\t\tif (this._moved && this._moving) {\n\t\t\t// ensure drag is not fired after dragend\n\t\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\t\tthis.fire('dragend', {\n\t\t\t\tdistance: this._newPos.distanceTo(this._startPos)\n\t\t\t});\n\t\t}\n\n\t\tthis._moving = false;\n\t}\n});\n\n\n/*\n\tL.Handler is a base class for handler classes that are used internally to inject\n\tinteraction features like dragging to classes like Map and Marker.\n*/\n\nL.Handler = L.Class.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t},\n\n\tenable: function () {\n\t\tif (this._enabled) { return; }\n\n\t\tthis._enabled = true;\n\t\tthis.addHooks();\n\t},\n\n\tdisable: function () {\n\t\tif (!this._enabled) { return; }\n\n\t\tthis._enabled = false;\n\t\tthis.removeHooks();\n\t},\n\n\tenabled: function () {\n\t\treturn !!this._enabled;\n\t}\n});\n\n\n/*\n * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.\n */\n\nL.Map.mergeOptions({\n\tdragging: true,\n\n\tinertia: !L.Browser.android23,\n\tinertiaDeceleration: 3400, // px/s^2\n\tinertiaMaxSpeed: Infinity, // px/s\n\tinertiaThreshold: L.Browser.touch ? 32 : 18, // ms\n\teaseLinearity: 0.25,\n\n\t// TODO refactor, move to CRS\n\tworldCopyJump: false\n});\n\nL.Map.Drag = L.Handler.extend({\n\taddHooks: function () {\n\t\tif (!this._draggable) {\n\t\t\tvar map = this._map;\n\n\t\t\tthis._draggable = new L.Draggable(map._mapPane, map._container);\n\n\t\t\tthis._draggable.on({\n\t\t\t\t'dragstart': this._onDragStart,\n\t\t\t\t'drag': this._onDrag,\n\t\t\t\t'dragend': this._onDragEnd\n\t\t\t}, this);\n\n\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\tthis._draggable.on('predrag', this._onPreDrag, this);\n\t\t\t\tmap.on('viewreset', this._onViewReset, this);\n\n\t\t\t\tmap.whenReady(this._onViewReset, this);\n\t\t\t}\n\t\t}\n\t\tthis._draggable.enable();\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable.disable();\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\tvar map = this._map;\n\n\t\tif (map._panAnim) {\n\t\t\tmap._panAnim.stop();\n\t\t}\n\n\t\tmap\n\t\t .fire('movestart')\n\t\t .fire('dragstart');\n\n\t\tif (map.options.inertia) {\n\t\t\tthis._positions = [];\n\t\t\tthis._times = [];\n\t\t}\n\t},\n\n\t_onDrag: function () {\n\t\tif (this._map.options.inertia) {\n\t\t\tvar time = this._lastTime = +new Date(),\n\t\t\t pos = this._lastPos = this._draggable._newPos;\n\n\t\t\tthis._positions.push(pos);\n\t\t\tthis._times.push(time);\n\n\t\t\tif (time - this._times[0] > 200) {\n\t\t\t\tthis._positions.shift();\n\t\t\t\tthis._times.shift();\n\t\t\t}\n\t\t}\n\n\t\tthis._map\n\t\t .fire('move')\n\t\t .fire('drag');\n\t},\n\n\t_onViewReset: function () {\n\t\t// TODO fix hardcoded Earth values\n\t\tvar pxCenter = this._map.getSize()._divideBy(2),\n\t\t pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);\n\n\t\tthis._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;\n\t\tthis._worldWidth = this._map.project([0, 180]).x;\n\t},\n\n\t_onPreDrag: function () {\n\t\t// TODO refactor to be able to adjust map pane position after zoom\n\t\tvar worldWidth = this._worldWidth,\n\t\t halfWidth = Math.round(worldWidth / 2),\n\t\t dx = this._initialWorldOffset,\n\t\t x = this._draggable._newPos.x,\n\t\t newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,\n\t\t newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,\n\t\t newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;\n\n\t\tthis._draggable._newPos.x = newX;\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tvar map = this._map,\n\t\t options = map.options,\n\t\t delay = +new Date() - this._lastTime,\n\n\t\t noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0];\n\n\t\tmap.fire('dragend', e);\n\n\t\tif (noInertia) {\n\t\t\tmap.fire('moveend');\n\n\t\t} else {\n\n\t\t\tvar direction = this._lastPos.subtract(this._positions[0]),\n\t\t\t duration = (this._lastTime + delay - this._times[0]) / 1000,\n\t\t\t ease = options.easeLinearity,\n\n\t\t\t speedVector = direction.multiplyBy(ease / duration),\n\t\t\t speed = speedVector.distanceTo([0, 0]),\n\n\t\t\t limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n\t\t\t limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n\t\t\t decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),\n\t\t\t offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n\t\t\tif (!offset.x || !offset.y) {\n\t\t\t\tmap.fire('moveend');\n\n\t\t\t} else {\n\t\t\t\toffset = map._limitOffset(offset, map.options.maxBounds);\n\n\t\t\t\tL.Util.requestAnimFrame(function () {\n\t\t\t\t\tmap.panBy(offset, {\n\t\t\t\t\t\tduration: decelerationDuration,\n\t\t\t\t\t\teaseLinearity: ease,\n\t\t\t\t\t\tnoMoveStart: true\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);\n\n\n/*\n * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.\n */\n\nL.Map.mergeOptions({\n\tdoubleClickZoom: true\n});\n\nL.Map.DoubleClickZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tthis._map.on('dblclick', this._onDoubleClick, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._map.off('dblclick', this._onDoubleClick, this);\n\t},\n\n\t_onDoubleClick: function (e) {\n\t\tvar map = this._map,\n\t\t zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1);\n\n\t\tif (map.options.doubleClickZoom === 'center') {\n\t\t\tmap.setZoom(zoom);\n\t\t} else {\n\t\t\tmap.setZoomAround(e.containerPoint, zoom);\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);\n\n\n/*\n * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.\n */\n\nL.Map.mergeOptions({\n\tscrollWheelZoom: true\n});\n\nL.Map.ScrollWheelZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\t\tL.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);\n\t\tthis._delta = 0;\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll);\n\t\tL.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);\n\t},\n\n\t_onWheelScroll: function (e) {\n\t\tvar delta = L.DomEvent.getWheelDelta(e);\n\n\t\tthis._delta += delta;\n\t\tthis._lastMousePos = this._map.mouseEventToContainerPoint(e);\n\n\t\tif (!this._startTime) {\n\t\t\tthis._startTime = +new Date();\n\t\t}\n\n\t\tvar left = Math.max(40 - (+new Date() - this._startTime), 0);\n\n\t\tclearTimeout(this._timer);\n\t\tthis._timer = setTimeout(L.bind(this._performZoom, this), left);\n\n\t\tL.DomEvent.preventDefault(e);\n\t\tL.DomEvent.stopPropagation(e);\n\t},\n\n\t_performZoom: function () {\n\t\tvar map = this._map,\n\t\t delta = this._delta,\n\t\t zoom = map.getZoom();\n\n\t\tdelta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n\t\tdelta = Math.max(Math.min(delta, 4), -4);\n\t\tdelta = map._limitZoom(zoom + delta) - zoom;\n\n\t\tthis._delta = 0;\n\t\tthis._startTime = null;\n\n\t\tif (!delta) { return; }\n\n\t\tif (map.options.scrollWheelZoom === 'center') {\n\t\t\tmap.setZoom(zoom + delta);\n\t\t} else {\n\t\t\tmap.setZoomAround(this._lastMousePos, zoom + delta);\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);\n\n\n/*\n * Extends the event handling code with double tap support for mobile browsers.\n */\n\nL.extend(L.DomEvent, {\n\n\t_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',\n\t_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',\n\n\t// inspired by Zepto touch code by Thomas Fuchs\n\taddDoubleTapListener: function (obj, handler, id) {\n\t\tvar last,\n\t\t doubleTap = false,\n\t\t delay = 250,\n\t\t touch,\n\t\t pre = '_leaflet_',\n\t\t touchstart = this._touchstart,\n\t\t touchend = this._touchend,\n\t\t trackedTouches = [];\n\n\t\tfunction onTouchStart(e) {\n\t\t\tvar count;\n\n\t\t\tif (L.Browser.pointer) {\n\t\t\t\ttrackedTouches.push(e.pointerId);\n\t\t\t\tcount = trackedTouches.length;\n\t\t\t} else {\n\t\t\t\tcount = e.touches.length;\n\t\t\t}\n\t\t\tif (count > 1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar now = Date.now(),\n\t\t\t\tdelta = now - (last || now);\n\n\t\t\ttouch = e.touches ? e.touches[0] : e;\n\t\t\tdoubleTap = (delta > 0 && delta <= delay);\n\t\t\tlast = now;\n\t\t}\n\n\t\tfunction onTouchEnd(e) {\n\t\t\tif (L.Browser.pointer) {\n\t\t\t\tvar idx = trackedTouches.indexOf(e.pointerId);\n\t\t\t\tif (idx === -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttrackedTouches.splice(idx, 1);\n\t\t\t}\n\n\t\t\tif (doubleTap) {\n\t\t\t\tif (L.Browser.pointer) {\n\t\t\t\t\t// work around .type being readonly with MSPointer* events\n\t\t\t\t\tvar newTouch = { },\n\t\t\t\t\t\tprop;\n\n\t\t\t\t\t// jshint forin:false\n\t\t\t\t\tfor (var i in touch) {\n\t\t\t\t\t\tprop = touch[i];\n\t\t\t\t\t\tif (typeof prop === 'function') {\n\t\t\t\t\t\t\tnewTouch[i] = prop.bind(touch);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnewTouch[i] = prop;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttouch = newTouch;\n\t\t\t\t}\n\t\t\t\ttouch.type = 'dblclick';\n\t\t\t\thandler(touch);\n\t\t\t\tlast = null;\n\t\t\t}\n\t\t}\n\t\tobj[pre + touchstart + id] = onTouchStart;\n\t\tobj[pre + touchend + id] = onTouchEnd;\n\n\t\t// on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen\n\t\t// will not come through to us, so we will lose track of how many touches are ongoing\n\t\tvar endElement = L.Browser.pointer ? document.documentElement : obj;\n\n\t\tobj.addEventListener(touchstart, onTouchStart, false);\n\t\tendElement.addEventListener(touchend, onTouchEnd, false);\n\n\t\tif (L.Browser.pointer) {\n\t\t\tendElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveDoubleTapListener: function (obj, id) {\n\t\tvar pre = '_leaflet_';\n\n\t\tobj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);\n\t\t(L.Browser.pointer ? document.documentElement : obj).removeEventListener(\n\t\t this._touchend, obj[pre + this._touchend + id], false);\n\n\t\tif (L.Browser.pointer) {\n\t\t\tdocument.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id],\n\t\t\t\tfalse);\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n\n/*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\nL.extend(L.DomEvent, {\n\n\t//static\n\tPOINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',\n\tPOINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',\n\tPOINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',\n\tPOINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',\n\n\t_pointers: [],\n\t_pointerDocumentListener: false,\n\n\t// Provides a touch events wrapper for (ms)pointer events.\n\t// Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019\n\t//ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\n\taddPointerListener: function (obj, type, handler, id) {\n\n\t\tswitch (type) {\n\t\tcase 'touchstart':\n\t\t\treturn this.addPointerListenerStart(obj, type, handler, id);\n\t\tcase 'touchend':\n\t\t\treturn this.addPointerListenerEnd(obj, type, handler, id);\n\t\tcase 'touchmove':\n\t\t\treturn this.addPointerListenerMove(obj, type, handler, id);\n\t\tdefault:\n\t\t\tthrow 'Unknown touch event type';\n\t\t}\n\t},\n\n\taddPointerListenerStart: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t pointers = this._pointers;\n\n\t\tvar cb = function (e) {\n\t\t\tif (e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {\n\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t}\n\n\t\t\tvar alreadyInArray = false;\n\t\t\tfor (var i = 0; i < pointers.length; i++) {\n\t\t\t\tif (pointers[i].pointerId === e.pointerId) {\n\t\t\t\t\talreadyInArray = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!alreadyInArray) {\n\t\t\t\tpointers.push(e);\n\t\t\t}\n\n\t\t\te.touches = pointers.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t};\n\n\t\tobj[pre + 'touchstart' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_DOWN, cb, false);\n\n\t\t// need to also listen for end events to keep the _pointers list accurate\n\t\t// this needs to be on the body and never go away\n\t\tif (!this._pointerDocumentListener) {\n\t\t\tvar internalCb = function (e) {\n\t\t\t\tfor (var i = 0; i < pointers.length; i++) {\n\t\t\t\t\tif (pointers[i].pointerId === e.pointerId) {\n\t\t\t\t\t\tpointers.splice(i, 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t//We listen on the documentElement as any drags that end by moving the touch off the screen get fired there\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_UP, internalCb, false);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false);\n\n\t\t\tthis._pointerDocumentListener = true;\n\t\t}\n\n\t\treturn this;\n\t},\n\n\taddPointerListenerMove: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t touches = this._pointers;\n\n\t\tfunction cb(e) {\n\n\t\t\t// don't fire touch moves when mouse isn't down\n\t\t\tif ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }\n\n\t\t\tfor (var i = 0; i < touches.length; i++) {\n\t\t\t\tif (touches[i].pointerId === e.pointerId) {\n\t\t\t\t\ttouches[i] = e;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\te.touches = touches.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t}\n\n\t\tobj[pre + 'touchmove' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_MOVE, cb, false);\n\n\t\treturn this;\n\t},\n\n\taddPointerListenerEnd: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t touches = this._pointers;\n\n\t\tvar cb = function (e) {\n\t\t\tfor (var i = 0; i < touches.length; i++) {\n\t\t\t\tif (touches[i].pointerId === e.pointerId) {\n\t\t\t\t\ttouches.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\te.touches = touches.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t};\n\n\t\tobj[pre + 'touchend' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_UP, cb, false);\n\t\tobj.addEventListener(this.POINTER_CANCEL, cb, false);\n\n\t\treturn this;\n\t},\n\n\tremovePointerListener: function (obj, type, id) {\n\t\tvar pre = '_leaflet_',\n\t\t cb = obj[pre + type + id];\n\n\t\tswitch (type) {\n\t\tcase 'touchstart':\n\t\t\tobj.removeEventListener(this.POINTER_DOWN, cb, false);\n\t\t\tbreak;\n\t\tcase 'touchmove':\n\t\t\tobj.removeEventListener(this.POINTER_MOVE, cb, false);\n\t\t\tbreak;\n\t\tcase 'touchend':\n\t\t\tobj.removeEventListener(this.POINTER_UP, cb, false);\n\t\t\tobj.removeEventListener(this.POINTER_CANCEL, cb, false);\n\t\t\tbreak;\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n\n/*\n * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.\n */\n\nL.Map.mergeOptions({\n\ttouchZoom: L.Browser.touch && !L.Browser.android23,\n\tbounceAtZoomLimits: true\n});\n\nL.Map.TouchZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\t_onTouchStart: function (e) {\n\t\tvar map = this._map;\n\n\t\tif (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToLayerPoint(e.touches[0]),\n\t\t p2 = map.mouseEventToLayerPoint(e.touches[1]),\n\t\t viewCenter = map._getCenterLayerPoint();\n\n\t\tthis._startCenter = p1.add(p2)._divideBy(2);\n\t\tthis._startDist = p1.distanceTo(p2);\n\n\t\tthis._moved = false;\n\t\tthis._zooming = true;\n\n\t\tthis._centerOffset = viewCenter.subtract(this._startCenter);\n\n\t\tif (map._panAnim) {\n\t\t\tmap._panAnim.stop();\n\t\t}\n\n\t\tL.DomEvent\n\t\t .on(document, 'touchmove', this._onTouchMove, this)\n\t\t .on(document, 'touchend', this._onTouchEnd, this);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchMove: function (e) {\n\t\tvar map = this._map;\n\n\t\tif (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToLayerPoint(e.touches[0]),\n\t\t p2 = map.mouseEventToLayerPoint(e.touches[1]);\n\n\t\tthis._scale = p1.distanceTo(p2) / this._startDist;\n\t\tthis._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter);\n\n\t\tif (this._scale === 1) { return; }\n\n\t\tif (!map.options.bounceAtZoomLimits) {\n\t\t\tif ((map.getZoom() === map.getMinZoom() && this._scale < 1) ||\n\t\t\t (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; }\n\t\t}\n\n\t\tif (!this._moved) {\n\t\t\tL.DomUtil.addClass(map._mapPane, 'leaflet-touching');\n\n\t\t\tmap\n\t\t\t .fire('movestart')\n\t\t\t .fire('zoomstart');\n\n\t\t\tthis._moved = true;\n\t\t}\n\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\t\tthis._animRequest = L.Util.requestAnimFrame(\n\t\t this._updateOnMove, this, true, this._map._container);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_updateOnMove: function () {\n\t\tvar map = this._map,\n\t\t origin = this._getScaleOrigin(),\n\t\t center = map.layerPointToLatLng(origin),\n\t\t zoom = map.getScaleZoom(this._scale);\n\n\t\tmap._animateZoom(center, zoom, this._startCenter, this._scale, this._delta, false, true);\n\t},\n\n\t_onTouchEnd: function () {\n\t\tif (!this._moved || !this._zooming) {\n\t\t\tthis._zooming = false;\n\t\t\treturn;\n\t\t}\n\n\t\tvar map = this._map;\n\n\t\tthis._zooming = false;\n\t\tL.DomUtil.removeClass(map._mapPane, 'leaflet-touching');\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tL.DomEvent\n\t\t .off(document, 'touchmove', this._onTouchMove)\n\t\t .off(document, 'touchend', this._onTouchEnd);\n\n\t\tvar origin = this._getScaleOrigin(),\n\t\t center = map.layerPointToLatLng(origin),\n\n\t\t oldZoom = map.getZoom(),\n\t\t floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom,\n\t\t roundZoomDelta = (floatZoomDelta > 0 ?\n\t\t Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)),\n\n\t\t zoom = map._limitZoom(oldZoom + roundZoomDelta),\n\t\t scale = map.getZoomScale(zoom) / this._scale;\n\n\t\tmap._animateZoom(center, zoom, origin, scale);\n\t},\n\n\t_getScaleOrigin: function () {\n\t\tvar centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale);\n\t\treturn this._startCenter.add(centerOffset);\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);\n\n\n/*\n * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.\n */\n\nL.Map.mergeOptions({\n\ttap: true,\n\ttapTolerance: 15\n});\n\nL.Map.Tap = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\t_onDown: function (e) {\n\t\tif (!e.touches) { return; }\n\n\t\tL.DomEvent.preventDefault(e);\n\n\t\tthis._fireClick = true;\n\n\t\t// don't simulate click or track longpress if more than 1 touch\n\t\tif (e.touches.length > 1) {\n\t\t\tthis._fireClick = false;\n\t\t\tclearTimeout(this._holdTimeout);\n\t\t\treturn;\n\t\t}\n\n\t\tvar first = e.touches[0],\n\t\t el = first.target;\n\n\t\tthis._startPos = this._newPos = new L.Point(first.clientX, first.clientY);\n\n\t\t// if touching a link, highlight it\n\t\tif (el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\tL.DomUtil.addClass(el, 'leaflet-active');\n\t\t}\n\n\t\t// simulate long hold but setting a timeout\n\t\tthis._holdTimeout = setTimeout(L.bind(function () {\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._fireClick = false;\n\t\t\t\tthis._onUp();\n\t\t\t\tthis._simulateEvent('contextmenu', first);\n\t\t\t}\n\t\t}, this), 1000);\n\n\t\tL.DomEvent\n\t\t\t.on(document, 'touchmove', this._onMove, this)\n\t\t\t.on(document, 'touchend', this._onUp, this);\n\t},\n\n\t_onUp: function (e) {\n\t\tclearTimeout(this._holdTimeout);\n\n\t\tL.DomEvent\n\t\t\t.off(document, 'touchmove', this._onMove, this)\n\t\t\t.off(document, 'touchend', this._onUp, this);\n\n\t\tif (this._fireClick && e && e.changedTouches) {\n\n\t\t\tvar first = e.changedTouches[0],\n\t\t\t el = first.target;\n\n\t\t\tif (el && el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\t\tL.DomUtil.removeClass(el, 'leaflet-active');\n\t\t\t}\n\n\t\t\t// simulate click if the touch didn't move too much\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._simulateEvent('click', first);\n\t\t\t}\n\t\t}\n\t},\n\n\t_isTapValid: function () {\n\t\treturn this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;\n\t},\n\n\t_onMove: function (e) {\n\t\tvar first = e.touches[0];\n\t\tthis._newPos = new L.Point(first.clientX, first.clientY);\n\t},\n\n\t_simulateEvent: function (type, e) {\n\t\tvar simulatedEvent = document.createEvent('MouseEvents');\n\n\t\tsimulatedEvent._simulated = true;\n\t\te.target._simulatedClick = true;\n\n\t\tsimulatedEvent.initMouseEvent(\n\t\t type, true, true, window, 1,\n\t\t e.screenX, e.screenY,\n\t\t e.clientX, e.clientY,\n\t\t false, false, false, false, 0, null);\n\n\t\te.target.dispatchEvent(simulatedEvent);\n\t}\n});\n\nif (L.Browser.touch && !L.Browser.pointer) {\n\tL.Map.addInitHook('addHandler', 'tap', L.Map.Tap);\n}\n\n\n/*\n * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map\n * (zoom to a selected bounding box), enabled by default.\n */\n\nL.Map.mergeOptions({\n\tboxZoom: true\n});\n\nL.Map.BoxZoom = L.Handler.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t\tthis._container = map._container;\n\t\tthis._pane = map._panes.overlayPane;\n\t\tthis._moved = false;\n\t},\n\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._container, 'mousedown', this._onMouseDown);\n\t\tthis._moved = false;\n\t},\n\n\tmoved: function () {\n\t\treturn this._moved;\n\t},\n\n\t_onMouseDown: function (e) {\n\t\tthis._moved = false;\n\n\t\tif (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n\t\tL.DomUtil.disableTextSelection();\n\t\tL.DomUtil.disableImageDrag();\n\n\t\tthis._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n\t\tL.DomEvent\n\t\t .on(document, 'mousemove', this._onMouseMove, this)\n\t\t .on(document, 'mouseup', this._onMouseUp, this)\n\t\t .on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._moved) {\n\t\t\tthis._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n\t\t\tL.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n\t\t\t//TODO refactor: move cursor to styles\n\t\t\tthis._container.style.cursor = 'crosshair';\n\t\t\tthis._map.fire('boxzoomstart');\n\t\t}\n\n\t\tvar startPoint = this._startLayerPoint,\n\t\t box = this._box,\n\n\t\t layerPoint = this._map.mouseEventToLayerPoint(e),\n\t\t offset = layerPoint.subtract(startPoint),\n\n\t\t newPos = new L.Point(\n\t\t Math.min(layerPoint.x, startPoint.x),\n\t\t Math.min(layerPoint.y, startPoint.y));\n\n\t\tL.DomUtil.setPosition(box, newPos);\n\n\t\tthis._moved = true;\n\n\t\t// TODO refactor: remove hardcoded 4 pixels\n\t\tbox.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n\t\tbox.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n\t},\n\n\t_finish: function () {\n\t\tif (this._moved) {\n\t\t\tthis._pane.removeChild(this._box);\n\t\t\tthis._container.style.cursor = '';\n\t\t}\n\n\t\tL.DomUtil.enableTextSelection();\n\t\tL.DomUtil.enableImageDrag();\n\n\t\tL.DomEvent\n\t\t .off(document, 'mousemove', this._onMouseMove)\n\t\t .off(document, 'mouseup', this._onMouseUp)\n\t\t .off(document, 'keydown', this._onKeyDown);\n\t},\n\n\t_onMouseUp: function (e) {\n\n\t\tthis._finish();\n\n\t\tvar map = this._map,\n\t\t layerPoint = map.mouseEventToLayerPoint(e);\n\n\t\tif (this._startLayerPoint.equals(layerPoint)) { return; }\n\n\t\tvar bounds = new L.LatLngBounds(\n\t\t map.layerPointToLatLng(this._startLayerPoint),\n\t\t map.layerPointToLatLng(layerPoint));\n\n\t\tmap.fitBounds(bounds);\n\n\t\tmap.fire('boxzoomend', {\n\t\t\tboxZoomBounds: bounds\n\t\t});\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.keyCode === 27) {\n\t\t\tthis._finish();\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);\n\n\n/*\n * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.\n */\n\nL.Map.mergeOptions({\n\tkeyboard: true,\n\tkeyboardPanOffset: 80,\n\tkeyboardZoomOffset: 1\n});\n\nL.Map.Keyboard = L.Handler.extend({\n\n\tkeyCodes: {\n\t\tleft: [37],\n\t\tright: [39],\n\t\tdown: [40],\n\t\tup: [38],\n\t\tzoomIn: [187, 107, 61, 171],\n\t\tzoomOut: [189, 109, 173]\n\t},\n\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\n\t\tthis._setPanOffset(map.options.keyboardPanOffset);\n\t\tthis._setZoomOffset(map.options.keyboardZoomOffset);\n\t},\n\n\taddHooks: function () {\n\t\tvar container = this._map._container;\n\n\t\t// make the container focusable by tabbing\n\t\tif (container.tabIndex === -1) {\n\t\t\tcontainer.tabIndex = '0';\n\t\t}\n\n\t\tL.DomEvent\n\t\t .on(container, 'focus', this._onFocus, this)\n\t\t .on(container, 'blur', this._onBlur, this)\n\t\t .on(container, 'mousedown', this._onMouseDown, this);\n\n\t\tthis._map\n\t\t .on('focus', this._addHooks, this)\n\t\t .on('blur', this._removeHooks, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._removeHooks();\n\n\t\tvar container = this._map._container;\n\n\t\tL.DomEvent\n\t\t .off(container, 'focus', this._onFocus, this)\n\t\t .off(container, 'blur', this._onBlur, this)\n\t\t .off(container, 'mousedown', this._onMouseDown, this);\n\n\t\tthis._map\n\t\t .off('focus', this._addHooks, this)\n\t\t .off('blur', this._removeHooks, this);\n\t},\n\n\t_onMouseDown: function () {\n\t\tif (this._focused) { return; }\n\n\t\tvar body = document.body,\n\t\t docEl = document.documentElement,\n\t\t top = body.scrollTop || docEl.scrollTop,\n\t\t left = body.scrollLeft || docEl.scrollLeft;\n\n\t\tthis._map._container.focus();\n\n\t\twindow.scrollTo(left, top);\n\t},\n\n\t_onFocus: function () {\n\t\tthis._focused = true;\n\t\tthis._map.fire('focus');\n\t},\n\n\t_onBlur: function () {\n\t\tthis._focused = false;\n\t\tthis._map.fire('blur');\n\t},\n\n\t_setPanOffset: function (pan) {\n\t\tvar keys = this._panKeys = {},\n\t\t codes = this.keyCodes,\n\t\t i, len;\n\n\t\tfor (i = 0, len = codes.left.length; i < len; i++) {\n\t\t\tkeys[codes.left[i]] = [-1 * pan, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.right.length; i < len; i++) {\n\t\t\tkeys[codes.right[i]] = [pan, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.down.length; i < len; i++) {\n\t\t\tkeys[codes.down[i]] = [0, pan];\n\t\t}\n\t\tfor (i = 0, len = codes.up.length; i < len; i++) {\n\t\t\tkeys[codes.up[i]] = [0, -1 * pan];\n\t\t}\n\t},\n\n\t_setZoomOffset: function (zoom) {\n\t\tvar keys = this._zoomKeys = {},\n\t\t codes = this.keyCodes,\n\t\t i, len;\n\n\t\tfor (i = 0, len = codes.zoomIn.length; i < len; i++) {\n\t\t\tkeys[codes.zoomIn[i]] = zoom;\n\t\t}\n\t\tfor (i = 0, len = codes.zoomOut.length; i < len; i++) {\n\t\t\tkeys[codes.zoomOut[i]] = -zoom;\n\t\t}\n\t},\n\n\t_addHooks: function () {\n\t\tL.DomEvent.on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_removeHooks: function () {\n\t\tL.DomEvent.off(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tvar key = e.keyCode,\n\t\t map = this._map;\n\n\t\tif (key in this._panKeys) {\n\n\t\t\tif (map._panAnim && map._panAnim._inProgress) { return; }\n\n\t\t\tmap.panBy(this._panKeys[key]);\n\n\t\t\tif (map.options.maxBounds) {\n\t\t\t\tmap.panInsideBounds(map.options.maxBounds);\n\t\t\t}\n\n\t\t} else if (key in this._zoomKeys) {\n\t\t\tmap.setZoom(map.getZoom() + this._zoomKeys[key]);\n\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tL.DomEvent.stop(e);\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);\n\n\n/*\n * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.\n */\n\nL.Handler.MarkerDrag = L.Handler.extend({\n\tinitialize: function (marker) {\n\t\tthis._marker = marker;\n\t},\n\n\taddHooks: function () {\n\t\tvar icon = this._marker._icon;\n\t\tif (!this._draggable) {\n\t\t\tthis._draggable = new L.Draggable(icon, icon);\n\t\t}\n\n\t\tthis._draggable\n\t\t\t.on('dragstart', this._onDragStart, this)\n\t\t\t.on('drag', this._onDrag, this)\n\t\t\t.on('dragend', this._onDragEnd, this);\n\t\tthis._draggable.enable();\n\t\tL.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable');\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable\n\t\t\t.off('dragstart', this._onDragStart, this)\n\t\t\t.off('drag', this._onDrag, this)\n\t\t\t.off('dragend', this._onDragEnd, this);\n\n\t\tthis._draggable.disable();\n\t\tL.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\tthis._marker\n\t\t .closePopup()\n\t\t .fire('movestart')\n\t\t .fire('dragstart');\n\t},\n\n\t_onDrag: function () {\n\t\tvar marker = this._marker,\n\t\t shadow = marker._shadow,\n\t\t iconPos = L.DomUtil.getPosition(marker._icon),\n\t\t latlng = marker._map.layerPointToLatLng(iconPos);\n\n\t\t// update shadow position\n\t\tif (shadow) {\n\t\t\tL.DomUtil.setPosition(shadow, iconPos);\n\t\t}\n\n\t\tmarker._latlng = latlng;\n\n\t\tmarker\n\t\t .fire('move', {latlng: latlng})\n\t\t .fire('drag');\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tthis._marker\n\t\t .fire('moveend')\n\t\t .fire('dragend', e);\n\t}\n});\n\n\n/*\n * L.Control is a base class for implementing map controls. Handles positioning.\n * All other controls extend from this class.\n */\n\nL.Control = L.Class.extend({\n\toptions: {\n\t\tposition: 'topright'\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\t},\n\n\tgetPosition: function () {\n\t\treturn this.options.position;\n\t},\n\n\tsetPosition: function (position) {\n\t\tvar map = this._map;\n\n\t\tif (map) {\n\t\t\tmap.removeControl(this);\n\t\t}\n\n\t\tthis.options.position = position;\n\n\t\tif (map) {\n\t\t\tmap.addControl(this);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tgetContainer: function () {\n\t\treturn this._container;\n\t},\n\n\taddTo: function (map) {\n\t\tthis._map = map;\n\n\t\tvar container = this._container = this.onAdd(map),\n\t\t pos = this.getPosition(),\n\t\t corner = map._controlCorners[pos];\n\n\t\tL.DomUtil.addClass(container, 'leaflet-control');\n\n\t\tif (pos.indexOf('bottom') !== -1) {\n\t\t\tcorner.insertBefore(container, corner.firstChild);\n\t\t} else {\n\t\t\tcorner.appendChild(container);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveFrom: function (map) {\n\t\tvar pos = this.getPosition(),\n\t\t corner = map._controlCorners[pos];\n\n\t\tcorner.removeChild(this._container);\n\t\tthis._map = null;\n\n\t\tif (this.onRemove) {\n\t\t\tthis.onRemove(map);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_refocusOnMap: function () {\n\t\tif (this._map) {\n\t\t\tthis._map.getContainer().focus();\n\t\t}\n\t}\n});\n\nL.control = function (options) {\n\treturn new L.Control(options);\n};\n\n\n// adds control-related methods to L.Map\n\nL.Map.include({\n\taddControl: function (control) {\n\t\tcontrol.addTo(this);\n\t\treturn this;\n\t},\n\n\tremoveControl: function (control) {\n\t\tcontrol.removeFrom(this);\n\t\treturn this;\n\t},\n\n\t_initControlPos: function () {\n\t\tvar corners = this._controlCorners = {},\n\t\t l = 'leaflet-',\n\t\t container = this._controlContainer =\n\t\t L.DomUtil.create('div', l + 'control-container', this._container);\n\n\t\tfunction createCorner(vSide, hSide) {\n\t\t\tvar className = l + vSide + ' ' + l + hSide;\n\n\t\t\tcorners[vSide + hSide] = L.DomUtil.create('div', className, container);\n\t\t}\n\n\t\tcreateCorner('top', 'left');\n\t\tcreateCorner('top', 'right');\n\t\tcreateCorner('bottom', 'left');\n\t\tcreateCorner('bottom', 'right');\n\t},\n\n\t_clearControlPos: function () {\n\t\tthis._container.removeChild(this._controlContainer);\n\t}\n});\n\n\n/*\n * L.Control.Zoom is used for the default zoom buttons on the map.\n */\n\nL.Control.Zoom = L.Control.extend({\n\toptions: {\n\t\tposition: 'topleft',\n\t\tzoomInText: '+',\n\t\tzoomInTitle: 'Zoom in',\n\t\tzoomOutText: '-',\n\t\tzoomOutTitle: 'Zoom out'\n\t},\n\n\tonAdd: function (map) {\n\t\tvar zoomName = 'leaflet-control-zoom',\n\t\t container = L.DomUtil.create('div', zoomName + ' leaflet-bar');\n\n\t\tthis._map = map;\n\n\t\tthis._zoomInButton = this._createButton(\n\t\t this.options.zoomInText, this.options.zoomInTitle,\n\t\t zoomName + '-in', container, this._zoomIn, this);\n\t\tthis._zoomOutButton = this._createButton(\n\t\t this.options.zoomOutText, this.options.zoomOutTitle,\n\t\t zoomName + '-out', container, this._zoomOut, this);\n\n\t\tthis._updateDisabled();\n\t\tmap.on('zoomend zoomlevelschange', this._updateDisabled, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off('zoomend zoomlevelschange', this._updateDisabled, this);\n\t},\n\n\t_zoomIn: function (e) {\n\t\tthis._map.zoomIn(e.shiftKey ? 3 : 1);\n\t},\n\n\t_zoomOut: function (e) {\n\t\tthis._map.zoomOut(e.shiftKey ? 3 : 1);\n\t},\n\n\t_createButton: function (html, title, className, container, fn, context) {\n\t\tvar link = L.DomUtil.create('a', className, container);\n\t\tlink.innerHTML = html;\n\t\tlink.href = '#';\n\t\tlink.title = title;\n\n\t\tvar stop = L.DomEvent.stopPropagation;\n\n\t\tL.DomEvent\n\t\t .on(link, 'click', stop)\n\t\t .on(link, 'mousedown', stop)\n\t\t .on(link, 'dblclick', stop)\n\t\t .on(link, 'click', L.DomEvent.preventDefault)\n\t\t .on(link, 'click', fn, context)\n\t\t .on(link, 'click', this._refocusOnMap, context);\n\n\t\treturn link;\n\t},\n\n\t_updateDisabled: function () {\n\t\tvar map = this._map,\n\t\t\tclassName = 'leaflet-disabled';\n\n\t\tL.DomUtil.removeClass(this._zoomInButton, className);\n\t\tL.DomUtil.removeClass(this._zoomOutButton, className);\n\n\t\tif (map._zoom === map.getMinZoom()) {\n\t\t\tL.DomUtil.addClass(this._zoomOutButton, className);\n\t\t}\n\t\tif (map._zoom === map.getMaxZoom()) {\n\t\t\tL.DomUtil.addClass(this._zoomInButton, className);\n\t\t}\n\t}\n});\n\nL.Map.mergeOptions({\n\tzoomControl: true\n});\n\nL.Map.addInitHook(function () {\n\tif (this.options.zoomControl) {\n\t\tthis.zoomControl = new L.Control.Zoom();\n\t\tthis.addControl(this.zoomControl);\n\t}\n});\n\nL.control.zoom = function (options) {\n\treturn new L.Control.Zoom(options);\n};\n\n\n\n/*\n * L.Control.Attribution is used for displaying attribution on the map (added by default).\n */\n\nL.Control.Attribution = L.Control.extend({\n\toptions: {\n\t\tposition: 'bottomright',\n\t\tprefix: 'Leaflet'\n\t},\n\n\tinitialize: function (options) {\n\t\tL.setOptions(this, options);\n\n\t\tthis._attributions = {};\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-control-attribution');\n\t\tL.DomEvent.disableClickPropagation(this._container);\n\n\t\tfor (var i in map._layers) {\n\t\t\tif (map._layers[i].getAttribution) {\n\t\t\t\tthis.addAttribution(map._layers[i].getAttribution());\n\t\t\t}\n\t\t}\n\t\t\n\t\tmap\n\t\t .on('layeradd', this._onLayerAdd, this)\n\t\t .on('layerremove', this._onLayerRemove, this);\n\n\t\tthis._update();\n\n\t\treturn this._container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap\n\t\t .off('layeradd', this._onLayerAdd)\n\t\t .off('layerremove', this._onLayerRemove);\n\n\t},\n\n\tsetPrefix: function (prefix) {\n\t\tthis.options.prefix = prefix;\n\t\tthis._update();\n\t\treturn this;\n\t},\n\n\taddAttribution: function (text) {\n\t\tif (!text) { return; }\n\n\t\tif (!this._attributions[text]) {\n\t\t\tthis._attributions[text] = 0;\n\t\t}\n\t\tthis._attributions[text]++;\n\n\t\tthis._update();\n\n\t\treturn this;\n\t},\n\n\tremoveAttribution: function (text) {\n\t\tif (!text) { return; }\n\n\t\tif (this._attributions[text]) {\n\t\t\tthis._attributions[text]--;\n\t\t\tthis._update();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_update: function () {\n\t\tif (!this._map) { return; }\n\n\t\tvar attribs = [];\n\n\t\tfor (var i in this._attributions) {\n\t\t\tif (this._attributions[i]) {\n\t\t\t\tattribs.push(i);\n\t\t\t}\n\t\t}\n\n\t\tvar prefixAndAttribs = [];\n\n\t\tif (this.options.prefix) {\n\t\t\tprefixAndAttribs.push(this.options.prefix);\n\t\t}\n\t\tif (attribs.length) {\n\t\t\tprefixAndAttribs.push(attribs.join(', '));\n\t\t}\n\n\t\tthis._container.innerHTML = prefixAndAttribs.join(' | ');\n\t},\n\n\t_onLayerAdd: function (e) {\n\t\tif (e.layer.getAttribution) {\n\t\t\tthis.addAttribution(e.layer.getAttribution());\n\t\t}\n\t},\n\n\t_onLayerRemove: function (e) {\n\t\tif (e.layer.getAttribution) {\n\t\t\tthis.removeAttribution(e.layer.getAttribution());\n\t\t}\n\t}\n});\n\nL.Map.mergeOptions({\n\tattributionControl: true\n});\n\nL.Map.addInitHook(function () {\n\tif (this.options.attributionControl) {\n\t\tthis.attributionControl = (new L.Control.Attribution()).addTo(this);\n\t}\n});\n\nL.control.attribution = function (options) {\n\treturn new L.Control.Attribution(options);\n};\n\n\n/*\n * L.Control.Scale is used for displaying metric/imperial scale on the map.\n */\n\nL.Control.Scale = L.Control.extend({\n\toptions: {\n\t\tposition: 'bottomleft',\n\t\tmaxWidth: 100,\n\t\tmetric: true,\n\t\timperial: true,\n\t\tupdateWhenIdle: false\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\n\t\tvar className = 'leaflet-control-scale',\n\t\t container = L.DomUtil.create('div', className),\n\t\t options = this.options;\n\n\t\tthis._addScales(options, className, container);\n\n\t\tmap.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t\tmap.whenReady(this._update, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t},\n\n\t_addScales: function (options, className, container) {\n\t\tif (options.metric) {\n\t\t\tthis._mScale = L.DomUtil.create('div', className + '-line', container);\n\t\t}\n\t\tif (options.imperial) {\n\t\t\tthis._iScale = L.DomUtil.create('div', className + '-line', container);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tvar bounds = this._map.getBounds(),\n\t\t centerLat = bounds.getCenter().lat,\n\t\t halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),\n\t\t dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180,\n\n\t\t size = this._map.getSize(),\n\t\t options = this.options,\n\t\t maxMeters = 0;\n\n\t\tif (size.x > 0) {\n\t\t\tmaxMeters = dist * (options.maxWidth / size.x);\n\t\t}\n\n\t\tthis._updateScales(options, maxMeters);\n\t},\n\n\t_updateScales: function (options, maxMeters) {\n\t\tif (options.metric && maxMeters) {\n\t\t\tthis._updateMetric(maxMeters);\n\t\t}\n\n\t\tif (options.imperial && maxMeters) {\n\t\t\tthis._updateImperial(maxMeters);\n\t\t}\n\t},\n\n\t_updateMetric: function (maxMeters) {\n\t\tvar meters = this._getRoundNum(maxMeters);\n\n\t\tthis._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px';\n\t\tthis._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\t},\n\n\t_updateImperial: function (maxMeters) {\n\t\tvar maxFeet = maxMeters * 3.2808399,\n\t\t scale = this._iScale,\n\t\t maxMiles, miles, feet;\n\n\t\tif (maxFeet > 5280) {\n\t\t\tmaxMiles = maxFeet / 5280;\n\t\t\tmiles = this._getRoundNum(maxMiles);\n\n\t\t\tscale.style.width = this._getScaleWidth(miles / maxMiles) + 'px';\n\t\t\tscale.innerHTML = miles + ' mi';\n\n\t\t} else {\n\t\t\tfeet = this._getRoundNum(maxFeet);\n\n\t\t\tscale.style.width = this._getScaleWidth(feet / maxFeet) + 'px';\n\t\t\tscale.innerHTML = feet + ' ft';\n\t\t}\n\t},\n\n\t_getScaleWidth: function (ratio) {\n\t\treturn Math.round(this.options.maxWidth * ratio) - 10;\n\t},\n\n\t_getRoundNum: function (num) {\n\t\tvar pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n\t\t d = num / pow10;\n\n\t\td = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1;\n\n\t\treturn pow10 * d;\n\t}\n});\n\nL.control.scale = function (options) {\n\treturn new L.Control.Scale(options);\n};\n\n\n/*\n * L.Control.Layers is a control to allow users to switch between different layers on the map.\n */\n\nL.Control.Layers = L.Control.extend({\n\toptions: {\n\t\tcollapsed: true,\n\t\tposition: 'topright',\n\t\tautoZIndex: true\n\t},\n\n\tinitialize: function (baseLayers, overlays, options) {\n\t\tL.setOptions(this, options);\n\n\t\tthis._layers = {};\n\t\tthis._lastZIndex = 0;\n\t\tthis._handlingClick = false;\n\n\t\tfor (var i in baseLayers) {\n\t\t\tthis._addLayer(baseLayers[i], i);\n\t\t}\n\n\t\tfor (i in overlays) {\n\t\t\tthis._addLayer(overlays[i], i, true);\n\t\t}\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._initLayout();\n\t\tthis._update();\n\n\t\tmap\n\t\t .on('layeradd', this._onLayerChange, this)\n\t\t .on('layerremove', this._onLayerChange, this);\n\n\t\treturn this._container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap\n\t\t .off('layeradd', this._onLayerChange, this)\n\t\t .off('layerremove', this._onLayerChange, this);\n\t},\n\n\taddBaseLayer: function (layer, name) {\n\t\tthis._addLayer(layer, name);\n\t\tthis._update();\n\t\treturn this;\n\t},\n\n\taddOverlay: function (layer, name) {\n\t\tthis._addLayer(layer, name, true);\n\t\tthis._update();\n\t\treturn this;\n\t},\n\n\tremoveLayer: function (layer) {\n\t\tvar id = L.stamp(layer);\n\t\tdelete this._layers[id];\n\t\tthis._update();\n\t\treturn this;\n\t},\n\n\t_initLayout: function () {\n\t\tvar className = 'leaflet-control-layers',\n\t\t container = this._container = L.DomUtil.create('div', className);\n\n\t\t//Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released\n\t\tcontainer.setAttribute('aria-haspopup', true);\n\n\t\tif (!L.Browser.touch) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container)\n\t\t\t\t.disableScrollPropagation(container);\n\t\t} else {\n\t\t\tL.DomEvent.on(container, 'click', L.DomEvent.stopPropagation);\n\t\t}\n\n\t\tvar form = this._form = L.DomUtil.create('form', className + '-list');\n\n\t\tif (this.options.collapsed) {\n\t\t\tif (!L.Browser.android) {\n\t\t\t\tL.DomEvent\n\t\t\t\t .on(container, 'mouseover', this._expand, this)\n\t\t\t\t .on(container, 'mouseout', this._collapse, this);\n\t\t\t}\n\t\t\tvar link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);\n\t\t\tlink.href = '#';\n\t\t\tlink.title = 'Layers';\n\n\t\t\tif (L.Browser.touch) {\n\t\t\t\tL.DomEvent\n\t\t\t\t .on(link, 'click', L.DomEvent.stop)\n\t\t\t\t .on(link, 'click', this._expand, this);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tL.DomEvent.on(link, 'focus', this._expand, this);\n\t\t\t}\n\t\t\t//Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033\n\t\t\tL.DomEvent.on(form, 'click', function () {\n\t\t\t\tsetTimeout(L.bind(this._onInputClick, this), 0);\n\t\t\t}, this);\n\n\t\t\tthis._map.on('click', this._collapse, this);\n\t\t\t// TODO keyboard accessibility\n\t\t} else {\n\t\t\tthis._expand();\n\t\t}\n\n\t\tthis._baseLayersList = L.DomUtil.create('div', className + '-base', form);\n\t\tthis._separator = L.DomUtil.create('div', className + '-separator', form);\n\t\tthis._overlaysList = L.DomUtil.create('div', className + '-overlays', form);\n\n\t\tcontainer.appendChild(form);\n\t},\n\n\t_addLayer: function (layer, name, overlay) {\n\t\tvar id = L.stamp(layer);\n\n\t\tthis._layers[id] = {\n\t\t\tlayer: layer,\n\t\t\tname: name,\n\t\t\toverlay: overlay\n\t\t};\n\n\t\tif (this.options.autoZIndex && layer.setZIndex) {\n\t\t\tthis._lastZIndex++;\n\t\t\tlayer.setZIndex(this._lastZIndex);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tif (!this._container) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._baseLayersList.innerHTML = '';\n\t\tthis._overlaysList.innerHTML = '';\n\n\t\tvar baseLayersPresent = false,\n\t\t overlaysPresent = false,\n\t\t i, obj;\n\n\t\tfor (i in this._layers) {\n\t\t\tobj = this._layers[i];\n\t\t\tthis._addItem(obj);\n\t\t\toverlaysPresent = overlaysPresent || obj.overlay;\n\t\t\tbaseLayersPresent = baseLayersPresent || !obj.overlay;\n\t\t}\n\n\t\tthis._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';\n\t},\n\n\t_onLayerChange: function (e) {\n\t\tvar obj = this._layers[L.stamp(e.layer)];\n\n\t\tif (!obj) { return; }\n\n\t\tif (!this._handlingClick) {\n\t\t\tthis._update();\n\t\t}\n\n\t\tvar type = obj.overlay ?\n\t\t\t(e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') :\n\t\t\t(e.type === 'layeradd' ? 'baselayerchange' : null);\n\n\t\tif (type) {\n\t\t\tthis._map.fire(type, obj);\n\t\t}\n\t},\n\n\t// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)\n\t_createRadioElement: function (name, checked) {\n\n\t\tvar radioHtml = '= 0) {\n\t\t\tthis._onZoomTransitionEnd();\n\t\t}\n\t},\n\n\t_nothingToAnimate: function () {\n\t\treturn !this._container.getElementsByClassName('leaflet-zoom-animated').length;\n\t},\n\n\t_tryAnimatedZoom: function (center, zoom, options) {\n\n\t\tif (this._animatingZoom) { return true; }\n\n\t\toptions = options || {};\n\n\t\t// don't animate if disabled, not supported or zoom difference is too large\n\t\tif (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||\n\t\t Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }\n\n\t\t// offset is the pixel coords of the zoom origin relative to the current center\n\t\tvar scale = this.getZoomScale(zoom),\n\t\t offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale),\n\t\t\torigin = this._getCenterLayerPoint()._add(offset);\n\n\t\t// don't animate if the zoom origin isn't within one screen from the current center, unless forced\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) { return false; }\n\n\t\tthis\n\t\t .fire('movestart')\n\t\t .fire('zoomstart');\n\n\t\tthis._animateZoom(center, zoom, origin, scale, null, true);\n\n\t\treturn true;\n\t},\n\n\t_animateZoom: function (center, zoom, origin, scale, delta, backwards, forTouchZoom) {\n\n\t\tif (!forTouchZoom) {\n\t\t\tthis._animatingZoom = true;\n\t\t}\n\n\t\t// put transform transition on all layers with leaflet-zoom-animated class\n\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\t// remember what center/zoom to set after animation\n\t\tthis._animateToCenter = center;\n\t\tthis._animateToZoom = zoom;\n\n\t\t// disable any dragging during animation\n\t\tif (L.Draggable) {\n\t\t\tL.Draggable._disabled = true;\n\t\t}\n\n\t\tL.Util.requestAnimFrame(function () {\n\t\t\tthis.fire('zoomanim', {\n\t\t\t\tcenter: center,\n\t\t\t\tzoom: zoom,\n\t\t\t\torigin: origin,\n\t\t\t\tscale: scale,\n\t\t\t\tdelta: delta,\n\t\t\t\tbackwards: backwards\n\t\t\t});\n\t\t\t// horrible hack to work around a Chrome bug https://github.com/Leaflet/Leaflet/issues/3689\n\t\t\tsetTimeout(L.bind(this._onZoomTransitionEnd, this), 250);\n\t\t}, this);\n\t},\n\n\t_onZoomTransitionEnd: function () {\n\t\tif (!this._animatingZoom) { return; }\n\n\t\tthis._animatingZoom = false;\n\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\tL.Util.requestAnimFrame(function () {\n\t\t\tthis._resetView(this._animateToCenter, this._animateToZoom, true, true);\n\n\t\t\tif (L.Draggable) {\n\t\t\t\tL.Draggable._disabled = false;\n\t\t\t}\n\t\t}, this);\n\t}\n});\n\n\n/*\n\tZoom animation logic for L.TileLayer.\n*/\n\nL.TileLayer.include({\n\t_animateZoom: function (e) {\n\t\tif (!this._animating) {\n\t\t\tthis._animating = true;\n\t\t\tthis._prepareBgBuffer();\n\t\t}\n\n\t\tvar bg = this._bgBuffer,\n\t\t transform = L.DomUtil.TRANSFORM,\n\t\t initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform],\n\t\t scaleStr = L.DomUtil.getScaleString(e.scale, e.origin);\n\n\t\tbg.style[transform] = e.backwards ?\n\t\t\t\tscaleStr + ' ' + initialTransform :\n\t\t\t\tinitialTransform + ' ' + scaleStr;\n\t},\n\n\t_endZoomAnim: function () {\n\t\tvar front = this._tileContainer,\n\t\t bg = this._bgBuffer;\n\n\t\tfront.style.visibility = '';\n\t\tfront.parentNode.appendChild(front); // Bring to fore\n\n\t\t// force reflow\n\t\tL.Util.falseFn(bg.offsetWidth);\n\n\t\tvar zoom = this._map.getZoom();\n\t\tif (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\n\t\t\tthis._clearBgBuffer();\n\t\t}\n\n\t\tthis._animating = false;\n\t},\n\n\t_clearBgBuffer: function () {\n\t\tvar map = this._map;\n\n\t\tif (map && !map._animatingZoom && !map.touchZoom._zooming) {\n\t\t\tthis._bgBuffer.innerHTML = '';\n\t\t\tthis._bgBuffer.style[L.DomUtil.TRANSFORM] = '';\n\t\t}\n\t},\n\n\t_prepareBgBuffer: function () {\n\n\t\tvar front = this._tileContainer,\n\t\t bg = this._bgBuffer;\n\n\t\t// if foreground layer doesn't have many tiles but bg layer does,\n\t\t// keep the existing bg layer and just zoom it some more\n\n\t\tvar bgLoaded = this._getLoadedTilesPercentage(bg),\n\t\t frontLoaded = this._getLoadedTilesPercentage(front);\n\n\t\tif (bg && bgLoaded > 0.5 && frontLoaded < 0.5) {\n\n\t\t\tfront.style.visibility = 'hidden';\n\t\t\tthis._stopLoadingImages(front);\n\t\t\treturn;\n\t\t}\n\n\t\t// prepare the buffer to become the front tile pane\n\t\tbg.style.visibility = 'hidden';\n\t\tbg.style[L.DomUtil.TRANSFORM] = '';\n\n\t\t// switch out the current layer to be the new bg layer (and vice-versa)\n\t\tthis._tileContainer = bg;\n\t\tbg = this._bgBuffer = front;\n\n\t\tthis._stopLoadingImages(bg);\n\n\t\t//prevent bg buffer from clearing right after zoom\n\t\tclearTimeout(this._clearBgBufferTimer);\n\t},\n\n\t_getLoadedTilesPercentage: function (container) {\n\t\tvar tiles = container.getElementsByTagName('img'),\n\t\t i, len, count = 0;\n\n\t\tfor (i = 0, len = tiles.length; i < len; i++) {\n\t\t\tif (tiles[i].complete) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count / len;\n\t},\n\n\t// stops loading all tiles in the background layer\n\t_stopLoadingImages: function (container) {\n\t\tvar tiles = Array.prototype.slice.call(container.getElementsByTagName('img')),\n\t\t i, len, tile;\n\n\t\tfor (i = 0, len = tiles.length; i < len; i++) {\n\t\t\ttile = tiles[i];\n\n\t\t\tif (!tile.complete) {\n\t\t\t\ttile.onload = L.Util.falseFn;\n\t\t\t\ttile.onerror = L.Util.falseFn;\n\t\t\t\ttile.src = L.Util.emptyImageUrl;\n\n\t\t\t\ttile.parentNode.removeChild(tile);\n\t\t\t}\n\t\t}\n\t}\n});\n\n\n/*\n * Provides L.Map with convenient shortcuts for using browser geolocation features.\n */\n\nL.Map.include({\n\t_defaultLocateOptions: {\n\t\twatch: false,\n\t\tsetView: false,\n\t\tmaxZoom: Infinity,\n\t\ttimeout: 10000,\n\t\tmaximumAge: 0,\n\t\tenableHighAccuracy: false\n\t},\n\n\tlocate: function (/*Object*/ options) {\n\n\t\toptions = this._locateOptions = L.extend(this._defaultLocateOptions, options);\n\n\t\tif (!navigator.geolocation) {\n\t\t\tthis._handleGeolocationError({\n\t\t\t\tcode: 0,\n\t\t\t\tmessage: 'Geolocation not supported.'\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tvar onResponse = L.bind(this._handleGeolocationResponse, this),\n\t\t\tonError = L.bind(this._handleGeolocationError, this);\n\n\t\tif (options.watch) {\n\t\t\tthis._locationWatchId =\n\t\t\t navigator.geolocation.watchPosition(onResponse, onError, options);\n\t\t} else {\n\t\t\tnavigator.geolocation.getCurrentPosition(onResponse, onError, options);\n\t\t}\n\t\treturn this;\n\t},\n\n\tstopLocate: function () {\n\t\tif (navigator.geolocation) {\n\t\t\tnavigator.geolocation.clearWatch(this._locationWatchId);\n\t\t}\n\t\tif (this._locateOptions) {\n\t\t\tthis._locateOptions.setView = false;\n\t\t}\n\t\treturn this;\n\t},\n\n\t_handleGeolocationError: function (error) {\n\t\tvar c = error.code,\n\t\t message = error.message ||\n\t\t (c === 1 ? 'permission denied' :\n\t\t (c === 2 ? 'position unavailable' : 'timeout'));\n\n\t\tif (this._locateOptions.setView && !this._loaded) {\n\t\t\tthis.fitWorld();\n\t\t}\n\n\t\tthis.fire('locationerror', {\n\t\t\tcode: c,\n\t\t\tmessage: 'Geolocation error: ' + message + '.'\n\t\t});\n\t},\n\n\t_handleGeolocationResponse: function (pos) {\n\t\tvar lat = pos.coords.latitude,\n\t\t lng = pos.coords.longitude,\n\t\t latlng = new L.LatLng(lat, lng),\n\n\t\t latAccuracy = 180 * pos.coords.accuracy / 40075017,\n\t\t lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat),\n\n\t\t bounds = L.latLngBounds(\n\t\t [lat - latAccuracy, lng - lngAccuracy],\n\t\t [lat + latAccuracy, lng + lngAccuracy]),\n\n\t\t options = this._locateOptions;\n\n\t\tif (options.setView) {\n\t\t\tvar zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom);\n\t\t\tthis.setView(latlng, zoom);\n\t\t}\n\n\t\tvar data = {\n\t\t\tlatlng: latlng,\n\t\t\tbounds: bounds,\n\t\t\ttimestamp: pos.timestamp\n\t\t};\n\n\t\tfor (var i in pos.coords) {\n\t\t\tif (typeof pos.coords[i] === 'number') {\n\t\t\t\tdata[i] = pos.coords[i];\n\t\t\t}\n\t\t}\n\n\t\tthis.fire('locationfound', data);\n\t}\n});\n\n\n}(window, document));\n","define('display/svgIcon',['leaflet'], function (L) {\n 'use strict';\n\n var stylesCache = {};\n\n function setNodeIconAnchorStyle(options, node) {\n if (options.iconAnchor) {\n var anchor = L.point(options.iconAnchor);\n node.style.marginLeft = (-anchor.x) + 'px';\n node.style.marginTop = (-anchor.y) + 'px';\n }\n }\n\n function setNodeStyleFromStyleOption(options, node) {\n var css;\n for (css in options.style) {\n if (options.style.hasOwnProperty(css)) {\n node.style[css] = options.style[css];\n }\n }\n }\n\n function setNodeStyle(node, options) {\n node.style.width = options.iconSize[0] + 'px';\n node.style.height = options.iconSize[1] + 'px';\n node.style.backgroundSize = options.iconSize[0] + 'px ' + options.iconSize[1] + 'px';\n setNodeIconAnchorStyle(options, node);\n node.style.position = 'absolute';\n node.style.textAlign = 'center';\n node.style.verticalAlign = 'middle';\n node.style.lineHeight = options.iconSize[1] + 'px';\n if (options.style) {\n setNodeStyleFromStyleOption(options, node);\n }\n }\n\n function getStyleByClassName(className) {\n var styleSheets = document.styleSheets,\n classes,\n i, j;\n for (i = 0; i < styleSheets.length; i += 1) {\n classes = styleSheets[i].rules || styleSheets[i].cssRules || [];\n for (j = 0; j < classes.length; j += 1) {\n if (classes[j].selectorText && classes[j].selectorText.indexOf('.' + className) > -1 && classes[j].style['background-image']) {\n return classes[j].style['background-image'];\n }\n }\n }\n }\n\n function getCachedStyleByClassName(className) {\n if (!stylesCache[className]) {\n stylesCache[className] = getStyleByClassName(className);\n }\n return stylesCache[className];\n }\n\n function extractBackgroundToPlainSVG(node, options, className) {\n var svg = window.getComputedStyle(node).getPropertyValue('background-image') || getCachedStyleByClassName(className),\n match;\n if (!svg) {\n return;\n }\n match = svg.match(/(%3Csvg[^\"']+%3C%2Fsvg%3E)/i);\n if (!match) {\n return;\n }\n svg = decodeURIComponent(match[1]);\n node.innerHTML = svg;\n node.firstChild.setAttribute('width', options.iconSize[0] + 'px');\n node.firstChild.setAttribute('height', options.iconSize[1] + 'px');\n node.firstChild.setAttribute('style', 'display: block; position: absolute;');\n node.style.backgroundImage = 'none';\n }\n\n function createDiv(options, parent) {\n var node = L.DomUtil.create('div', 'icon ' + (options.icon || 'content'), parent);\n setNodeStyle(node, options);\n if (options.icon && !options.noPlainSVG) {\n extractBackgroundToPlainSVG(node, options, options.icon);\n }\n if (options.content) {\n node.innerHTML = options.content;\n }\n return node;\n }\n\n function createImg(options, parent) {\n var node = L.DomUtil.create('div', 'icon-image', parent),\n img = L.DomUtil.create('img', 'icon-image-img', node);\n img.style.width = options.iconSize[0] + 'px';\n img.style.height = options.iconSize[1] + 'px';\n if (/^http/i.test(options.icon)) {\n img.src = options.icon;\n } else {\n img.src = L.Icon.Default.imagePath + '/' + options.icon;\n }\n setNodeStyle(node, options);\n return node;\n }\n\n function isFile(name) {\n return (/\\.(gif|jpg|jpeg|tiff|png|svg)$/i).test(name);\n }\n\n function createNode(options, parent) {\n if (L.Browser.svg && !isFile(options.icon)) {\n return createDiv(options, parent);\n }\n return createImg(options, parent);\n }\n\n var defaultOptions = {\n background: {\n iconSize: L.Browser.retina ? [50, 60] : [30, 36],\n iconAnchor: L.Browser.retina ? [25, 60] : [15, 36],\n icon: 'icon-marker',\n noPlainSVG: false\n },\n icon: {\n iconSize: L.Browser.retina ? [50, 50] : [30, 30],\n iconAnchor: [0, 0],\n icon: 'icon-flag-white',\n noPlainSVG: false\n },\n popupAnchor: L.Browser.retina ? [0, -50] : [0, -30],\n opacity: 0.8\n };\n\n function mergeOptions(result, source, option) {\n if (source.hasOwnProperty(option)) {\n result[option] = source[option] ? L.extend({}, defaultOptions[option], source[option]) : null;\n }\n }\n\n /**\n * options: {\n * background: {\n * iconSize: L.Browser.retina ? [50, 60] : [30, 36],\n * iconAnchor: L.Browser.retina ? [25, 60] : [15, 36],\n * icon: 'marker',\n * noPlainSVG: false\n * },\n * icon: {\n * iconSize: L.Browser.retina ? [50, 50] : [30, 30],\n * iconAnchor: [0, 0],\n * icon: 'flag-white',\n * noPlainSVG: false\n * },\n * content: {\n * iconSize: [30, 30],\n * iconAnchor: [0, 0],\n * content: '',\n * noPlainSVG: true,\n * style: {\n * 'color': '#fff',\n * 'font-weight': 'bold',\n * 'font-size': '20px'\n * }\n * }\n * popupAnchor: L.Browser.retina ? [0, -50] : [0, -30],\n * opacity: 0.8\n */\n\n L.SVGIcon = L.Icon.extend({\n initialize: function (options) {\n this.options = L.Util.extend({}, defaultOptions, options);\n if (!options) {\n return;\n }\n mergeOptions(this.options, options, 'background');\n mergeOptions(this.options, options, 'icon');\n },\n\n createIcon: function () {\n var options = this.options;\n this.container = createNode(options.background || options.icon);\n if (options.background && options.icon && options.icon.icon) {\n createNode(options.icon, this.container);\n }\n if (options.content) {\n this.contentContainer = createDiv(options.content, this.container);\n }\n L.DomUtil.setOpacity(this.container, options.opacity);\n return this.container;\n },\n\n setContent: function (content) {\n if (this.contentContainer) {\n this.contentContainer.innerHTML = content;\n }\n },\n\n setOpacity: function (opacity) {\n this.options.opacity = opacity;\n L.DomUtil.setOpacity(this.container, opacity);\n }\n });\n\n L.svgIcon = function (options) {\n return new L.SVGIcon(options);\n };\n\n return L.SVGIcon;\n});\n","define('display/imagePath',[], function () {\n \"use strict\";\n\n function getBasePath() {\n var scripts = document.getElementsByTagName(\"script\"),\n pattern = /(.*)tomtom.min.js/,\n i;\n for (i = scripts.length - 1; i > 0; i -= 1) {\n if (scripts[i].src) {\n var path = pattern.exec(scripts[i].src);\n if (path) {\n return path[1];\n }\n }\n }\n return \"\";\n }\n\n return {\n get: function () {\n return getBasePath() + \"images\";\n }\n };\n});\n","define('security/apiKeySecurity',[], function () {\n \"use strict\";\n /**\n * Name of the default key to be used.\n * @type {string}\n */\n var generalKey = \"*\",\n keys = {};\n\n function checkStringType(parameter, message) {\n if (typeof parameter !== \"string\") {\n throw new TypeError(message);\n }\n }\n\n return {\n /**\n * Sets key from the 'config' object in security configuration file.\n * @example\n * security.setKey('keyValue'); // sets global key\n * security.setKey('service/traffic', 'keyValue'); // sets key for traffic service\n *\n * @method setKey\n * @param {String} name Name of the key to be set\n * @param {String} value Value of the key\n */\n setKey: function (name, value) {\n if (arguments.length === 1) {\n value = name;\n name = generalKey;\n }\n if (!value) {\n return;\n }\n checkStringType(name, \"Module name needs to be of type string\");\n checkStringType(value, \"API key needs to be of type string\");\n keys[name] = value;\n },\n\n /**\n * Returns function to sets key from the 'config' object in security configuration file with predefined module\n * name.\n * @example\n * var setKey = security.setKeyForName('service/traffic');\n * setKey('keyValue'); // sets key for traffic service\n *\n * @method setKeyForName\n * @param {String} name Name of the module\n * @return {Function} function that sets key for given module\n */\n setKeyForName: function (name) {\n checkStringType(name, \"Module name needs to be of type string\");\n return function (value) {\n checkStringType(value, \"API key needs to be of type string\");\n keys[name] = value;\n };\n },\n\n /**\n * Gets key's value from the \"config\" object in security configuration file.\n * Returns key value associated with type of given service - if exists - or generalKey otherwise.\n * @example\n * security.getKey(this); // when used within service context\n * security.getKey(\"generalKey\"); // when used in other context\n *\n * @method getKey\n * @param {String} name Module name means name of the key\n */\n getKey: function (name) {\n if (name) {\n checkStringType(name, \"Module name needs to be of type string\");\n }\n return keys[name] || keys[generalKey] || null;\n }\n };\n});\n","/**\n * This is an extension to Leaflet allowing to display TomTom base map layers. It is based on the raster L.TileLayer\n * implementation. The options that can be passed on creation of this object are described for the .tomTomLayer()\n * function.\n *\n * @example\n * var tomtomLayer = L.tomTomLayer({key: \"\"});\n *\n * @class TomTomLayer\n * @extends L.TileLayer\n */\n/**\n * Instantiates a new instance of the TomTom base map layer.\n *\n * @method tomTomLayer\n * @param {Object} [options] All the options that Leaflet allows, as described here:\n * http://leafletjs.com/reference.html#tilelayer-options Additional options, which are TomTom specific, are\n * described below.\n * @param {String} [options.key] This is an API key that can be obtained form http://developer.tomtom.com When the\n * key is passed on the map's initialization, it is set globally for all the services. It can be overwritten with\n * the tomtom.key method globally or per service with tomtom.<service_name>.key functions. It is also\n * possible to pass a specific key while working with instances of the services.\n * @param {String} [options.style] The base map style to be used. Should be set to one of the following values:\n * <'main', 'night'>. By default, the _main_ style is used.\n * @param {String} [options.layer] The base map's layer to be used. Should be set to one of the following values:\n * <'basic', 'hybrid', 'labels'>. By default, the _basic_ layer is used.\n */\ndefine('display/layers/tileLayer',[\"leaflet\", \"security\", \"http\"], function (L, security, http) {\n \"use strict\";\n\n var mapStyles = [\"main\", \"night\"],\n mapLayers = [\"basic\", \"hybrid\", \"labels\"];\n\n function getValueOrDefault(defaultValue, arrayToSearchIn, valueToSearchFor) {\n if (typeof valueToSearchFor === \"string\") {\n var index = arrayToSearchIn.indexOf(valueToSearchFor.toLowerCase());\n return index > -1 ? arrayToSearchIn[index] : defaultValue;\n }\n return defaultValue;\n }\n\n function use512Tiles(detectRetina, style, layer) {\n return detectRetina && L.Browser.retina && style === \"main\" && [\"basic\", \"labels\"].indexOf(layer) > -1;\n }\n\n function tiles512Options(options) {\n options.tileSize = use512Tiles(options.detectRetina, options.style, options.layer) ? 512 : 256;\n if (options.tileSize === 512) {\n options.zoomOffset -= 1;\n options.minZoom = options.minZoom > 0 ? options.minZoom - 1 : 0;\n }\n }\n\n function loadAnimation() {\n var opacity = \"opacity\",\n back = this._bgBuffer;\n back.style[L.DomUtil.TRANSITION] = opacity + \" 10\";\n back.style[opacity] = 0.1;\n this._tileContainer.style[opacity] = this.options.opacity;\n }\n\n function handleSubdomains(options) {\n if (typeof options.subdomains === \"string\") {\n options.subdomains = options.subdomains.split(\"\");\n }\n }\n\n L.TomTomLayer = L.TileLayer.extend({\n options: {\n attribution: \"\",\n minZoom: 2,\n maxZoom: 18,\n subdomains: \"abcd\",\n reuseTiles: true,\n detectRetina: false\n },\n initialize: function (options) {\n options = L.setOptions(this, options);\n if (options.bounds) {\n options.bounds = L.latLngBounds(options.bounds);\n }\n security.setKey(options.key);\n var key = security.getKey(\"services/display\");\n options.accessToken = key;\n /* TODO: if 512 tiles are working uncomment the following line\n this._url = http.protocol() + \"://{s}.api.tomtom.com/map/1/tile/{layer}/{style}/{z}/{x}/{y}.png?tileSize={tileSize}\" +(key ? \"&key={accessToken}\" : \"\");\n */\n this._url = http.protocol() + \"://{s}.api.tomtom.com/map/1/tile/{layer}/{style}/{z}/{x}/{y}.png\" + (key ? \"?key={accessToken}\" : \"\");\n options.style = getValueOrDefault(\"main\", mapStyles, options.style);\n options.layer = getValueOrDefault(\"basic\", mapLayers, options.layer);\n handleSubdomains(options);\n tiles512Options(options);\n },\n onAdd: function (map) {\n L.TileLayer.prototype.onAdd.call(this, map);\n if (this._animated) {\n this.on(\"load\", loadAnimation);\n }\n this._updateOpacity();\n }\n });\n\n L.tomTomLayer = function (options) {\n return new L.TomTomLayer(options);\n };\n\n return L.tomTomLayer;\n});\n","define('rest/utils',[], function () {\n \"use strict\";\n\n return {\n or: function (value, defaultValue) {\n return value || defaultValue;\n },\n\n required: function (value, error) {\n if (value === undefined) {\n throw new TypeError(error);\n }\n return value;\n },\n\n extractQueryParams: function (options, queryParams, queryParamNames) {\n for (var option in options) {\n if (options.hasOwnProperty(option) && queryParamNames.indexOf(option) > -1) {\n queryParams[option] = options[option];\n }\n }\n }\n };\n});\n\n","define('rest/trafficViewport',[\"http\", \"security\", \"./utils\"],\n function (http, security, utils) {\n \"use strict\";\n return {\n trafficViewport: function (options, callback) {\n var pathParams = {};\n var queryParams = {};\n queryParams.key = utils.or(options.key, security.getKey(\"services/traffic\"));\n var baseUrl = utils.or(options.baseUrl, \"{protocol}://api.tomtom.com/\");\n var serviceUrl = utils.or(options.serviceUrl, \"traffic/services/4/incidentViewport/0,0,.1,.1/0/0,0,.1,.1/0/false/{contentType}\");\n http.get({\n url: baseUrl + serviceUrl,\n pathParameters: pathParams,\n queryParameters: queryParams,\n callback: callback,\n fail: options.fail\n });\n }\n };\n }\n);\n\n","define('model/selector',[], function () {\n \"use strict\";\n function isArray(a) {\n return a !== undefined && a.constructor.toString().indexOf(\"Array\") > -1;\n }\n\n function filterArray(result, fields) {\n for (var i = 0; i < result.length; i += 1) {\n filter(result[i], fields);\n }\n }\n\n function filterObject(result, fields) {\n var filterPrepared = \"*\" + fields.trim().split(/\\s*,\\s*/).join(\"*\") + \"*\";\n for (var key in result) {\n if (result.hasOwnProperty(key) && filterPrepared.indexOf(\"*\" + key + \"*\") < 0) {\n delete result[key];\n }\n }\n }\n\n function filter(result, fields) {\n if (!fields) {\n return result;\n }\n if (isArray(result)) {\n filterArray(result, fields);\n } else {\n filterObject(result, fields);\n }\n return result;\n }\n\n function handleArray(array, key) {\n var result = [];\n for (var j = 0; j < array.length; j += 1) {\n if (array[j][key]) {\n result.push(array[j][key]);\n }\n }\n return result;\n }\n\n return function (json, path, fields) {\n var result = json;\n var pathElements = path.trim().split(\".\");\n for (var i = 0; i < pathElements.length; i += 1) {\n if (!result) {\n return null;\n }\n if (isArray(result)) {\n result = handleArray(result, pathElements[i]);\n } else {\n result = result[pathElements[i]];\n }\n }\n return filter(result, fields);\n };\n});\n\n","define('model/traffic/trafficModelId',[\"../selector\"], function (selector) {\n \"use strict\";\n return function (json) {\n return selector(json, \"viewpResp.trafficState.@trafficModelId\") || -1;\n };\n});\n\n","define('services/utils',[], function () {\n \"use strict\";\n\n function isArray(object) {\n return object && object.constructor.toString().indexOf(\"Array\") > -1;\n }\n\n function cloneProperties(object, clonedObject) {\n for (var property in object) {\n if (object.hasOwnProperty(property)) {\n if (isArray(object[property])) {\n clonedObject[property] = object[property].slice(0);\n } else if (typeof object[property] === \"object\") {\n clonedObject[property] = {};\n cloneProperties(object[property], clonedObject[property]);\n } else {\n clonedObject[property] = object[property];\n }\n }\n }\n }\n\n function getValueOrEmptyObject(value) {\n return value === undefined ? {} : value;\n }\n\n function addNewField(result, field, newFields) {\n result[field] = getValueOrEmptyObject(result[field]);\n for (var property in newFields[field]) {\n if (newFields[field].hasOwnProperty(property)) {\n result[field][property] = newFields[field][property];\n }\n }\n }\n\n return {\n addFields: function (newFields, defaultFields) {\n var result = defaultFields || this.defaultFields || {};\n for (var field in newFields) {\n if (newFields.hasOwnProperty(field)) {\n addNewField(result, field, newFields);\n }\n }\n return result;\n },\n\n clone: function (object) {\n var clonedObject = {};\n cloneProperties(object, clonedObject);\n return clonedObject;\n }\n };\n});\n","define('services/chain',[\"./utils\"], function (utils) {\n \"use strict\";\n function checkIsFunction(fun) {\n if (typeof fun !== \"function\") {\n throw new TypeError(\"a function is expected, but \" + fun + \" [\" + (typeof fun) + \"] given\");\n }\n return fun;\n }\n\n function isUndefined(value) {\n return value === undefined;\n }\n\n function isFunction(converter) {\n return typeof converter === \"function\";\n }\n\n function chain(data, name, value, validator, converter) {\n if (isUndefined(value)) {\n return isUndefined(data[name]) ? null : data[name];\n }\n if (isFunction(converter)) {\n value = converter.call(this, value);\n }\n if (isFunction(validator)) {\n value = validator.call(this, value);\n }\n data[name] = value;\n return this;\n }\n\n function checkRequired(fields, data) {\n for (var field in fields) {\n if (fields.hasOwnProperty(field)) {\n var fieldName = fields[field].name || field;\n if (fields[field].required === true && !data.hasOwnProperty(fieldName)) {\n throw new Error(\"Missing required \" + field);\n }\n }\n }\n }\n\n function createFunction(f, fields, data) {\n return function (value) {\n var fieldName = fields[f].name || f;\n return chain.call(this, data, fieldName, value, fields[f].validator, fields[f].converter);\n };\n }\n\n return function (fields, goFunction, options) {\n var data = {},\n that = this;\n\n fields.callback = {\n validator: checkIsFunction\n };\n fields.fail = {\n validator: checkIsFunction,\n defaultValue: function (e) {\n console.error(e || \"Unknown Error\");\n throw new Error(e || \"Unknown Error\");\n }\n };\n\n var service = {\n go: function (success, fail) {\n if (success) {\n data.callback = checkIsFunction(success);\n }\n if (fail) {\n data.fail = checkIsFunction(fail);\n }\n checkRequired(fields, data);\n if (data.callback) {\n var callback = data.callback;\n delete data.callback;\n goFunction.call(that, utils.clone(data), callback);\n } else {\n return new Promise(function (resolve, reject) {\n data.fail = function (error) {\n reject(error);\n };\n goFunction.call(that, utils.clone(data), function (response) {\n resolve(response);\n });\n });\n }\n }\n };\n\n for (var field in fields) {\n if (fields.hasOwnProperty(field)) {\n service[field] = createFunction(field, fields, data);\n if (!isUndefined(fields[field].defaultValue)) {\n service[field].call(this, fields[field].defaultValue);\n }\n // if options were passed initialize the data\n if (options && options.hasOwnProperty(field)) {\n service[field].call(this, options[field]);\n }\n\n if (fields[field].visible === false) {\n delete service[field];\n }\n }\n }\n if (options && options.fail) {\n data.fail = options.fail;\n }\n return service;\n };\n});\n","define('services/validators',[], function () {\n \"use strict\";\n\n var roadUseValues = [\"LimitedAccess\", \"Arterial\", \"Terminal\", \"Ramp\", \"Rotary\", \"LocalStreet\"],\n routingGuidanceLanguageValues = [\"ar\", \"af-ZA\", \"bg-BG\", \"zh-TW\", \"cs-CZ\", \"da-DK\", \"nl-NL\", \"en-GB\", \"en-US\", \"fi-FI\", \"fr-FR\", \"de-DE\", \"el-GR\", \"hu-HU\", \"id-ID\", \"it-IT\", \"ko-KR\", \"lt-LT\", \"ms-MY\", \"nb-NO\", \"pl-PL\", \"pt-BR\", \"pt-PT\", \"ru-RU\", \"sk-SK\", \"sl-SI\", \"es-ES\", \"es-MX\", \"sv-SE\", \"th-TH\", \"tr-TR\"],\n trafficIncidentsLanguageValues = [\"ca\", \"cs\", \"da\", \"de\", \"en\", \"es\", \"fi\", \"fr\", \"hu\", \"it\", \"nl\", \"no\", \"pl\", \"pt\", \"sk\", \"sv\", \"tr\"];\n\n function isDateRfc3339(dateString) {\n return dateString.toString().match(/(\\d\\d\\d\\d)(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+\\-])(\\d\\d)(:)?(\\d\\d))/);\n }\n\n function validateAgainstSetOfValues(value, arrayOfValues, messageIfNotFound) {\n if (arrayOfValues.indexOf(value) === -1) {\n throw new TypeError(messageIfNotFound);\n }\n return value;\n }\n\n function hasBoundingBoxFields(bbox) {\n return bbox.hasOwnProperty(\"minLon\") && bbox.hasOwnProperty(\"maxLon\") && bbox.hasOwnProperty(\"minLat\") && bbox.hasOwnProperty(\"maxLat\");\n }\n\n function checkBBoxNormalized(bbox) {\n return bbox.maxLat <= bbox.minLat || bbox.maxLon <= bbox.minLon;\n }\n\n function checkInteger(value) {\n return !isFinite(value) || value % 1 !== 0;\n }\n\n function checkIntegerInInterval(value, min, max) {\n return checkInteger(value) || value <= min || value > max;\n }\n\n function checkFloatInInterval(numValue, min, max) {\n return !isFinite(numValue) || numValue < min || numValue > max;\n }\n\n function checkArray(array) {\n return array.constructor.toString().indexOf(\"Array\") < 0;\n }\n\n return {\n\n /**\n * Casts to boolean\n * @param {*} value\n * @returns {Boolean} casted value\n */\n bool: function (value) {\n return value === \"false\" ? false : !!value;\n },\n\n /**\n * Check whether the given parameter is a float number\n * @param {*} value The value\n * @returns {Number} value\n * @throws {TypeError} for invalid parameter\n */\n number: function (value) {\n var numValue = parseFloat(value);\n if (!isFinite(numValue)) {\n throw new TypeError(\"a number is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n },\n\n /**\n * Check whether the given parameter is a integer greater than or equal 0\n * @param {*} value The value\n * @returns {Number} value\n * @throws {TypeError} for invalid parameter\n */\n naturalInteger: function (value) {\n var numValue = parseFloat(value);\n if (checkInteger(numValue) || numValue < 0) {\n throw new TypeError(\"a natural integer (greater than or equal 0) is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n },\n\n /**\n * Check whether the given parameter is a integer greater than 0\n * @param {*} value The value\n * @returns {Number} value\n * @throws {TypeError} for invalid parameter\n */\n positiveInteger: function (value) {\n var numValue = parseFloat(value);\n if (checkInteger(numValue) || numValue <= 0) {\n throw new TypeError(\"a positive integer (greater than 0) is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n },\n\n integer: function (value) {\n var numValue = parseFloat(value);\n if (checkInteger(numValue)) {\n throw new TypeError(\"an integer is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n },\n\n /**\n * Check whether the given parameter is a longitude and casts to proper interval <-180, 180>\n * @param {*} value\n * @returns {Number} value\n * @throws {TypeError} for invalid parameter\n */\n longitude: function (value) {\n var numValue = parseFloat(value);\n if (checkFloatInInterval(numValue, -180, 180)) {\n throw new TypeError(\"an longitude <-180,180> is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n },\n\n /**\n * Check whether the given parameter is a latitude and casts to proper interval <-90, 90>\n * @param {*} value\n * @returns {Number} value\n * @throws {TypeError} for invalid parameter\n */\n latitude: function (value) {\n var numValue = parseFloat(value);\n if (checkFloatInInterval(numValue, -90, 90)) {\n throw new TypeError(\"an latitude <-90,90> is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n },\n\n /**\n * Check whether the given parameter is a valid bounding box. Allows to contain whole world and a half on each\n * side.\n * @param {*} bbox The bounding box\n * @returns {Object} bbox\n * @throws {TypeError} for invalid parameter\n */\n boundingBox: function (bbox) {\n if (!hasBoundingBoxFields(bbox)) {\n throw new TypeError(\"a bounding box is expected, but \" + bbox + \" [\" + (typeof bbox) + \"] given\");\n }\n if (checkFloatInInterval(bbox.minLat, -90, 90)) {\n throw new TypeError(\"a bounding box minimal latitude is expected \" + bbox.minLat + \" [\" + (typeof bbox.minLat) + \"] given\");\n }\n if (checkFloatInInterval(bbox.maxLat, -90, 90)) {\n throw new TypeError(\"a bounding box maximal latitude is expected \" + bbox.maxLat + \" [\" + (typeof bbox.maxLat) + \"] given\");\n }\n if (checkFloatInInterval(bbox.minLon, -270, 180)) {\n throw new TypeError(\"a bounding box minimal longitude is expected \" + bbox.minLon + \" [\" + (typeof bbox.minLon) + \"] given\");\n }\n if (checkFloatInInterval(bbox.maxLon, -180, 270)) {\n throw new TypeError(\"a bounding box maximal longitude is expected \" + bbox.maxLon + \" [\" + (typeof bbox.maxLon) + \"] given\");\n }\n if (checkBBoxNormalized(bbox)) {\n throw new TypeError(\"a bounding box expected but max <= min\");\n }\n return bbox;\n },\n\n /**\n * Check whether the given parameter is a float number in proper interval \n * @example\n * var numberBetweenMinusFiveAndFive = validators.numberInInterval(-5,5);\n * numberBetweenMinusFiveAndFive(-10); // false\n * numberBetweenMinusFiveAndFive(3); //true\n *\n * @param {Number} [min] The minimal value\n * @param {Number} [max] The maximal value\n * @returns {Function} validator function that checks type and value range\n * @throws {TypeError} when missing min or max value\n */\n numberInInterval: function (min, max) {\n if (arguments.length !== 2) {\n throw new TypeError(\"Number in interval validator requires min and max value parameters\");\n }\n return function (value) {\n var numValue = parseFloat(value);\n if (checkFloatInInterval(numValue, min, max)) {\n throw new TypeError(\"a number in interval <\" + min + \", \" + max + \"> is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n };\n },\n\n /**\n * Check whether the given parameter is an integer number in proper interval \n * @example\n * var numberBetweenMinusFiveAndFive = validators.numberInInterval(-5,5);\n * numberBetweenMinusFiveAndFive(-10); // false\n * numberBetweenMinusFiveAndFive(3); //true\n *\n * @param {Number} [min] The minimal value\n * @param {Number} [max] The maximal value\n * @returns {Function} validator function that checks type and value range\n * @throws {TypeError} when missing min or max value\n */\n integerInInterval: function (min, max) {\n if (arguments.length !== 2) {\n throw new TypeError(\"Number in interval validator requires min and max value parameters\");\n }\n return function (value) {\n var numValue = parseFloat(value);\n if (checkIntegerInInterval(numValue, min, max)) {\n throw new TypeError(\"an integer in interval <\" + (min + 1) + \", \" + max + \"> is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n };\n },\n\n /**\n * Check whether the given parameter is a string\n * @param {String} string\n * @returns {String} value\n * @throws {TypeError} for non strings\n */\n string: function (string) {\n if (typeof string !== \"string\") {\n throw new TypeError(\"a string is expected, but \" + string + \" [\" + (typeof string) + \"] given\");\n }\n return string;\n },\n\n /**\n * Check whether the given parameter is a zoom level (0, 18>\n * @param {Number} zoomLevel\n * @returns {Number} value\n * @throws {TypeError} for non invalid parameter\n */\n zoomLevel: function (zoomLevel) {\n var numZoomLevel = parseFloat(zoomLevel);\n if (checkIntegerInInterval(numZoomLevel, 0, 18)) {\n throw new TypeError(\"an zoom level (0, 18> is expected, but \" + zoomLevel + \" [\" + (typeof zoomLevel) + \"] given\");\n }\n return numZoomLevel;\n },\n\n /**\n * Check whether the given parameter is a function\n * @param {Function} fun\n * @returns {Function} fun\n * @throws {TypeError} for non function\n */\n functionType: function (fun) {\n if (typeof fun !== \"function\") {\n throw new TypeError(\"a function is expected, but \" + fun + \" [\" + (typeof fun) + \"] given\");\n }\n return fun;\n },\n\n /**\n * Checks whether the given country name uses ISO 3166 alpha-3 or alpha-2 format.\n * @param {String} name\n * @returns {String} name\n * @throws {TypeError} if the country name is not valid\n */\n countryCode: function (name) {\n if (!(typeof name === \"string\" && (name.length === 3 || name.length === 2))) {\n throw new TypeError(\"a 2 or 3-characters long country name is expected, but \" + name + \" [\" + (typeof name) + \"] given\");\n }\n return name;\n },\n\n /**\n * Checks whether the given country name's list use ISO 3166 alpha-3 or alpha-2 format.\n * @param {String|Array} value\n * @returns {String} list\n * @throws {TypeError} if one of the country names is not valid\n */\n countrySet: function (value) {\n if (typeof value !== \"string\" && checkArray(value)) {\n throw new TypeError(\"An array of string country names or string (divided with commas) of country names (two or three-characters long) is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n var stringValue = (typeof value === \"string\") ? value : value.join();\n if (!stringValue.match(/^([a-zA-z]{2,3},)*[a-zA-z]{2,3}$/)) {\n throw new TypeError(\"An array of string country names or string (divided with commas) of country names (two or three-characters long) is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return stringValue;\n },\n\n /**\n * Checks whether the given point is in proper format\n * @param {String} value\n * @returns {String} value\n * @throws {TypeError} if the given value is in not valid format\n */\n point: function (value) {\n if (typeof value !== \"string\" || !value.match(/^(-?\\d*(?:\\.\\d*)?)(?:\\s+|\\s*,\\s*)(-?\\d*(?:\\.\\d*)?)$/)) {\n throw new TypeError(\"A point is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return value;\n },\n\n /**\n * Check whether the given parameter is a positive integer (greater than 0) and lower than 3\n * @param {Number} value The value\n * @returns {Number} value\n * @throws {TypeError} for invalid parameter\n */\n fuzzinessLevel: function (value) {\n var numValue = parseFloat(value);\n if (checkIntegerInInterval(numValue, 0, 3)) {\n throw new TypeError(\"Fuzziness level value (a positive integer lower than 3) is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n },\n\n /**\n * Check whether the given parameter is a positive integer (greater than 0) and lower than 100\n * @param {Number} value The value\n * @returns {Number} value\n * @throws {TypeError} for invalid parameter\n */\n limit: function (value) {\n var numValue = parseFloat(value);\n if (checkIntegerInInterval(numValue, 0, 100)) {\n throw new TypeError(\"Limit value (a positive integer lower than 100) is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n },\n\n /**\n * Check whether the given parameter is an offset - positive integer <0, 1900>\n * @param {Number} value The value\n * @returns {Number} value\n * @throws {TypeError} for invalid parameter\n */\n offset: function (value) {\n var numValue = parseFloat(value);\n if (checkIntegerInInterval(numValue, -1, 1900)) {\n throw new TypeError(\"Offset an integer value <0, 1900> is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return numValue;\n },\n\n /**\n * Check whether the given parameter is a plain object (array and functions aren't accepted)\n * @param {Object} object\n * @returns {Object} object\n * @throws {TypeError} for non object\n */\n plainObject: function (object) {\n if (typeof object !== \"object\" || object.constructor !== Object) {\n throw new TypeError(\"an object is expected, but \" + object + \" [\" + (typeof object) + \"] given\");\n }\n return object;\n },\n\n /**\n * Check whether the given parameter is an array (objects and functions aren't accepted)\n * @param {Array} array\n * @returns {Array} array\n * @throws {TypeError} for non array\n */\n arrayType: function (array) {\n if (checkArray(array)) {\n throw new TypeError(\"an array is expected, but \" + array + \" [\" + (typeof array) + \"] given\");\n }\n return array;\n },\n\n roadUse: function (value) {\n if (typeof value !== \"string\" || !value.match(/^\\[(\"\\w*\",?)+\\]$/)) {\n throw new TypeError(\"Road use is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n var elements = value.replace(/[\"\\[\\]]/g, \"\").split(\",\");\n for (var i = 0; i < elements.length; i += 1) {\n if (roadUseValues.indexOf(elements[i]) < 0) {\n throw new TypeError(\"Road use (\" + roadUseValues + \") is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n }\n return value;\n },\n\n oneOfValue: function (values, paramName) {\n return function (value) {\n var message = \"Supported \" + paramName + \" is expected (one of: \" + values + \"), but \" + value + \" [\" + (typeof value) + \"] given\";\n return validateAgainstSetOfValues(value, values, message);\n };\n },\n\n arrayOfValues: function (values, paramName) {\n return function (value) {\n var message = \"Supported \" + paramName + \" type is expected (array with one of: \" + values + \"), but \" + value + \" [\" + (typeof value) + \"] given\";\n if (checkArray(value)) {\n throw new TypeError(\"an array is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n for (var i = 0; i < value.length; i += 1) {\n validateAgainstSetOfValues(value[i], values, message);\n }\n return value;\n };\n },\n\n /**\n * Checks whether the given departure time is now or in proper rfc3339 format ( 1996-12-19T16:39:57 or\n * 1996-12-19T16:39:57-08:00 ):\n * @param {String} value\n * @returns {String} value\n * @throws {TypeError} if the given value is not valid\n */\n departAt: function (value) {\n if (value === \"now\" || (isDateRfc3339(value) && Date.now() < Date.parse(value))) {\n return value;\n } else {\n throw new TypeError(\"Supported departAt is now or rfc3339 format and no earlier than now(), but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n },\n\n /**\n * Checks whether the given arrive time is in proper rfc3339 format ( 1996-12-19T16:39:57 or\n * 1996-12-19T16:39:57-08:00 ):\n * @param {String} value\n * @returns {String} value\n * @throws {TypeError} if the given value is not valid\n */\n arriveAt: function (value) {\n if (isDateRfc3339(value) && Date.now() < Date.parse(value)) {\n return value;\n } else {\n throw new TypeError(\"Supported arriveAt is rfc3339 format, but and no earlier than now() \" + value + \" [\" + (typeof value) + \"] given\");\n }\n },\n\n routingGuidanceLanguage: function (value) {\n var message = \"Supported routing guidance language is expected to be one of: \" + routingGuidanceLanguageValues + \"), but \" + value + \" [\" + (typeof value) + \"] given\";\n return validateAgainstSetOfValues(value, routingGuidanceLanguageValues, message);\n },\n\n trafficIncidentsLanguage: function (value) {\n var message = \"Supported traffic incidents language is expected to be one of: \" + trafficIncidentsLanguageValues + \"), but \" + value + \" [\" + (typeof value) + \"] given\";\n return validateAgainstSetOfValues(value, trafficIncidentsLanguageValues, message);\n },\n\n /**\n * Checks whether the given routing locations is in proper format:\n * circle A circle with a center point and a radius (in meters).\n * The radius must be a positive integer with the maximum value of 20050000. Note that larger integer values\n * will not be rejected but lowered to the maximum value. circle(52.37245,4.89406,10000) location A point or\n * a circle.\n * 52.37245,4.89406\n * circle(52.37245,4.89406,10000)\n * @param {String} value\n * @returns {String} value\n * @throws {TypeError} if the given value is not valid\n */\n routingLocations: function (value) {\n if (value.constructor.toString().indexOf(\"Array\") > -1) {\n value = value.join(\":\");\n }\n var point = /(-?\\d*(?:\\.\\d*)?)(?:\\s+|\\s*,\\s*)(-?\\d*(?:\\.\\d*)?)/;\n var circle = /circle\\(-?\\d*(?:\\.\\d*)?\\s*,\\s*-?\\d*(?:\\.\\d*)?\\s*,\\s*(\\d+)\\)/;\n var routingLocation = new RegExp(\"^\" + point.source + \":(?:(?:\" + point.source + \"|\" + circle.source + \"):)*\" + point.source + \"$\");\n if (!value.match(routingLocation)) {\n throw new TypeError(\"Routing location is expected. But \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return value;\n },\n\n /**\n * Checks whether the given input is in proper circle format:\n * circle A circle with a center point and a radius (in meters).\n * The radius must be a positive integer with the maximum value of 20050000. Note that larger integer values\n * will not be rejected but lowered to the maximum value. circle(52.37245,4.89406,10000)\n * @param {String} value\n * @returns {String} value\n * @throws {TypeError} if the given value is not valid\n */\n circle: function (value) {\n if (typeof value !== \"string\") {\n throw new TypeError(\"Expecting circle but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n var match = value.match(/circle\\(-?\\d*(?:\\.\\d*)?\\s*,\\s*-?\\d*(?:\\.\\d*)?\\s*,\\s*(\\d+)\\)/);\n if (!match || parseFloat(match[1]) > 20050000) {\n throw new TypeError(\"Expecting circle but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return value;\n },\n\n /**\n * Checks whether the given input is in proper geometry list format.\n * Geometry list represents list of figures (polygons or circles) objects.\n * Circle contains properties like: type (\"CIRCLE\"), position (lat & lon) and radius.\n * Polygon contains properties like: type (\"POLYGON\") and vertices (as a list of points).\n *\n * @param {Array} value\n * @returns {String} value Stringified array of figures (JSON format).\n * @throws {TypeError} if the given value is not valid\n */\n geometryList: function (value) {\n if (checkArray(value)) {\n throw new TypeError(\"An array of geometry objects is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n if (value.length > 0) {\n for (var i = 0; i < value.length; i += 1) {\n var geoObject = value[i];\n if (!geoObject.hasOwnProperty(\"type\") || (!geoObject.hasOwnProperty(\"vertices\") && (!geoObject.hasOwnProperty(\"position\") || !geoObject.hasOwnProperty(\"radius\")))) {\n throw new TypeError(\"An array of geometry objects is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n }\n } else {\n throw new TypeError(\"An array of geometry objects is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return JSON.stringify(value);\n }\n };\n});\n\n","/**\n * The traffic model id service implementation. Provides current traffic model id which is the traffic model number\n * needed for the Online Traffic Incidents Layer, and Online Traffic Incident Details API calls. It is updated every\n * minute, and is valid for two minutes before it times out.\n *\n * The tomtom.trafficModelId() method creates a new instance of service. Parameter can be passed on creation or\n * provided via convenient function that can be chained. The method go() performs the actual call.\n *\n * The call is asynchronous therefore user have two options to handle response, either by passing callback function or\n * by using [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). The\n * SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class trafficModelId\n */\ndefine('services/trafficModelId',[\"rest/trafficViewport\", \"model/traffic/trafficModelId\", \"./chain\", \"./validators\"],\n function (trafficViewport, model, chain, validators) {\n \"use strict\";\n\n var fields = {\n /**\n * A setter and getter for _'key'_ attribute. Key can be set globally when initializing map, with\n * tomtom.key or tomtom.trafficModelId.key function. But also per service instance on initialization or\n * with this method.\n *\n * The API Key can be issued from http://developer.tomtom.com\n *\n * @method key\n * @chainable\n * @param {String} key API Key valid for requested service.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {trafficModelId|String} Method returns the service instance allowing chaining or key value if\n * argument is omitted.\n */\n key: {validator: validators.string},\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {trafficModelId|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n protocol: {validator: validators.oneOfValue([\"http\", \"https\"], \"protocol\")},\n baseUrl: {validator: validators.string},\n serviceUrl: {validator: validators.string}\n };\n\n /**\n * The function performing actual call to the web service.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * The final response from service is a traffic model number needed for the Online Traffic Incidents Layer, and\n * Online Traffic Incident Details API calls. It is updated every minute, and is valid for two minutes before\n * it times out.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * // this is optional if you passed global key earlier\n * tomtom.trafficModelId.key();\n * var trafficModelId = tomtom.trafficModelId().callback(myFunction).go();\n * ```\n */\n /**\n * A setter and getter for callback function. This function is called after receiving successful response from\n * service. It takes one argument which is the response HTML from service.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {trafficModelId|Function} Method returns the service instance allowing chaining or function if\n * argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {trafficModelId|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n function handleChain(data, callback) {\n trafficViewport.trafficViewport(data, function (response) {\n callback.call(this, model(response));\n });\n }\n\n /**\n * The method to instantiates the service. The options can be passed on creation or later during the execution\n * using function with the name matching parameter name. Each option can be retrieved using the exactly same\n * function but without parameter. The instance of service can be reused by calling multiple times go()\n * function.\n *\n * @method trafficModelId\n * @param {Object} [options] Options to be passed to the trafficModelIdCaption call.\n * @param {String} [options.key] This is optional if key was already passed.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @return {trafficModelId} Method returns new object that allows communication with the service.\n *\n * @example\n * ```javascript\n *\n * tomtom.trafficModelId({key: \"\"}).go().then(function(response) {\n * console.log(response);\n * });\n * ```\n */\n return function (options) {\n return chain(fields, handleChain, options);\n };\n }\n);\n\n","define('rest/trafficIncidents',[\"http\", \"security\", \"./utils\"], function (http, security, utils) {\n \"use strict\";\n\n var queryParamNames = [\"language\", \"expandCluster\", \"geometries\", \"originalPosition\"];\n\n return {\n incidentsDetails: function (options, callback) {\n var pathParams = {};\n var queryParams = {};\n\n // default the trafficModelID to -1\n pathParams.trafficModelID = utils.or(options.trafficModelID, -1);\n\n pathParams.zoom = utils.required(options.zoomLevel, \"Missing zoomLevel required parameter\");\n\n pathParams.minLon = utils.required(options.minLon, \"Missing minLon required parameter\");\n pathParams.minLat = utils.required(options.minLat, \"Missing minLat required parameter\");\n pathParams.maxLon = utils.required(options.maxLon, \"Missing maxLon required parameter\");\n pathParams.maxLat = utils.required(options.maxLat, \"Missing maxLat required parameter\");\n\n pathParams.style = utils.or(options.style, \"night\");\n\n // if an API key is specified, include it\n // an API key can be omitted if an API proxy is being used\n queryParams.key = utils.or(options.key, security.getKey(\"services/traffic\"));\n\n utils.extractQueryParams(options, queryParams, queryParamNames);\n\n var baseUrl = utils.or(options.baseUrl, \"{protocol}://api.tomtom.com/\");\n var serviceUrl = utils.or(options.serviceUrl, \"traffic/services/4/incidentDetails/{style}/{minLat},{minLon},{maxLat},{maxLon}/{zoom}/{trafficModelID}/{contentType}?projection=EPSG4326\");\n\n http.get({\n url: baseUrl + serviceUrl,\n pathParameters: pathParams,\n queryParameters: queryParams,\n callback: callback,\n fail: options.fail\n });\n }\n };\n});\n\n","define('model/arrayMerge',[], function () {\n \"use strict\";\n\n function defaultComparator(first, second) {\n return first === second;\n }\n\n return function (firstArray, secondArray, comparator) {\n if (!comparator) {\n comparator = defaultComparator;\n }\n\n var result = firstArray.concat(secondArray);\n for (var i = 0; i < firstArray.length; i += 1) {\n for (var j = firstArray.length; j < result.length; j += 1) {\n if (comparator(result[i], result[j])) {\n result.splice(j, 1);\n j -= 1;\n }\n }\n }\n return result;\n };\n});\n","define('model/traffic/trafficIncidents',[\"../arrayMerge\"], function (arrayMerge) {\n \"use strict\";\n\n var incidentCategories = {\n 0: \"Unknown\", 1: \"Accident\", 2: \"Fog\", 3: \"Dangerous Conditions\", 4: \"Rain\", 5: \"Ice\", 6: \"Jam\",\n 7: \"Lane Closed\", 8: \"Road Closed\", 9: \"Road Works\", 10: \"Wind\", 11: \"Flooding\", 12: \"Detour\", 13: \"Cluster\"\n };\n\n var incidentSeverities = {0: \"unknown\", 1: \"minor\", 2: \"moderate\", 3: \"major\", 4: \"undefined\"};\n\n function newFeature(properties, type) {\n return {\n type: \"Feature\",\n geometry: {type: type, coordinates: []},\n properties: properties\n };\n }\n\n function newFeatureCollection(properties) {\n var featureCollection = {\n type: \"FeatureCollection\",\n features: []\n };\n if (properties) {\n featureCollection.properties = properties;\n }\n return featureCollection;\n }\n\n function setProperty(property, propertyName, properties) {\n if (property) {\n properties[propertyName] = property;\n }\n }\n\n var getFeature = function (poi) {\n var feature;\n var properties = {};\n properties.id = poi.id;\n if (poi.cbl && poi.ctr) {\n properties.clusterBounds = [[poi.cbl.y, poi.cbl.x], [poi.ctr.y, poi.ctr.x]];\n }\n if (poi.op) {\n properties.originalPosition = [poi.op.y, poi.op.x];\n }\n if (poi.ic) {\n properties.incidentCategory = incidentCategories[poi.ic];\n }\n if (poi.ty) {\n properties.incidentSeverity = incidentSeverities[poi.ty];\n }\n setProperty(poi.cs, \"clusterSize\", properties);\n setProperty(poi.d, \"description\", properties);\n setProperty(poi.c, \"incidentCause\", properties);\n setProperty(poi.f, \"from\", properties);\n setProperty(poi.t, \"to\", properties);\n setProperty(poi.r, \"roadNumber\", properties);\n setProperty(poi.dl, \"delaySeconds\", properties);\n setProperty(poi.l, \"lengthMeters\", properties);\n if (poi.cpoi) {\n properties.clusterCoordinates = [poi.p.x, poi.p.y];\n feature = newFeatureCollection(properties);\n for (var i = 0; i < poi.cpoi.length; i += 1) {\n feature.features.push(getFeature(poi.cpoi[i]));\n }\n } else {\n feature = newFeature(properties, \"Point\");\n feature.geometry.coordinates = [poi.p.x, poi.p.y];\n }\n return feature;\n };\n\n return function (data) {\n var result = newFeatureCollection(),\n json = data[0] || data;\n if (!json || !json.tm || !json.tm.poi) {\n return result;\n }\n if (data.length > 1) {\n // this is edge of the world case\n json.tm.poi = arrayMerge(data[0].tm.poi, data[1].tm.poi, function (first, second) {\n return first.id === second.id;\n });\n }\n for (var i = 0; i < json.tm.poi.length; i += 1) {\n result.features.push(getFeature(json.tm.poi[i]));\n }\n return result;\n };\n})\n;\n\n","define('services/converters',[], function () {\n \"use strict\";\n\n function isFunction(fun) {\n return typeof fun === \"function\";\n }\n\n function isArray(array) {\n if (!array) {\n return false;\n }\n return array.constructor.toString().indexOf(\"Array\") > -1;\n }\n\n function isLatLon(latlon) {\n return (latlon.hasOwnProperty(\"lat\") && (latlon.hasOwnProperty(\"lon\") || latlon.hasOwnProperty(\"lng\")));\n }\n\n function or(first, second) {\n if (first === undefined) {\n return second;\n }\n return first;\n }\n\n function normalizeLatitude(latitude) {\n var numLatitude = parseFloat(latitude);\n if (!isFinite(numLatitude)) {\n throw new TypeError(\"an number is expected, but \" + latitude + \" [\" + (typeof latitude) + \"] given\");\n }\n if (numLatitude < -90 || numLatitude > 90) {\n var sign = numLatitude < 0 ? -1 : 1;\n var i = Math.ceil(Math.abs(numLatitude) / 180);\n return numLatitude - sign * 180 * i;\n }\n return numLatitude;\n }\n\n function normalizeLongitude(longitude) {\n var numLongitude = parseFloat(longitude);\n if (!isFinite(numLongitude)) {\n throw new TypeError(\"an number is expected, but \" + longitude + \" [\" + (typeof longitude) + \"] given\");\n }\n if (numLongitude < -180 || numLongitude > 180) {\n var sign = numLongitude < 0 ? -1 : 1;\n var i = Math.ceil(Math.abs(numLongitude) / 360);\n return numLongitude - sign * 360 * i;\n }\n return numLongitude;\n }\n\n function isXY(xy) {\n return xy.hasOwnProperty(\"x\") && xy.hasOwnProperty(\"y\");\n }\n\n function isLatitudeLongitude(value) {\n return value.hasOwnProperty(\"latitude\") && value.hasOwnProperty(\"longitude\");\n }\n\n function isLatLonFunction(value) {\n return isFunction(value.lat) && isFunction(value.lng);\n }\n\n function castPoint(value) {\n if (isArray(value) && value.length === 2) {\n return value;\n }\n if (typeof value === \"string\") {\n var match = value.match(/^(-?\\d*(?:\\.\\d*)?)(?:\\s+|\\s*,\\s*)(-?\\d*(?:\\.\\d*)?)$/);\n if (!match || !match[1] || !match[2]) {\n throw new TypeError(\"A point is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n return [match[1], match[2]];\n }\n if (isLatLonFunction(value)) {\n return [value.lat(), value.lng()];\n }\n if (isLatLon(value)) {\n return [value.lat, or(value.lon, value.lng)];\n }\n if (isXY(value)) {\n return [value.y, value.x];\n }\n if (isLatitudeLongitude(value)) {\n return [value.latitude, value.longitude];\n }\n throw new TypeError(\"A point is expected, but \" + value + \" [\" + (typeof value) + \"] given\");\n }\n\n function isLatLonBBox(bbox) {\n return bbox.hasOwnProperty(\"minLon\") && bbox.hasOwnProperty(\"minLat\") && bbox.hasOwnProperty(\"maxLon\") && bbox.hasOwnProperty(\"maxLat\");\n }\n\n function isRightLeftTopBottomBBox(bbox) {\n return bbox.hasOwnProperty(\"left\") && bbox.hasOwnProperty(\"bottom\") && bbox.hasOwnProperty(\"right\") && bbox.hasOwnProperty(\"top\");\n }\n\n function isWestEastNorthSouthBBox(bbox) {\n return isFunction(bbox.getWest) && isFunction(bbox.getEast) && isFunction(bbox.getSouth) && isFunction(bbox.getNorth);\n }\n\n function castBoundingBox(bbox) {\n var sw, ne;\n if (isLatLonBBox(bbox)) {\n return bbox;\n }\n if (isRightLeftTopBottomBBox(bbox)) {\n return {minLon: bbox.left, minLat: bbox.bottom, maxLon: bbox.right, maxLat: bbox.top};\n }\n if (isWestEastNorthSouthBBox(bbox)) {\n return {minLon: bbox.getWest(), minLat: bbox.getSouth(), maxLon: bbox.getEast(), maxLat: bbox.getNorth()};\n }\n if (isFunction(bbox.getNorthEast) && isFunction(bbox.getSouthWest)) {\n ne = castPoint(bbox.getNorthEast());\n sw = castPoint(bbox.getSouthWest());\n return {minLon: sw[1], minLat: sw[0], maxLon: ne[1], maxLat: ne[0]};\n }\n if (isArray(bbox) && bbox.length === 4) {\n return {minLon: bbox[0], minLat: bbox[1], maxLon: bbox[2], maxLat: bbox[3]};\n }\n if (isArray(bbox) && bbox.length === 2) {\n sw = castPoint(bbox[0]);\n ne = castPoint(bbox[1]);\n return {minLon: sw[1], minLat: sw[0], maxLon: ne[1], maxLat: ne[0]};\n }\n if (typeof bbox === \"string\") {\n bbox = bbox.trim().split(/\\s*,\\s*/);\n if (bbox.length === 4) {\n return {\n minLon: parseFloat(bbox[0]),\n minLat: parseFloat(bbox[1]),\n maxLon: parseFloat(bbox[2]),\n maxLat: parseFloat(bbox[3])\n };\n }\n }\n throw new TypeError(\"Unable to cast \" + bbox + \" [\" + typeof bbox + \"] to bounding box\");\n }\n\n function normalizeBoundingBox(bbox) {\n var w = bbox.minLon, e = bbox.maxLon, s = bbox.minLat, n = bbox.maxLat;\n if (e - w > 360) {\n e = 180;\n w = -180;\n } else {\n if (e > 270) {\n var right = Math.ceil(w / 360);\n e -= 360 * right;\n w -= 360 * right;\n }\n if (w < -270) {\n var left = Math.ceil(-e / 360);\n e += 360 * left;\n w += 360 * left;\n }\n }\n s = s < -90 ? -90 : s;\n n = n > 90 ? 90 : n;\n return {minLon: w, minLat: s, maxLon: e, maxLat: n};\n }\n\n var trafficIncidentsLanguageMapping = {\n \"ca\": [\"ca\", \"cat\", \"ca-fr\", \"ca_fr\", \"ca-es\", \"ca_es\", \"catalan\"],\n \"cs\": [\"cs\", \"cze\", \"cs-cz\", \"cs_cz\", \"czech\"],\n \"da\": [\"da\", \"dan\", \"da-dk\", \"da_dk\", \"danish\"],\n \"de\": [\"de\", \"ger\", \"de-de\", \"de_de\", \"german\"],\n \"en\": [\"en\", \"eng\", \"en-gb\", \"en_gb\", \"english\", \"us\", \"ame\", \"en-us\", \"en_us\", \"english US\", \"default\"],\n \"es\": [\"es\", \"spa\", \"es-es\", \"es_es\", \"spanish\", \"mx\", \"spm\", \"es-mx\", \"es_mx\", \"spanish MX\"],\n \"fi\": [\"fi\", \"fin\", \"fi-fi\", \"fi_fi\", \"finnish\"],\n \"fr\": [\"fr\", \"fre\", \"fr-fr\", \"fr_fr\", \"french\"],\n \"hu\": [\"hu\", \"hun\", \"hu-hu\", \"hu_hu\", \"hungarian\"],\n \"it\": [\"it\", \"ita\", \"it-it\", \"it_it\", \"italian\"],\n \"nl\": [\"nl\", \"dut\", \"nl-nl\", \"nl_nl\", \"dutch\"],\n \"no\": [\"no\", \"nor\", \"no-no\", \"no_no\", \"norwegian\"],\n \"pl\": [\"pl\", \"pol\", \"pl-pl\", \"pl_pl\", \"polish\"],\n \"pt\": [\"br\", \"por\", \"pt-br\", \"pt_br\", \"portuguese\", \"pt\", \"pob\", \"pt-pt\", \"pt_pt\", \"portuguese BR\"],\n \"sk\": [\"sk\", \"slo\", \"sk-sk\", \"sk_sk\", \"slovak\"],\n \"sv\": [\"sv\", \"swe\", \"sv-se\", \"sv_se\", \"swedish\"],\n \"tr\": [\"tr\", \"tur\", \"tr-tr\", \"tr_tr\", \"turkish\"],\n defaultValue: \"en\"\n }, routingGuidanceLanguageMapping = {\n \"ar\": [\"ar\", \"ara\", \"ar-ar\", \"ar_ar\", \"arabic\"],\n \"af-ZA\": [\"af\", \"afr\", \"af-za\", \"af_za\", \"afrikaans\"],\n \"bg-BG\": [\"bg\", \"bul\", \"bg-bg\", \"bg_bg\", \"bulgarian\"],\n \"zh-TW\": [\"zh\", \"chi\", \"zh-tw\", \"zh_tw\", \"chinese\"],\n \"cs-CZ\": [\"cs\", \"cz\", \"cze\", \"cs-cz\", \"cs_cz\", \"czech\"],\n \"da-DK\": [\"da\", \"dan\", \"da-dk\", \"da_dk\", \"danish\"],\n \"nl-NL\": [\"nl\", \"dut\", \"nl-nl\", \"nl_nl\", \"dutch\"],\n \"en-GB\": [\"en\", \"eng\", \"en-gb\", \"en_gb\", \"english\", \"default\"],\n \"en-US\": [\"us\", \"ame\", \"en-us\", \"en_us\", \"english US\"],\n \"fi-FI\": [\"fi\", \"fin\", \"fi-fi\", \"fi_fi\", \"finnish\"],\n \"fr-FR\": [\"fr\", \"fre\", \"fr-fr\", \"fr_fr\", \"french\"],\n \"de-DE\": [\"de\", \"ger\", \"de-de\", \"de_de\", \"german\"],\n \"el-GR\": [\"el\", \"gre\", \"el-gr\", \"el_gr\", \"greek\"],\n \"hu-HU\": [\"hu\", \"hun\", \"hu-hu\", \"hu_hu\", \"hungarian\"],\n \"id-ID\": [\"id\", \"ind\", \"id-id\", \"id_id\", \"indonesian\"],\n \"it-IT\": [\"it\", \"ita\", \"it-it\", \"it_it\", \"italian\"],\n \"ko-KR\": [\"ko\", \"kor\", \"ko-kr\", \"ko_kr\", \"korean\"],\n \"lt-LT\": [\"lt\", \"lit\", \"lt-lt\", \"lt_lt\", \"lithuanian\"],\n \"ms-MY\": [\"ms\", \"mal\", \"ms-my\", \"ms_my\", \"malay\"],\n \"nb-NO\": [\"nb\", \"nor\", \"nb-no\", \"nb_no\", \"norwegian\"],\n \"pl-PL\": [\"pl\", \"pol\", \"pl-pl\", \"pl_pl\", \"polish\"],\n \"pt-BR\": [\"br\", \"por\", \"pt-br\", \"pt_br\", \"portuguese\"],\n \"pt-PT\": [\"pt\", \"pob\", \"pt-pt\", \"pt_pt\", \"portuguese BR\"],\n \"ru-RU\": [\"ru\", \"rus\", \"ru-ru\", \"ru_ru\", \"russian\"],\n \"sk-SK\": [\"sk\", \"slo\", \"sk-sk\", \"sk_sk\", \"slovak\"],\n \"sl-SI\": [\"sl\", \"slv\", \"sl-si\", \"sl_si\", \"slovenian\"],\n \"es-ES\": [\"es\", \"spa\", \"es-es\", \"es_es\", \"spanish\"],\n \"es-MX\": [\"mx\", \"spm\", \"es-mx\", \"es_mx\", \"spanish MX\"],\n \"sv-SE\": [\"sv\", \"swe\", \"sv-se\", \"sv_se\", \"swedish\"],\n \"th-TH\": [\"th\", \"tha\", \"th-th\", \"th_th\", \"thai\"],\n \"tr-TR\": [\"tr\", \"tur\", \"tr-tr\", \"tr_tr\", \"turkish\"],\n defaultValue: \"en-GB\"\n };\n\n function circleFromString(value) {\n var match = value.match(/^circle\\((-?\\d*(?:\\.\\d*)?)\\s*,\\s*(-?\\d*(?:\\.\\d*)?)\\s*,\\s*(\\d+)\\)$/);\n if (!match || !match[1] || !match[2] || !match[3]) {\n throw new TypeError(\"Unable to cast \" + value + \" [\" + typeof value + \"] to circle\");\n }\n var lat = parseFloat(match[1]), lon = parseFloat(match[2]), radius = parseFloat(match[3]);\n if (!isFinite(lat) || !isFinite(lon)) {\n throw new TypeError(\"Unable to cast \" + value + \" [\" + typeof value + \"] to circle\");\n }\n return \"circle(\" + lat + \",\" + lon + \",\" + radius + \")\";\n }\n\n function castAndNormalizePoint(value) {\n var point = castPoint(value);\n return normalizeLatitude(point[0]) + \",\" + normalizeLongitude(point[1]);\n }\n\n function convertPointOrCircle(value) {\n if (typeof value === \"string\" && value.indexOf(\"circle\") > -1) {\n return circleFromString(value);\n }\n if (isArray(value) && value.length === 3) {\n return \"circle(\" + normalizeLatitude(value[0]) + \",\" + normalizeLongitude(value[1]) + \",\" + value[2] + \")\";\n }\n return castAndNormalizePoint(value);\n }\n\n function extractPointsFromPolygon(inputPoints) {\n var points = [],\n point;\n for (point in inputPoints) {\n if (inputPoints.hasOwnProperty(point)) {\n points.push(castAndNormalizePoint(inputPoints[point]));\n }\n }\n return points;\n }\n\n return {\n boundingBox: function (value) {\n return normalizeBoundingBox(castBoundingBox(value));\n },\n\n longitude: function (value) {\n return normalizeLongitude(value);\n },\n\n latitude: function (value) {\n return normalizeLatitude(value);\n },\n\n point: function (value) {\n return castAndNormalizePoint(value);\n },\n\n dateTime: function (value) {\n if (!value || typeof(value) !== \"string\") {\n throw new TypeError(\"Unable to cast \" + value + \" [\" + typeof value + \"] to datetime value.\");\n }\n if (value !== \"now\") {\n value = value.replace(new RegExp(/-/, \"g\"), \"/\");\n value = new Date(value).toISOString();\n }\n return value;\n },\n\n geometryList: function (value) {\n if (!value || !isArray(value)) {\n throw new TypeError(\"Unable to cast \" + value + \" [\" + typeof value + \"] to geometry list (array)\");\n }\n\n for (var figureName in value) {\n if (value.hasOwnProperty(figureName)) {\n var figure = value[figureName];\n if (figure.type === \"POLYGON\") {\n figure.vertices = extractPointsFromPolygon(figure.vertices);\n } else if (figure.type === \"CIRCLE\") {\n figure.position = castAndNormalizePoint(figure.position);\n }\n }\n }\n return value;\n },\n\n routingGuidanceLanguage: function (value) {\n value = value.toLowerCase();\n for (var language in routingGuidanceLanguageMapping) {\n // if language is found in one of properties array\n if (routingGuidanceLanguageMapping.hasOwnProperty(language) && routingGuidanceLanguageMapping[language].indexOf(value) > -1) {\n return language;\n }\n }\n return routingGuidanceLanguageMapping.defaultValue;\n },\n\n trafficIncidentsLanguage: function (value) {\n value = value.toLowerCase();\n for (var language in trafficIncidentsLanguageMapping) {\n // if language is found in one of properties array\n if (trafficIncidentsLanguageMapping.hasOwnProperty(language) && trafficIncidentsLanguageMapping[language].indexOf(value) > -1) {\n return language;\n }\n }\n return trafficIncidentsLanguageMapping.defaultValue;\n },\n\n routingLocations: function (value) {\n if (typeof value === \"string\") {\n return value;\n }\n if (isArray(value)) {\n if (value.length < 2) {\n throw new TypeError(\"Unable to cast \" + value + \" [\" + typeof value + \"] to routing locations string\");\n }\n var response = [];\n\n // Convert first element to point\n response.push(castAndNormalizePoint(value[0]));\n\n // Convert elements from 1 to length-2 to point or circle\n for (var i = 1; i < value.length - 1; i += 1) {\n response.push(convertPointOrCircle(value[i]));\n }\n\n // Convert last element (length-1) to point\n response.push(castAndNormalizePoint(value[value.length - 1]));\n\n // Join converted elements\n return response.join(\":\");\n }\n throw new TypeError(\"Unable to cast \" + value + \" [\" + typeof value + \"] to routing locations string\");\n },\n\n roadUse: function (value) {\n if (typeof value === \"string\") {\n return '[\"' + value.replace(/[\"']|^\\s+|\\s+$/g, \"\").split(/[\\s,]+/).join('\",\"') + '\"]';\n }\n if (isArray(value)) {\n for (var i = 0; i < value.length; i += 1) {\n value[i] = String(value[i]).replace(/[\"']|^\\s+|\\s+$/g, \"\");\n }\n return '[\"' + value.join('\",\"') + '\"]';\n }\n throw new TypeError(\"Unable to cast \" + value + \" [\" + typeof value + \"] to road use string\");\n },\n\n arrayOfStrings: function (value) {\n if (!value) {\n return [];\n }\n if (typeof value === \"string\") {\n value = value.trim().replace(/\\s*[,;]\\s*/g, ',');\n return value.split(/[,;]+/);\n }\n if (isArray(value)) {\n return value;\n }\n throw new TypeError(\"Unable to cast \" + value + \" [\" + typeof value + \"] to array of strings\");\n }\n };\n});\n\n","define('services/worldEdge',[], function () {\n 'use strict';\n function splitOnEdgeOfTheWorld(bBox) {\n if (!bBox) {\n return [];\n }\n if (bBox.minLon < -180) {\n return [\n {minLon: -180, minLat: bBox.minLat, maxLon: bBox.maxLon, maxLat: bBox.maxLat},\n {minLon: 360 + bBox.minLon, minLat: bBox.minLat, maxLon: 180, maxLat: bBox.maxLat}\n ];\n }\n if (bBox.maxLon > 180) {\n return [\n {minLon: bBox.minLon, minLat: bBox.minLat, maxLon: 180, maxLat: bBox.maxLat},\n {minLon: -180, minLat: bBox.minLat, maxLon: bBox.maxLon - 360, maxLat: bBox.maxLat}\n ];\n }\n return [bBox];\n }\n\n function responseCollector(numBoundingBoxes, responses, callback, model) {\n return function (response) {\n responses = responses || [];\n responses.push(response);\n if (responses.length === (numBoundingBoxes || 1)) {\n responses = responses.length === 1 ? responses[0] : responses;\n callback(model(responses));\n }\n };\n }\n\n return function (service, model, data, callback, addBoundingBoxParameters) {\n var boundingBoxes = splitOnEdgeOfTheWorld(data.boundingBox),\n responses = [];\n data.boundingBox = null;\n for (var i = 0; i < (boundingBoxes.length || 1); i += 1) {\n data = boundingBoxes[i] ? addBoundingBoxParameters(data, boundingBoxes[i]) : data;\n service(data, responseCollector(boundingBoxes.length, responses, callback, model));\n }\n };\n});\n\n","/**\n * The traffic incidents service implementation. Provides current traffic incidents in given region, on given zoom\n * level with given style. Current road situation is updated every minute, please use traficModelId service in\n * conjunction with your calls to get traffic incidents aligned with other services.\n *\n * The tomtom.trafficIncidents() method creates a new instance of service. Parameter can be passed on creation or\n * provided via convenient function that can be chained. The method go() performs the actual call.\n *\n * The call is asynchronous therefore user have two options to handle response, either by passing callback function or\n * by using [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). The\n * SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class trafficIncidents\n */\ndefine('services/trafficIncidents',[\"rest/trafficIncidents\", \"model/traffic/trafficIncidents\", \"./chain\", \"./validators\", \"./converters\", \"./worldEdge\"],\n function (trafficIncidents, model, chain, validators, converters, worldEdge) {\n \"use strict\";\n\n var fields = {\n /**\n * A setter and getter for _'key'_ attribute. Key can be set globally when initializing map, with\n * tomtom.key or tomtom.trafficIncidents.key function. But also per service instance on initialization or\n * with this method.\n *\n * The API Key can be issued from http://developer.tomtom.com\n *\n * @method key\n * @chainable\n * @param {String} [key] API Key valid for requested service.\n * @throws {TypeError} if the given argument cannot be converted to a valid value.\n * @return {trafficIncidents|String} Method returns the service instance allowing chaining or key value if\n * argument is omitted.\n */\n key: {validator: validators.string},\n /**\n * A setter and getter for a required _'zoomLevel'_ attribute. The zoom level of currently displayed map.\n * It is needed as the style (visibility, clustering, etc...) depends on current zoom level.\n * @method zoomLevel\n * @chainable\n * @param {Integer|String} [zoomLevel] Zoom level from 0 to 18.\n * @throws {TypeError} if the given argument cannot be converted to a valid value.\n * @return {trafficIncidents|Integer} Method returns the service instance allowing chaining or zoom level\n * value if argument is omitted.\n */\n zoomLevel: {validator: validators.zoomLevel, required: true},\n /**\n * A setter and getter for a required _'boundingBox'_ attribute. The bounding box of the area where\n * incidents are supposed to be shown.\n *\n * Bounding box can exceed world boundaries (-180, -90, 180, 90) it is not an issue. The service will\n * internally normalize it by overwriting any exceeding value with maximal or minimal allowed. Longitude\n * will be recalculated to fit the allowed range, if bounding box includes edge of the world it will be\n * split into two bounding boxes and the response will contain merged results for both areas.\n *\n * The service is able to convert a number of popular formats into the bounding box. Supported formats are\n * listed below:\n * * _{minLon: 0, minLat: 0, maxLon: 1, maxLat: 1}_ // plain object with minLon, minLat, maxLon, maxLat\n * fields\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _[0, 0, 1, 1]_ // array of numbers containing in order minLon, minLat, maxLon, maxLat\n * * _ol.Extent_ // open layers extend object\n * * _[ol.Coordinate, ol.Coordinate]_ // array of two open layers coordinate objects in order southWest,\n * northEast\n * * _[[0, 0], [1, 1]]_ // array of two arrays (southWest, northEast) with latitude and longitude values\n * * _\"0,0,1,1\"_ // comma seperated string of number values minLon, minLat, maxLon, maxLat\n * * _[{lon: 0, lat: 0},{lon: 1, lat: 1}]_ // array of two plain objects (southWest, northEast) with lat\n * and lon fields\n * * _[{lng: 0, lat: 0},{lng: 1, lat: 1}]_ // array of two plain objects (southWest, northEast) with lat\n * and lng fields\n * * _[L.latLng(...), L.latLng(...)]_ // array of southWest and northEast leaflet latLng objects\n * * _google.maps.LatLngBounds_ // Google Maps bounds object\n * * _google.maps.LatLngBoundsLiteral_ // Google Maps bounds object\n * * _[LatLng, LatLng]_ // array of two google.maps.LatLng\n * * _[LatLngLiteral, LatLngLiteral]_ // array of two google.maps.LatLngLiteral\n *\n * @method boundingBox\n * @chainable\n * @param {*} [boundingBox] the bounding box of the area that traffic incidents are supposed to be\n * retrieved.\n * @throws {TypeError} if the given argument cannot be converted to a valid value.\n * @return {trafficIncidents|String} Method returns the service instance allowing chaining or converted\n * bounding box value if argument is omitted.\n */\n boundingBox: {converter: converters.boundingBox, validator: validators.boundingBox, required: true},\n /**\n * A setter and getter for a required _'style'_ attribute. The style that will be used to render the\n * traffic tile in the Maps API. This will have an effect on the coordinates of traffic incidents in the\n * reply.\n *\n * @method style\n * @chainable\n * @param {String} [style] Style name, needs to be on of _'s1', 's2', 's3', 'night'_. This needs to match\n * style of your raster traffic tiles to match traffic tubes with traffic icons.\n * @throws {TypeError} if the given argument cannot be converted to a valid value.\n * @return {trafficIncidents|String} Method returns the service instance allowing chaining or style value\n * if argument is omitted.\n */\n style: {validator: validators.oneOfValue([\"s1\", \"s2\", \"s3\", \"night\"], \"traffic style\"), required: true},\n /**\n * A setter and getter for a _'language'_ attribute. ISO 639-1 code for the output language. Affects the\n * incidentCause and description fields in the response. By default it is English, also used in for some\n * reason conversion fails. There is a conversion mechanism in place that will (ignoring the case) try to\n * match user input with language. In example for French language the following options are possible: \"fr\",\n * \"fre\", \"fr-fr\", \"fr_fr\", \"french\"\n *\n * @method language\n * @chainable\n * @param {String} [language] Language code, a conversion mechanism will be applied. Supported languages\n * are ca, cs, da, de, en, es, fi, fr, hu, it, nl, no, pl, pt, sk, sv, tr.\n * @throws {TypeError} if the given argument cannot be converted to a valid value.\n * @return {trafficIncidents|String} Method returns the service instance allowing chaining or language\n * value if argument is omitted.\n */\n language: {converter: converters.trafficIncidentsLanguage, validator: validators.trafficIncidentsLanguage},\n /**\n * A setter and getter for a _'trafficModelID'_ attribute. Number referencing traffic model. This can be\n * obtained from trafficModelId service. It is updated every minute, and is valid for two minutes before it\n * times out. If the wrong Traffic Model ID is specified, the correct one will be returned by the\n * interface. The default value of -1 will always invoke the most recent traffic model. Nevertheless it is\n * a good practice to use value obtained from service as this will guarantee alignment with the raster\n * traffic layer.\n *\n * @method trafficModelID\n * @chainable\n * @param {Integer} [trafficModelID] Valid, not older than two minutes, traffic model ID.\n * @throws {TypeError} if the given argument cannot be converted to a valid value.\n * @return {trafficIncidents|Integer} Method returns the service instance allowing chaining or style value\n * if argument is omitted.\n */\n trafficModelID: {validator: validators.integer, defaultValue: -1},\n //TODO: to support this we need handle the geometries that comes from service.\n geometries: {validator: validators.oneOfValue([\"shifted\", \"original\"], \"traffic geometries\")},\n /**\n * A setter and getter for an _'expandCluster'_ attribute. Enables service to list all traffic incidents in\n * a cluster separately. This causes that in the response clusters are represented as geometry collections\n * and cluster coordinates are kept as clusterCoordinates parameter. This option can be used when user\n * wants to display details of incidents that are clustered or want to perform client side clustering. By\n * default this option is disabled.\n *\n * @method expandCluster\n * @chainable\n * @param {Boolean} [expandCluster] Should service include details of incidents that are clustered.\n * @throws {TypeError} if the given argument cannot be converted to a valid value.\n * @return {trafficIncidents|Boolean} Method returns the service instance allowing chaining or expand\n * cluster value if argument is omitted.\n */\n expandCluster: {validator: validators.bool, defaultValue: false},\n /**\n * A setter and getter for an _'originalPosition'_ attribute. Return the original position of the incident\n * (originalPosition attribute) as well as the one shifted to the beginning of the traffic tube. By default\n * _false_.\n *\n * @method originalPosition\n * @chainable\n * @param {Boolean} [originalPosition] Should service include original incidents' position.\n * @throws {TypeError} if the given argument cannot be converted to a valid value.\n * @return {trafficIncidents|Boolean} Method returns the service instance allowing chaining or original\n * position value if argument is omitted.\n */\n originalPosition: {validator: validators.bool, defaultValue: false},\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {trafficIncidents|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n protocol: {validator: validators.oneOfValue([\"http\", \"https\"], \"protocol\")},\n baseUrl: {validator: validators.string},\n serviceUrl: {validator: validators.string}\n };\n\n /**\n * The function performing actual call to the web service.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * The final response from service is a GeoJSON with properties.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * // this is optional if you passed global key earlier\n * tomtom.trafficIncidents.key();\n * var trafficIncidents = tomtom.trafficIncidents().callback(myFunction).go();\n * ```\n */\n /**\n * A setter and getter for callback function. This function is called after receiving successful response from\n * service. It takes one argument which is the response HTML from service.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {trafficIncidents|Function} Method returns the service instance allowing chaining or function if\n * argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {trafficIncidents|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n function addBoundingBoxParameters(data, boundingBox) {\n data.minLon = boundingBox.minLon;\n data.maxLon = boundingBox.maxLon;\n data.minLat = boundingBox.minLat;\n data.maxLat = boundingBox.maxLat;\n return data;\n }\n\n function handleChain(data, callback) {\n worldEdge(trafficIncidents.incidentsDetails, model, data, callback, addBoundingBoxParameters);\n }\n\n /**\n * The method to instantiates the service. The options can be passed on creation or later during the execution\n * using function with the name matching parameter name. Each option can be retrieved using the exactly same\n * function but without parameter. The instance of service can be reused by calling multiple times go()\n * function.\n *\n * @method trafficIncidents\n * @param {Object} [options] Options to be passed to the trafficIncidents call.\n * @param {String} [options.key] This is optional if key was already passed.\n * @param {Integer} [options.zoomLevel] A zoom level of current map view <0, 18>.\n * @param {Object|Array|String} [options.boundingBox] The area to extract incidents from. Conversion objects\n * are described with boudingBox() function.\n * @param {String} [options.style] Style name, needs to be on of _'s1', 's2', 's3', 'night'_. This needs to\n * match style of your raster traffic tiles to match traffic tubes with traffic icons.\n * @param {String} [options.language=en] Language code of the incidentCause and description.\n * @param {Integer} [options.trafficModelID=-1] Valid, not older than two minutes, traffic model ID.\n * @param {Boolean} [options.expandCluster=false] Should service include details of incidents that are\n * clustered.\n * @param {Boolean} [options.originalPosition=false] Should service include original incidents' position.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @return {trafficIncidents} Method returns new object that allows communication with the service.\n *\n * @example\n * ```javascript\n *\n * tomtom.trafficIncidents({key: \"\", boundingBox: \"0,0,1,1\", style: \"s1\"})\n * .zoomLevel(12).go().then(function(response) {\n * console.log(response);\n * });\n * ```\n */\n return function (options) {\n return chain(fields, handleChain, options);\n };\n });\n\n","/*\n\t\t _ _\n\t\t| | (_)\n\t\t| |_ _ ___\n\t\t| __| | / __|\n\t\t| |_ _| \\__ \\\n\t\t \\__(_) |___/\n\t\t _/ |\n\t\t |__/\n\n\tt.js\n\ta micro-templating framework in ~400 bytes gzipped\n\n\t@author Jason Mooberry \n\t@license MIT\n\t@version 0.1.0\n\n*/\n(function() {\n\n\tvar blockregex = /\\{\\{(([@!]?)(.+?))\\}\\}(([\\s\\S]+?)(\\{\\{:\\1\\}\\}([\\s\\S]+?))?)\\{\\{\\/\\1\\}\\}/g,\n\t\tvalregex = /\\{\\{([=%])(.+?)\\}\\}/g;\n\n\tfunction t(template) {\n\t\tthis.t = template;\n\t}\n\n\tfunction scrub(val) {\n\t\treturn new Option(val).text.replace(/\"/g,\""\");\n\t}\n\n\tfunction get_value(vars, key) {\n\t\tvar parts = key.split('.');\n\t\twhile (parts.length) {\n\t\t\tif (!(parts[0] in vars)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvars = vars[parts.shift()];\n\t\t}\n\t\treturn vars;\n\t}\n\n\tfunction render(fragment, vars) {\n\t\treturn fragment\n\t\t\t.replace(blockregex, function(_, __, meta, key, inner, if_true, has_else, if_false) {\n\n\t\t\t\tvar val = get_value(vars,key), temp = \"\", i;\n\n\t\t\t\tif (!val) {\n\n\t\t\t\t\t// handle if not\n\t\t\t\t\tif (meta == '!') {\n\t\t\t\t\t\treturn render(inner, vars);\n\t\t\t\t\t}\n\t\t\t\t\t// check for else\n\t\t\t\t\tif (has_else) {\n\t\t\t\t\t\treturn render(if_false, vars);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\n\t\t\t\t// regular if\n\t\t\t\tif (!meta) {\n\t\t\t\t\treturn render(if_true, vars);\n\t\t\t\t}\n\n\t\t\t\t// process array/obj iteration\n\t\t\t\tif (meta == '@') {\n\t\t\t\t\t// store any previous vars\n\t\t\t\t\t// reuse existing vars\n\t\t\t\t\t_ = vars._key;\n\t\t\t\t\t__ = vars._val;\n\t\t\t\t\tfor (i in val) {\n\t\t\t\t\t\tif (val.hasOwnProperty(i)) {\n\t\t\t\t\t\t\tvars._key = i;\n\t\t\t\t\t\t\tvars._val = val[i];\n\t\t\t\t\t\t\ttemp += render(inner, vars);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvars._key = _;\n\t\t\t\t\tvars._val = __;\n\t\t\t\t\treturn temp;\n\t\t\t\t}\n\n\t\t\t})\n\t\t\t.replace(valregex, function(_, meta, key) {\n\t\t\t\tvar val = get_value(vars,key);\n\n\t\t\t\tif (val || val === 0) {\n\t\t\t\t\treturn meta == '%' ? scrub(val) : val;\n\t\t\t\t}\n\t\t\t\treturn \"\";\n\t\t\t});\n\t}\n\n\tt.prototype.render = function (vars) {\n\t\treturn render(this.t, vars);\n\t};\n\n\t//AMD, CommonJs, then globals\n if (typeof define === 'function' && define.amd) {\n define('t',[], function() {\n return t;\n });\n } else if (typeof exports === 'object') {\n module.exports = t;\n } else {\n window.t = window.t || t;\n }\n}());\n\n","/**\n * The converter for time and distance.\n *\n * @class unitFormatConverter\n */\ndefine('unitFormatConverter/unitFormatConverter',[], function () {\n \"use strict\";\n\n function withLeadingZero(value) {\n return value < 10 ? \"0\" + value : value;\n }\n\n function imperialDistance(distanceMeters) {\n var yards = 1.0936133 * distanceMeters;\n var miles = 0.000621371192 * distanceMeters;\n return miles < 1 ? Math.round(yards) + \" yd\" : (Math.round(miles * 10) / 10) + \" mi\";\n }\n\n function metricDistance(distanceMeters) {\n if (distanceMeters >= 1000) {\n return (Math.round(distanceMeters / 100) / 10) + \" km\";\n }\n return distanceMeters + \" m\";\n }\n\n return {\n /**\n * Converts given time in seconds to the format of 'HH h MM min' or 'MM min SS s'.\n * HH - hours MM - minutes SS - seconds.\n *\n * @method formatTime\n * @param {Integer} [seconds] Number of seconds to be formatted.\n * @return {String} Returns a formatted time.\n *\n * @example\n * ```javascript\n *\n * unitFormatConverter.formatTime(3600); // gives 1 h 0 min\n * ```\n */\n formatTime: function (seconds) {\n if (seconds === undefined) {\n return;\n }\n var secondsNum = parseInt(seconds, 10),\n hours = Math.floor(secondsNum / 3600),\n minutes = Math.floor((secondsNum - (hours * 3600)) / 60),\n secondsFormatted,\n minutesFormatted;\n if (secondsNum < 60) {\n return secondsNum + \" s\";\n }\n secondsNum %= 60;\n secondsFormatted = withLeadingZero(secondsNum);\n minutes %= 60;\n minutesFormatted = withLeadingZero(minutes);\n if (hours > 0) {\n return hours + \":\" + minutesFormatted + \" h\";\n }\n return minutes + \":\" + secondsFormatted + \" min\";\n },\n\n /**\n * Converts a date in the machine format to a more human readable form.\n * Returns a formatted string created from the given date in UTC format.\n *\n * @method formatHourAndMinute\n * @param {String} [dateInMs] Date and time specified in the RFC-3339 format with an optional time zone offset.\n * @return {String} Method returns formatted time of hours and minutes.\n *\n * @example\n * ```javascript\n *\n * unitFormatConverter.formatHourAndMinute('2016-03-01T15:45:58+01:00') // gives '3:45'\n * ```\n */\n formatHourAndMinute: function (dateInMs) {\n var date = new Date(dateInMs);\n var hour = date.getHours(),\n minute = date.getMinutes();\n return hour + \":\" + withLeadingZero(minute);\n },\n\n /**\n * Converts distance in meters to a proper display format in SI or imperial units.\n *\n * @method formatDistance\n * @param {Integer} [distanceMeters] A distance in meters.\n * @param {Boolean} [imperial=false] Use imperial units.\n * @return {String} Returns a formatted distance.\n */\n formatDistance: function (distanceMeters, imperial) {\n if (distanceMeters === undefined) {\n return;\n }\n if (imperial) {\n return imperialDistance(distanceMeters);\n } else {\n return metricDistance(distanceMeters);\n }\n }\n\n };\n});\n","define('display/layers/defaultIncidentsLayer',['leaflet', 't', 'unitFormatConverter/unitFormatConverter'], function (L, T, units) {\n 'use strict';\n\n var iconsMapping = {\n 'Unknown': 'danger', 'Accident': 'accident', 'Fog': 'danger', 'Dangerous Conditions': 'danger',\n 'Rain': 'danger', 'Ice': 'ice', 'Jam': 'incident', 'Lane Closed': 'laneclosed', 'Road Closed': 'roadclosed',\n 'Road Works': 'roadwork', 'Wind': 'danger', 'Flooding': 'danger', 'Detour': 'danger', 'Cluster': ''\n },\n iconTemplate = '
' +\n '
',\n shieldTemplate = '{{roadNumber}}
{{=roadNumber}}
{{/roadNumber}}',\n descriptionTemplate = '
{{=incidentCategory}}
' +\n '
' +\n '{{delaySeconds}}
{{=time}}
{{/delaySeconds}}' +\n '{{lengthMeters}}
{{=distance}}
{{/lengthMeters}}
',\n messageTemplate = new T('
' + iconTemplate + shieldTemplate + descriptionTemplate + '
');\n\n function trafficIncidentMessage(info, imperialDistance) {\n info.distance = units.formatDistance(info.lengthMeters, imperialDistance);\n info.time = units.formatTime(info.delaySeconds);\n info.incidentSeverity = info.incidentSeverity || 'unknown';\n info.icon = iconsMapping[info.incidentCategory];\n return messageTemplate.render(info);\n }\n\n function clusterClickHandler(bounds, latlng) {\n if (bounds) {\n return function () {\n this._map.fitBounds(bounds);\n };\n } else {\n return function () {\n this._map.setZoomAround(latlng, this._map.getZoom() + 2);\n };\n }\n\n }\n\n return function (feature, latlng, imperialDistance) {\n var iconOptions = {\n background: {\n iconSize: L.Browser.retina ? [34, 34] : [20, 20],\n iconAnchor: L.Browser.retina ? [17, 17] : [10, 10],\n icon: ''\n },\n icon: {\n iconSize: L.Browser.retina ? [34, 34] : [20, 20],\n iconAnchor: [0, 0],\n icon: ''\n },\n content: {\n iconSize: L.Browser.retina ? [34, 34] : [20, 20],\n iconAnchor: [0, 0],\n content: '',\n 'style': {\n 'color': '#fff',\n 'font-weight': 'bold',\n 'font-size': L.Browser.retina ? '18px' : '11px'\n }\n },\n popupAnchor: L.Browser.retina ? [0, -8] : [0, -5]\n }, marker;\n\n if (!feature || !feature.properties) {\n return null;\n }\n\n iconOptions.background.icon = 'icon-circle-' + (feature.properties.incidentSeverity || 'unknown');\n\n if (feature.properties.clusterSize) {\n iconOptions.icon = null;\n iconOptions.content.content = feature.properties.clusterSize < 100 ? feature.properties.clusterSize : '99+';\n marker = L.marker(latlng, {icon: L.svgIcon(iconOptions)});\n marker.on('click', clusterClickHandler(feature.properties.clusterBounds, latlng));\n } else {\n iconOptions.content = null;\n iconOptions.icon.icon = 'icon-' + iconsMapping[feature.properties.incidentCategory] + '-white';\n marker = L.marker(latlng, {icon: L.svgIcon(iconOptions)});\n marker.bindPopup(trafficIncidentMessage(feature.properties, imperialDistance), {className: 'incidents-popup'});\n }\n return marker;\n };\n});\n","/**\n * This is an extension to Leaflet allowing to display the TomTom traffic layer. It is based on the raster\n * L.TileLayer implementation.\n *\n * @class TomTomTrafficLayer\n * @extends L.TileLayer\n */\n/**\n * @method tomTomTrafficLayer\n * @param {Object} [options] All the options that Leaflet allows, as described here:\n * http://leafletjs.com/reference.html#tilelayer-options Additional options, which are TomTom specific, are\n * described below.\n * @param {String} [options.key] This is an API key that can be obtained form http://developer.tomtom.com This is a key\n * for the traffic services.\n * @param {String} [options.style] The traffic layer style to be used. Should be set to one of the following values:\n * <'s1', 's2', 's3', 'night'>. By default, the _night_ style is used.\n * @param {Number} [options.opacity=0.8] The traffic incidents layer's opacity, by default set to 80%. A\n * floating point value between 0 and 1 have to be used, where 1 means no transparency.\n */\n\n/**\n * This is an extension to Leaflet allowing to display the TomTom traffic incidents layer. It is based on the L.GeoJSON\n * class. It is using the tomtom.trafficIncidents service in order to retrieve incidents details.\n *\n * A look and feel, together with a clustering behaviour, can be modified by passing the pointToLayer function. The\n * default implementation looks as follows\n * ```javascript\n *\n * define(['leaflet', 't', 'unitFormatConverter/unitFormatConverter'], function (L, T, units) {\n * 'use strict';\n *\n * var iconsMapping = {\n * 'Unknown': 'danger', 'Accident': 'accident', 'Fog': 'danger', 'Dangerous Conditions':\n * 'danger', 'Rain': 'danger', 'Ice': 'ice', 'Jam': 'incident', 'Lane Closed':\n * 'laneclosed', 'Road Closed': 'roadclosed', 'Road Works': 'roadwork', 'Wind': 'danger',\n * 'Flooding': 'danger', 'Detour': 'danger', 'Cluster': ''\n * },\n * iconTemplate = '
' +\n * '
',\n * shieldTemplate = '{{roadNumber}}
{{=roadNumber}}
' +\n * '{{/roadNumber}}',\n * descriptionTemplate = '
' +\n * '{{=incidentCategory}}
' +\n * '{{delaySeconds}}
{{=time}}
{{/delaySeconds}}' +\n * '{{lengthMeters}}
{{=distance}}
{{/lengthMeters}}
' +\n * '
',\n * messageTemplate = new T('
' + iconTemplate + shieldTemplate +\n * descriptionTemplate + '
');\n *\n * function trafficIncidentMessage(info, imperialDistance) {\n * info.distance = units.formatDistance(info.lengthMeters, imperialDistance);\n * info.time = units.formatTime(info.delaySeconds);\n * info.incidentSeverity = info.incidentSeverity || 'unknown';\n * info.icon = iconsMapping[info.incidentCategory];\n * return messageTemplate.render(info);\n * }\n *\n * function clusterClickHandler(bounds, latlng) {\n * if (bounds) {\n * return function () {\n * this._map.fitBounds(bounds);\n * };\n * } else {\n * return function () {\n * this._map.setZoomAround(latlng, this._map.getZoom() + 2);\n * };\n * }\n *\n * }\n *\n * return function (feature, latlng, imperialDistance) {\n * var iconOptions = {\n * background: {\n * iconSize: L.Browser.retina ? [34, 34] : [20, 20],\n * iconAnchor: L.Browser.retina ? [17, 17] : [10, 10],\n * icon: ''\n * },\n * icon: {\n * iconSize: L.Browser.retina ? [34, 34] : [20, 20],\n * iconAnchor: [0, 0],\n * icon: ''\n * },\n * content: {\n * iconSize: L.Browser.retina ? [34, 34] : [20, 20],\n * iconAnchor: [0, 0],\n * content: '',\n * 'style': {\n * 'color': '#fff',\n * 'font-weight': 'bold',\n * 'font-size': L.Browser.retina ? '18px' : '11px'\n * }\n * },\n * popupAnchor: L.Browser.retina ? [0, -8] : [0, -5]\n * }, marker;\n *\n * if (!feature || !feature.properties) {\n * return null;\n * }\n *\n * iconOptions.background.icon = 'icon-circle-' +\n * (feature.properties.incidentSeverity || 'unknown');\n *\n * if (feature.properties.clusterSize) {\n * iconOptions.icon = null;\n * iconOptions.content.content = feature.properties.clusterSize < 100\n * ? feature.properties.clusterSize:'99+';\n * marker = L.marker(latlng, {icon: L.svgIcon(iconOptions)}); marker.on('click',\n * clusterClickHandler(feature.properties.clusterBounds, latlng));\n * } else {\n * iconOptions.content = null;\n * iconOptions.icon.icon = 'icon-' + iconsMapping[feature.properties.incidentCategory] +\n * '-white';\n * marker = L.marker(latlng, {icon: L.svgIcon(iconOptions)});\n * marker.bindPopup(trafficIncidentMessage(feature.properties, imperialDistance),\n * {className: 'incidents-popup'});\n * }\n * return marker;\n * };\n * });\n * ```\n *\n * @class TomTomTrafficIncidentsLayer\n * @extends L.GeoJSON\n */\n/**\n * @method tomTomTrafficIncidentsLayer\n * @param {Object} [options] All the options that Leaflet allows, as described here:\n * http://leafletjs.com/reference.html#geojson-options Additional options, which are TomTom specific, are described\n * below.\n * @param {String} [options.key] This is an API key that can be obtained form http://developer.tomtom.com This is\n * a key for the traffic services.\n * @param {Function} [options.pointToLayer=default] This function is used to convert vector traffic\n * incidents into a layer of markers on the map. It takes the GeoJSON feature as the first parameter and the latlng\n * object as the second one. It returns a layer that will be added to the map. If this is omitted, the default\n * implementation is used (displayed above).\n * @param {Boolean} [options.imperialDistance] With this parameter, you can make the traffic details popups to display\n * a distance in imperial units, if the default pointToLayer function is used.\n */\ndefine('display/layers/trafficLayer',[\"leaflet\", \"security\", \"services/trafficModelId\", \"services/trafficIncidents\", \"./defaultIncidentsLayer\", \"http\"],\n function (L, security, trafficModelId, trafficIncidents, defaultPointToLayer, http) {\n \"use strict\";\n\n var trafficStyles = [\"s1\", \"s2\", \"s3\", \"night\"];\n\n function getTrafficStyle(trafficLayer) {\n var style = \"night\";\n if (typeof trafficLayer === \"string\") {\n for (var i = 0; i < trafficStyles.length; i += 1) {\n if (trafficStyles[i] === trafficLayer.toLowerCase()) {\n return trafficStyles[i];\n }\n }\n }\n return style;\n }\n\n function pointToLayer(options) {\n return function (feature, latlng) {\n return defaultPointToLayer(feature, latlng, options.imperialDistance);\n };\n }\n\n L.TomTomTrafficIncidentsLayer = L.GeoJSON.extend({\n options: {\n imperialDistance: false,\n trafficModelId: -1\n },\n initialize: function (options) {\n L.setOptions(this, options);\n this._layers = {};\n security.setKey(\"services/traffic\", options.key);\n this.incidentsService = trafficIncidents()\n .key(security.getKey(\"services/traffic\"))\n .style(getTrafficStyle(options.style));\n this.options.pointToLayer = this.options.pointToLayer || pointToLayer(this.options);\n },\n onAdd: function (map) {\n this._map = map;\n this.eachLayer(map.addLayer, map);\n map.on({\"viewreset\": this.redraw, \"moveend\": this.update}, this);\n },\n redraw: function () {\n var that = this,\n map = this._map;\n this.incidentsService.boundingBox(map.getBounds()).zoomLevel(map.getZoom()).trafficModelID(this.options.trafficModelId).go().then(function (geoJSON) {\n that.clearLayers().addData(geoJSON);\n });\n },\n update: function () {\n var that = this,\n map = this._map;\n this.incidentsService.boundingBox(map.getBounds()).zoomLevel(map.getZoom()).go().then(function (geoJSON) {\n that.addData(geoJSON);\n var positions = [];\n that.eachLayer(function (layer) {\n var latLng = layer.getLatLng();\n var position = latLng.lat + \",\" + latLng.lng;\n for (var i = 0; i < positions.length; i += 1) {\n if (position === positions[i]) {\n that.removeLayer(layer);\n return;\n }\n }\n positions.push(position);\n });\n });\n },\n setTrafficModelId: function (trafficModelId) {\n if (this.options.trafficModelId !== trafficModelId) {\n this.options.trafficModelId = trafficModelId;\n this.redraw();\n }\n }\n });\n\n L.tomTomTrafficIncidentsLayer = function (options) {\n return new L.TomTomTrafficIncidentsLayer(options);\n };\n\n function handleSubdomains(options) {\n if (typeof options.subdomains === \"string\") {\n options.subdomains = options.subdomains.split(\"\");\n }\n }\n\n function loadAnimation() {\n var opacity = \"opacity\",\n back = this._bgBuffer;\n back.style[L.DomUtil.TRANSITION] = opacity + \" 10\";\n back.style[opacity] = 0.1;\n this._tileContainer.style[opacity] = this.options.opacity;\n }\n\n L.TomTomTrafficLayer = L.TileLayer.extend({\n options: {\n attribution: \"\",\n minZoom: 2,\n maxZoom: 18,\n subdomains: \"abcd\",\n reuseTiles: true,\n opacity: 0.8,\n errorTileUrl: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEAAQMAAABmvDolAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAB9JREFUGBntwQENAAAAwiD7p34ON2AAAAAAAAAAAOcCIQAAAfWivQQAAAAASUVORK5CYII=\",\n detectRetina: false,\n trafficModelId: -1\n },\n initialize: function (options) {\n options = L.setOptions(this, options);\n if (options.bounds) {\n options.bounds = L.latLngBounds(options.bounds);\n }\n security.setKey(\"services/traffic\", options.key);\n var key = security.getKey(\"services/traffic\");\n options.accessToken = key;\n this._url = http.protocol() + \"://{s}.api.tomtom.com/traffic/map/4/tile/incidents/{style}/{z}/{x}/{y}.png?t={trafficModelId}\" + (key ? \"&key={accessToken}\" : \"\");\n options.style = getTrafficStyle(options.style);\n handleSubdomains(options);\n options.tileSize = (options.detectRetina && L.Browser.retina) ? 512 : 256;\n if (options.tileSize === 512) {\n options.zoomOffset -= 1;\n options.minZoom = options.minZoom > 0 ? options.minZoom - 1 : 0;\n }\n this.setOpacity(options.opacity);\n },\n onAdd: function (map) {\n L.TileLayer.prototype.onAdd.call(this, map);\n if (this._animated) {\n this.on(\"load\", loadAnimation);\n }\n this._updateOpacity();\n },\n setTrafficModelId: function (trafficModelId) {\n if (this.options.trafficModelId !== trafficModelId) {\n this.options.trafficModelId = trafficModelId;\n this.redraw();\n }\n }\n });\n\n L.tomTomTrafficLayer = function (options) {\n return new L.TomTomTrafficLayer(options);\n };\n\n return function (options) {\n var raster = L.tomTomTrafficLayer(options),\n incidents = L.tomTomTrafficIncidentsLayer(options),\n trafficModelIdService = trafficModelId({key: security.getKey(\"services/traffic\")});\n\n function refreshTrafficModelId() {\n trafficModelIdService.go().then(function (trafficModelId) {\n raster.setTrafficModelId(trafficModelId);\n incidents.setTrafficModelId(trafficModelId);\n });\n }\n\n refreshTrafficModelId();\n // refresh the traffic layer\n if (!options.noRefresh) {\n setInterval(refreshTrafficModelId, 30000);\n }\n return L.layerGroup([raster, incidents]);\n };\n });\n","/**\n * This is an extension to Leaflet allowing to display TomTom traffic flow layer. It is based on the raster L.TileLayer\n * implementation. The possible options are described below.\n *\n * @class TomTomTrafficFlowLayer\n * @extends L.TileLayer\n */\n/**\n * @method tomTomTrafficFlowLayer\n * @param {Object} [options] All the options that Leaflet allows, as described here:\n * http://leafletjs.com/reference.html#tilelayer-options Additional options, which are TomTom specific, are\n * described below.\n * @param {String} [options.style=\"absolute\"] The traffic flow style to be displayed. It should be set to one of the following\n * values: <'absolute', 'relative', 'relative-delay'>. By default, the _absolute_ style is used. When the\n * style is set to _absolute_, then the colours of the road segments reflect a measured absolute speed. Calls using\n * the _relative_ style return a speed relative to the free-flow traffic information, highlighting areas of\n * congestion. The _Relative-delay_ style displays relative speeds only in places where they are different from\n * the free-flow speed (no green segments shown).\n * @param {Number} [options.opacity=0.7] The traffic flow layer's opacity, by default set to 70%. A floating point\n * value between 0 and 1 have to be used, where 1 means no transparency.\n * @param {Integer} [options.refresh=180000] The traffic flow information changes and needs to be reloaded\n * periodically. By default, it is reloaded every 3 minutes. This parameter's value represents time in ms between\n * refreshes. In order to disable reloading, set it to _false_ or _0_.\n */\ndefine('display/layers/trafficFlowLayer',[\"leaflet\", \"security\", \"http\"], function (L, security, http) {\n \"use strict\";\n\n var trafficFlowStyles = [\"absolute\", \"relative\", \"relative-delay\"];\n\n function getTrafficFlowStyle(trafficFlowLayer) {\n var style = \"absolute\";\n if (typeof trafficFlowLayer === \"string\") {\n for (var i = 0; i < trafficFlowStyles.length; i += 1) {\n if (trafficFlowStyles[i] === trafficFlowLayer.toLowerCase()) {\n return trafficFlowStyles[i];\n }\n }\n }\n return style;\n }\n\n function tiles512Options(options) {\n options.tileSize = (options.detectRetina && L.Browser.retina) ? 512 : 256;\n if (options.tileSize === 512) {\n options.zoomOffset -= 1;\n options.minZoom = options.minZoom > 0 ? options.minZoom - 1 : 0;\n }\n }\n\n function loadAnimation() {\n var opacity = \"opacity\",\n back = this._bgBuffer;\n back.style[L.DomUtil.TRANSITION] = opacity + \" 10\";\n back.style[opacity] = 0.1;\n this._tileContainer.style[opacity] = this.options.opacity;\n }\n\n function handleSubdomains(options) {\n if (typeof options.subdomains === \"string\") {\n options.subdomains = options.subdomains.split(\"\");\n }\n }\n\n L.TomTomFlowLayer = L.TileLayer.extend({\n options: {\n attribution: \"\",\n minZoom: 2,\n maxZoom: 18,\n subdomains: \"abcd\",\n reuseTiles: true,\n opacity: 0.7,\n style: \"absolute\",\n refresh: 180000,\n errorTileUrl: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEAAQMAAABmvDolAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAB9JREFUGBntwQENAAAAwiD7p34ON2AAAAAAAAAAAOcCIQAAAfWivQQAAAAASUVORK5CYII=\",\n detectRetina: false\n },\n\n initialize: function (options) {\n options = L.setOptions(this, options);\n if (options.bounds) {\n options.bounds = L.latLngBounds(options.bounds);\n }\n security.setKey(\"services/trafficFlow\", options.key);\n var key = security.getKey(\"services/trafficFlow\");\n options.accessToken = key;\n this._url = http.protocol() + \"://{s}.api.tomtom.com/traffic/map/4/tile/flow/{style}/{z}/{x}/{y}.png\" + (key ? \"?key={accessToken}\" : \"\");\n options.style = getTrafficFlowStyle(options.style);\n handleSubdomains(options);\n tiles512Options(options);\n this.setOpacity(options.opacity);\n var that = this;\n if (options.refresh) {\n setInterval(function () {\n that.redraw();\n }, options.refresh);\n }\n },\n onAdd: function (map) {\n L.TileLayer.prototype.onAdd.call(this, map);\n if (this._animated) {\n this.on(\"load\", loadAnimation);\n }\n this._updateOpacity();\n }\n });\n\n L.tomTomFlowLayer = function (options) {\n return new L.TomTomFlowLayer(options);\n };\n\n return L.tomTomFlowLayer;\n});\n","define('display/layers/labelsLayer',[\"leaflet\", \"./tileLayer\"], function (L) {\n \"use strict\";\n\n L.TomTomLabelsLayer = L.TomTomLayer.extend({\n options: {\n },\n initialize: function (options) {\n var labelsOptions = L.extend({}, options, {layer: \"labels\", opacity: 0.9});\n L.TomTomLayer.prototype.initialize.call(this, labelsOptions);\n },\n onAdd: function (map) {\n var that = this;\n map.on(\"layeradd\", function () {\n if (map._panes.tilePane.childElementCount > 1 || map._panes.overlayPane.childElementCount > 0) {\n if (!that._container) {\n L.TomTomLayer.prototype.onAdd.call(that, map);\n }\n that.bringToFront();\n }\n });\n },\n bringToFront: function () {\n var pane = this._map._panes.overlayPane;\n if (this._container) {\n pane.appendChild(this._container);\n this._setAutoZIndex(pane, Math.max);\n }\n return this;\n },\n _initContainer: function () {\n var tilePane = this._map._panes.overlayPane;\n\n if (!this._container) {\n this._container = L.DomUtil.create('div', 'leaflet-transparent-layer');\n\n this._updateZIndex();\n\n if (this._animated) {\n var className = 'leaflet-tile-container';\n\n this._bgBuffer = L.DomUtil.create('div', className, this._container);\n this._tileContainer = L.DomUtil.create('div', className, this._container);\n\n } else {\n this._tileContainer = this._container;\n }\n\n tilePane.appendChild(this._container);\n\n if (this.options.opacity < 1) {\n this._updateOpacity();\n }\n }\n },\n });\n\n L.tomTomLabelsLayer = function (options) {\n return new L.TomTomLabelsLayer(options);\n };\n\n return L.tomTomLabelsLayer;\n});\n","define('rest/copyright',[\"http\", \"security\", \"./utils\"],\n function (http, security, utils) {\n \"use strict\";\n\n return {\n /**\n * Gets copyright information for given NDS maps areas.\n * In addition to basic copyright for the whole map, API is serving specific groups of copyrights for some\n * countries which are written in JSON, JSONP or XML format.\n * @example\n * var options = {\n * minLon: -106.8224,\n * minLat: 34.9246,\n * maxLon: -106.4008,\n * maxLat: 35.3234\n * };\n * copyrights.copyrights(options, function(response) { ... });\n *\n * @method copyrights\n * @param {Object} options Options to be passed to the copyrights call.\n * @param {Object} options.minLon Minimum longitude coordinate of bounding box.\n * @param {Object} options.minLat Minimum latitude coordinate of bounding box.\n * @param {Object} options.maxLon Maximum longitude coordinate of bounding box.\n * @param {Object} options.maxLat Maximum latitude coordinate of bounding box.\n * @param {Object} options.key API Key valid for requested service.\n * @param {Function} [options.fail] The callback function to be called on failure.\n * @param {Function} callback The callback function to be called on success.\n */\n copyrights: function (options, callback) {\n var pathParams = {},\n queryParams = {},\n baseUrl = utils.or(options.baseUrl, \"{protocol}://api.tomtom.com/\"),\n serviceUrl;\n\n // if an API key is specified, include it\n // an API key can be omitted if an API proxy is being used\n queryParams.key = utils.or(options.key, security.getKey(\"services/display\"));\n\n serviceUrl = utils.or(options.serviceUrl, \"map/1/copyrights.{contentType}\");\n // if minLon, minLat, maxLon, maxLot params are not provided user wants to obtain the default copyright\n // information for the whole world\n if (options.minLon && options.minLat && options.maxLon && options.maxLat) {\n pathParams.minLon = options.minLon;\n pathParams.minLat = options.minLat;\n pathParams.maxLon = options.maxLon;\n pathParams.maxLat = options.maxLat;\n serviceUrl = serviceUrl.replace(\"copyrights.{contentType}\", \"copyrights/{minLon}/{minLat}/{maxLon}/{maxLat}.{contentType}\");\n }\n\n http.get({\n url: baseUrl + serviceUrl,\n pathParameters: pathParams,\n queryParameters: queryParams,\n callback: callback,\n callbackParam: \"callback\",\n fail: options.fail\n });\n },\n\n /**\n * Gets copyright caption to be displayed on map.\n * The user may request the copyrights caption. It is a short message with basic copyrights information. It\n * may be used to provide a text for a html link which points to more detailed information.\n * @example\n * copyrights.caption(options, function(response) { ... });\n *\n * @method caption\n * @param {Object} options Options to be passed to the copyrights call.\n * @param {String} options.key API Key valid for requested service.\n * @param {Function} [options.fail] The callback function to be called on failure.\n * @param {Function} callback The callback function to be called on success.\n */\n caption: function (options, callback) {\n var pathParams = {},\n queryParams = {},\n baseUrl = utils.or(options.baseUrl, \"{protocol}://api.tomtom.com/\"),\n serviceUrl;\n\n // if an API key is specified, include it\n // an API key can be omitted if an API proxy is being used\n queryParams.key = utils.or(options.key, security.getKey(\"services/display\"));\n\n serviceUrl = utils.or(options.serviceUrl, \"map/1/copyrights/caption.{contentType}\");\n\n http.get({\n url: baseUrl + serviceUrl,\n pathParameters: pathParams,\n queryParameters: queryParams,\n callback: callback,\n callbackParam: \"callback\",\n fail: options.fail\n });\n }\n };\n }\n);\n\n","define('model/copyright/copyrightCaption',[\"../selector\"], function (selector) {\n \"use strict\";\n return function (json) {\n return selector(json, \"copyrightsCaption\");\n };\n});\n\n","/**\n * The copyright caption service implementation. Provides a caption that is supposed to be display on link providing to\n * full copyright notice. The response is not changed often. This service is supposed to be called once when user have\n * the map displayed for the first time.\n *\n * The tomtom.copyrightCaption() method creates a new instance of service. Parameter can be passed on creation or\n * provided via convenient function that can be chained. The method go() performs the actual call.\n *\n * The call is asynchronous therefore user have two options to handle response, either by passing callback function or\n * by using [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). The\n * SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class copyrightCaption\n */\ndefine('services/copyrightCaption',[\"rest/copyright\", \"model/copyright/copyrightCaption\", \"./chain\", \"./validators\"],\n function (copyright, model, chain, validators) {\n \"use strict\";\n var fields = {\n /**\n * A setter and getter for _'key'_ attribute. Key can be set globally when initializing map, with\n * tomtom.key or tomtom.mapsKey function. But also per service instance on initialization or\n * with this method.\n *\n * The API Key can be issued from http://developer.tomtom.com\n *\n * @method key\n * @chainable\n * @param {String} key API Key valid for requested service.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {copyrightCaption|String} Method returns the service instance allowing chaining or key value if\n * argument is omitted.\n */\n key: {validator: validators.string},\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {copyrightCaption|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n protocol: {validator: validators.oneOfValue([\"http\", \"https\"], \"protocol\")},\n baseUrl: {validator: validators.string},\n serviceUrl: {validator: validators.string}\n };\n\n /**\n * The function performing actual call to the web service.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * The final response from service is a string containing the caption i.e.:\n * © 1992 - 2016 TomTom.\n *\n * This text have to be display as a copyright prompt when using TomTom services. The caption should be\n * clickable. User should be presented with full copyright notice when caption is clicked. For further\n * documentation please check caption class.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise.\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * // this is optional if you passed global key earlier\n * tomtom.copyrightCaption.key();\n * tomtom.copyrightCaption().go(myFunction);\n * ```\n */\n /**\n * A setter and getter for callback function. This function is called after receiving successful response from\n * service. It takes one argument which is the caption text.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} If the given argument is not a function.\n * @return {copyrightCaption|Function} Method returns the service instance allowing chaining or function if\n * argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {copyrightCaption|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n function handleChain(data, callback) {\n copyright.caption(data, function (response) {\n callback.call(this, model(response));\n });\n }\n\n /**\n * The method to instantiates the service. The options can be passed on creation or later during the execution\n * using function with the name matching parameter name. Each option can be retrieved using the exactly same\n * function but without parameter. The instance of service can be reused by calling multiple times go()\n * function.\n *\n * @method copyrightCaption\n *\n * The copyright caption service implementation. Creates a new instance of service call. Parameters can be\n * passed on creation or provided via convenient functions that can be chained. The method go() performs\n * the actual call. The call is asynchronous therefore user needs to pass callback function.\n *\n *\n * @method copyrightCaption\n * @param {Object} [options] Options to be passed to the copyrightCaption call.\n * @param {String} [options.key] This is optional if key was already passed.\n * @param {Function} [options.callback] The callback function to be called on success.\n * @param {Function} [options.fail] The callback function to be called on failure. By default error is logged\n * on console and thrown.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @return {copyrightCaption} Method returns new object that allows communication with the service.\n *\n * @example\n * ```javascript\n *\n * tomtom.copyrightCaption().go().then(function(response) {\n * console.log(response);\n * });\n * ```\n */\n return function (options) {\n return chain(fields, handleChain, options);\n };\n });\n\n","define('model/copyright/copyright',[\"t\", \"../arrayMerge\"], function (t, arrayMerge) {\n \"use strict\";\n return function (data) {\n var json = data[0] || data;\n if (data.length > 1) {\n // this is edge of the world case\n json.regions = arrayMerge(data[0].regions, data[1].regions, function (first, second) {\n return first.country.ISO3 === second.country.ISO3;\n });\n }\n var copyright = new t(\"
\" +\n \"

General Copyrights:

\" +\n \"{{@generalCopyrights}}

{{=_val}}

{{/@generalCopyrights}}\" +\n \"{{@regions}}

{{=_val.country.label}}:

\" +\n \"{{_val.copyrightImages}}{{/_val.copyrightImages}}\" +\n \"{{@_val.copyrights}}

{{=_val}}

{{/@_val.copyrights}}{{/@regions}}\"\n + \"
\");\n return copyright.render(json);\n };\n});\n\n","/**\n * The copyright service implementation provides a full copyrights notice in an HTML format that can be displayed to\n * the user when the copyrights link is clicked. A text is wrapped in a 'div' element with id 'copyrightMessage'.\n * Country names are enclosed in the 'h4' elements and the copyrights information per each supplier is in 'p' elements.\n * This makes styling with CSS fairly easy.\n *\n * The copyrights API can take as argument area which the copyrights concerns. If this argument is omitted the whole\n * world is considered.\n *\n * The API handles the \"edge of the world\" issue. Allowing to properly handle bounding box that is outside of world\n * extends (-180, -90, 180, 90).\n *\n * The tomtom.copyright() method creates a new instance of the service. Parameter can be passed on its creation or\n * provided via a convenient function that can be chained. The method go() performs the actual call.\n *\n * The call is asynchronous, therefore the user have two options to handle response, either by passing a callback\n * function or by using\n * [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). The SDK\n * provides a polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class copyright\n */\ndefine('services/copyright',[\"rest/copyright\", \"model/copyright/copyright\", \"./chain\", \"./validators\", \"./converters\", \"./worldEdge\"],\n function (copyright, model, chain, validators, converters, worldEdge) {\n \"use strict\";\n\n var fields = {\n /**\n * A setter and getter for the _'key'_ attribute. Key can be set globally when initializing a map, with use\n * of either the tomtom.key or tomtom.mapsKey function. But also per service instance on\n * initialization or with this method.\n *\n * An API Key can be issued from http://developer.tomtom.com\n *\n * @method key\n * @chainable\n * @param {String} key API key valid for requested service.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {copyright|String} Returns the service instance that allows chaining or a key value if\n * argument is omitted.\n */\n key: {validator: validators.string},\n /**\n * A setter and getter for the _'boundingBox'_ attribute. The bounding box describes an area that\n * copyrights information is needed for. It can be omitted, then the whole world is taken into\n * consideration.\n *\n * Bounding box can exceed world boundaries (-180, -90, 180, 90) it is not an issue. The service will\n * internally normalize it by overwriting any exceeding value with maximum or minimum allowed. Longitude\n * is recalculated to fit the allowed range. If the bounding box includes \"the edge of the world\", it is\n * split into two bounding boxes and the response will contain merged results for both areas.\n *\n * The service is able to convert a number of popular formats into the bounding box. Supported formats are\n * listed below:\n * * _{minLon: 0, minLat: 0, maxLon: 1, maxLat: 1}_ // plain object with minLon, minLat, maxLon, maxLat\n * fields\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _[0, 0, 1, 1]_ // array of numbers containing in order minLon, minLat, maxLon, maxLat\n * * _ol.Extent_ // open layers extend object\n * * _[ol.Coordinate, ol.Coordinate]_ // array of two open layers coordinate objects in order southWest,\n * northEast\n * * _[[0, 0], [1, 1]]_ // array of two arrays (southWest, northEast) with latitude and longitude values\n * * _\"0,0,1,1\"_ // comma seperated string of number values minLon, minLat, maxLon, maxLat\n * * _[{lon: 0, lat: 0},{lon: 1, lat: 1}]_ // array of two plain objects (southWest, northEast) with lat\n * and lon fields\n * * _[{lng: 0, lat: 0},{lng: 1, lat: 1}]_ // array of two plain objects (southWest, northEast) with lat\n * and lng fields\n * * _[L.latLng(...), L.latLng(...)]_ // array of southWest and northEast leaflet latLng objects\n * * _google.maps.LatLngBounds_ // Google Maps bounds object\n * * _google.maps.LatLngBoundsLiteral_ // Google Maps bounds object\n * * _[LatLng, LatLng]_ // array of two google.maps.LatLng\n * * _[LatLngLiteral, LatLngLiteral]_ // array of two google.maps.LatLngLiteral\n *\n * @method boundingBox\n * @chainable\n * @param {Any} [boundingBox] The bounding box of the area that copyright are supposed to be retrieved.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {copyright|String} Returns the service instance that allows chaining or a converted bounding\n * box value if the argument is omitted.\n */\n boundingBox: {validator: validators.boundingBox, converter: converters.boundingBox},\n /**\n * A setter and getter for the _'protocol'_ attribute. Values represents a protocol to be used for\n * performing a service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] A protocol to be used - either _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {copyright|String} Returns the service instance that allows chaining or a _protocol_\n * value, if the argument is omitted.\n */\n protocol: {validator: validators.oneOfValue([\"http\", \"https\"], \"protocol\")},\n baseUrl: {validator: validators.string},\n serviceUrl: {validator: validators.string}\n };\n\n /**\n * The function performing an actual call to the web service.\n *\n * The callback function takes a response parameter and the fail callback takes error as the only parameter.\n *\n * The final response from the service is an HTML of the copyrights information to be displayed. A text is\n * wrapped in a 'div' element with id 'copyrightMessage'. Country names are enclosed in the 'h4' elements and\n * the copyrights information per each supplier is in 'p' elements. This makes styling with CSS fairly easy. An\n * example response may look like this:\n *```html\n *\n *

General Copyrights:

\n *

© 1992 – 2016 TomTom. All rights reserved. This\n * material is proprietary and the subject of\n * copyright protection, database right protection\n * and other intellectual property rights owned\n * by TomTom or its suppliers. The use of\n * this material is subject to the terms of a license\n * agreement. Any unauthorized copying or disclosure\n * of this material will lead to criminal and civil\n * liabilities.

\n *

Data Source © 2016 TomTom

\n *
\n * ```\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise.\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * // this is optional if you passed global key earlier\n * tomtom.copyrightKey();\n * var copyright = tomtom.copyright()\n * .boundingBox(\"-180,-90,180,90\").callback(myFunction).go();\n * ```\n */\n /**\n * A setter and getter for the callback function. This function is called after receiving successful response\n * from the service. It takes a single argument which is an HTML response from the service.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} If the given argument is not a function.\n * @return {copyright|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {copyright|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n function addBoundingBoxParameters(data, boundingBox) {\n data.minLon = boundingBox.minLon;\n data.maxLon = boundingBox.maxLon;\n data.minLat = boundingBox.minLat;\n data.maxLat = boundingBox.maxLat;\n return data;\n }\n\n function handleChain(data, callback) {\n worldEdge(copyright.copyrights, model, data, callback, addBoundingBoxParameters);\n }\n\n /**\n * The method that instantiates the service. The options parameter can be passed on the creation or later\n * during the execution - by the function with a name matching a desired parameter's name. Each option can be\n * retrieved using exactly the same function but without a parameter. An instance of the service can be reused\n * by calling the go() function multiple times.\n *\n * @method copyright\n * @param {Object} [options] Options to be passed to the copyrightCaption call.\n * @param {String} [options.key] This is optional if a key was already passed.\n * @param {Object|Array|String} [options.boundingBox] An area to extract the copyrights information for. If\n * omitted, the whole world will be taken into consideration. Conversion objects are described with the\n * boudingBox() function.\n * @param {Boolean} [options.protocol] A protocol to be used - either \"http\" or \"https\".\n * @return {copyright} Returns a new object that allows communication with the service.\n *\n * @example\n * ```javascript\n *\n * tomtom.copyright().go().then(function(response) {\n * console.log(response);\n * });\n * ```\n */\n return function (options) {\n return chain(fields, handleChain, options);\n };\n });\n\n","/**\n * The MessageBox view allows to create message control on a map.\n *\n * The tomtom.messageBox() method creates a new instance of MessageBox component.\n *\n * @class messageBox\n */\ndefine('display/messageBox',[\"leaflet\"], function (L) {\n \"use strict\";\n\n L.MessageBox = L.Class.extend({\n options: {\n closeable: true,\n closeAfter: false\n },\n\n initialize: function (options) {\n L.Util.setOptions(this, options);\n },\n\n onAdd: function (map) {\n this._map = map;\n this._container = this.container = L.DomUtil.create(\"div\", \"leaflet-messageBox\");\n this.contentContainer = L.DomUtil.create(\"div\", \"leaflet-messageBox-content\", this.container);\n if (this.options.closeable) {\n this.closeButton = L.DomUtil.create(\"div\", \"leaflet-messageBox-close-button\", this.container);\n this.closeButton.innerHTML = \"×\";\n L.DomEvent.on(this.closeButton, \"click\", this.onRemove, this);\n }\n var that = this;\n if (this.options.closeAfter && parseInt(this.options.closeAfter, 10) === this.options.closeAfter) {\n setTimeout(function () {\n that.close();\n }, this.options.closeAfter);\n }\n L.DomEvent.disableClickPropagation(this.container);\n L.DomEvent.disableScrollPropagation(this.container);\n\n if (this.options.content) {\n this.setContent(this.options.content);\n }\n\n map._container.appendChild(this.container);\n return this.container;\n },\n addTo: function (map) {\n map.addLayer(this);\n return this;\n },\n onRemove: function () {\n this._map._container.removeChild(this.container);\n return this;\n },\n /**\n * Method used to get set the HTML content of the message box.\n *\n * @chainable\n * @method setContent\n * @param {String|HTMLElement} content The text or HTML element to be a content of the message box.\n * @return {MessageBox} Returns itself allowing chaining.\n */\n setContent: function (content) {\n if (!this.contentContainer) {\n this.options.content = content;\n return this;\n }\n if (content === undefined || content === null || typeof content === \"string\") {\n this.contentContainer.innerHTML = content || \"\";\n return this;\n }\n while (this.contentContainer.firstChild) {\n this.contentContainer.lastChild.remove();\n }\n this.contentContainer.appendChild(content);\n return this;\n },\n close: function () {\n return this.onRemove();\n },\n openOn: function (map) {\n return this.addTo(map);\n }\n });\n\n L.messageBox = function (options) {\n return new L.MessageBox(options);\n };\n\n /**\n * The method to instantiates the messageBox control.\n *\n * @method messageBox\n * @param {Object} [options] Options to be passed to the messageBox control.\n * @param {Boolean} [options.closeable=true] Should the messageBox contain the close button.\n * @param {Integer} [options.closeAfter=0] Number of milliseconds after which the control will be automatically\n * closed. If value is 0 it will not be closed automatically, which is the default behaviour.\n *\n * @example\n * ```javascript\n *\n * messageBox({content='Hello world', closeAfter: 1000}).addTo(map);\n * ```\n */\n return L.messageBox;\n});\n","define('display/copyright',[\"leaflet\", \"services/copyright\", \"./messageBox\"], function (L, copyright, messageBox) {\n \"use strict\";\n return {\n addTo: function (map) {\n var tomtomAttribution = document.querySelector(\"#\" + map.getContainer().id + \" .tomtomAttribution\");\n L.DomEvent.on(tomtomAttribution, \"click\", function () {\n // TODO: add loading indicator\n copyright().boundingBox(map.getBounds())\n .callback(function (result) {\n messageBox({content: result}).addTo(map);\n }).go();\n }\n );\n }\n };\n});\n","/**\n * This module extends the Leaflet library in order to display a TomTom map. For full reference of the Leaflet map API check here.\n *\n * @example\n * var map = L.map(\"map\", {key: \"\"});\n *\n * @class L\n */\n/**\n * Initializes the map. - .map()\n *\n *\n * ```html\n *\n * \n *
\n * \n * ```\n * @method map\n * @param {HTMLElement|String} id The div element or its id in which the map will be initialized.\n * @param {Object} [options] All the options that leaflet allows, as described here:\n * http://leafletjs.com/reference.html#map-options Additional options, which are TomTom specific are described\n * below.\n * @param {String} [options.key] This is an API key that can be obtained form http://developer.tomtom.com When the key\n * is passed on the map's initialization, it is set globally for all the services. It can be overwritten with the\n * tomtom.key method globally or per service with tomtom.<service_name>.key functions. It is also possible\n * to pass a specific key while working with instances of the services.\n * @param {String} [options.style] The base map style to be used. Should be set to one of the following values:\n * <'main', 'night'>. By default, the _main_ style is used.\n * @param {String} [options.layer] The base map's layer to be used. Should be set to one of the following values:\n * <'basic', 'hybrid', 'labels'>. By default, the _basic_ layer is used.\n * @param {Boolean|Object} [options.traffic] Allows to add L.TomTomTrafficLayer and L.TomTomTrafficIncidentsLayer to\n * the map. A value of this parameter can be set to an options object as described in the traffic layer\n * documentation. If traffic layers are added with this option, a mechanism for periodic refresh of the traffic\n * data is provided (using a proper traffic model id handling).\n * @param {Boolean} [options.traffic.noRefresh] Disables periodic updates of traffic layers.\n * @param {Boolean|Object} [options.trafficFlow] Allows to add L.TomTomTrafficFlowLayer to the map. A value of this\n * parameter can be set to the options object as described in the traffic flow layer documentation.\n * @param {Boolean} [options.noLabelsOnTop=false] If a traffic or traffic flow layer is overlayed on the map, then by\n * default, the labels layer is added on top of these layers. It prevents labels from being covered by the traffic\n * tubes or traffic flow. With this option, it is possible to disable this behaviour.\n * @return {map} Returns the Leaflet map object.\n */\ndefine('display/map',['require','leaflet','./svgIcon','./imagePath','./layers/tileLayer','./layers/trafficLayer','./layers/trafficFlowLayer','./layers/labelsLayer','security','services/copyrightCaption','./copyright'],function (require) {\n \"use strict\";\n\n var L = require(\"leaflet\"),\n svgIcon = require(\"./svgIcon\"),\n imagePath = require(\"./imagePath\");\n\n L.Map.mergeOptions({\n worldCopyJump: true\n });\n\n L.Control.Attribution.prototype.options = {\n position: \"bottomleft\",\n prefix: \"\"\n };\n\n L.Icon.Default = svgIcon;\n L.Icon.Default.imagePath = imagePath.get();\n L.Marker.mergeOptions({icon: new L.Icon.Default()});\n\n function isOlderThanIE11() {\n return window.navigator.userAgent.indexOf('MSIE ') > -1;\n }\n\n function initBaseLayer(map) {\n var baseMap = require(\"./layers/tileLayer\");\n\n if (!map.options.layers) {\n map.options.layers = [];\n map.options.layers.push(baseMap(map.options));\n }\n }\n\n function initTrafficLayer(map) {\n var traffic = require(\"./layers/trafficLayer\");\n\n\n if (map.options.traffic) {\n map.options.layers.push(traffic(map.options.traffic));\n }\n }\n\n function initTrafficFlowLayer(map) {\n var trafficFlow = require(\"./layers/trafficFlowLayer\");\n\n if (map.options.trafficFlow) {\n map.options.layers.push(trafficFlow(map.options.trafficFlow));\n }\n }\n\n function initLabelsLayers(map) {\n var labelsLayer = require(\"./layers/labelsLayer\");\n\n if (!map.options.noLabelsOnTop && !isOlderThanIE11()) {\n //This will not work on IE < 11 due to not supported CSS: pointer-events: none;\n map.options.layers.push(labelsLayer(map.options));\n }\n }\n\n function initHook() {\n var map = this,\n security = require(\"security\"),\n copyrightCaption = require(\"services/copyrightCaption\"),\n copyright = require(\"./copyright\");\n\n security.setKey(map.options.key);\n initBaseLayer(map);\n initTrafficLayer(map);\n initTrafficFlowLayer(map);\n initLabelsLayers(map);\n\n if (map.getZoom() === undefined) {\n map.setView([0, 0], 2);\n }\n if (!map.options.maxBounds) {\n map.setMaxBounds(L.latLngBounds([[-90, -18000], [90, 18000]]));\n }\n copyrightCaption().go(function (attribution) {\n map.attributionControl.addAttribution(\"\" + attribution + \"\");\n copyright.addTo(map);\n });\n }\n\n L.Map.addInitHook(initHook);\n\n return L;\n});\n","define('rest/geocode',[\"http\", \"./utils\", \"security\"],\n function (http, utils, security) {\n \"use strict\";\n\n var queryParamNames = [\n \"storeResult\", \"typeahead\", \"limit\", \"ofs\", \"lat\", \"lon\", \"countrySet\", \"radius\", \"topLeft\", \"btmRight\"\n ];\n\n return {\n geocode: function (options, callback) {\n var pathParams = {}, queryParams = {};\n\n pathParams.query = utils.required(options.query, \"\\\"query\\\" parameter is required for geocode service.\");\n queryParams.key = utils.or(options.key, security.getKey(\"services/search\"));\n\n var baseUrl = utils.or(options.baseUrl, \"{protocol}://api.tomtom.com/\");\n var serviceUrl = utils.or(options.serviceUrl, \"search/2/geocode/{query}.{contentType}\");\n\n utils.extractQueryParams(options, queryParams, queryParamNames);\n http.get({\n url: baseUrl + serviceUrl,\n pathParameters: pathParams,\n queryParameters: queryParams,\n callback: callback,\n callbackParam: \"callback\",\n fail: options.fail\n });\n }\n };\n }\n);\n","define('model/geocode/geocode',['../selector'], function (selector) {\n \"use strict\";\n return function (json) {\n return selector(json, \"results\", \"address, position, score, type, addressRanges, boundingBox\") || {};\n };\n});\n","/**\n * The geocoder implementation. Creates a new instance of service call.\n *\n * Parameters can be passed on creation or provided via convenient functions that can be chained.\n *\n * @class geocode\n */\ndefine('services/geocode',[\"rest/geocode\", \"model/geocode/geocode\", \"./chain\", \"./validators\", \"./converters\", \"./worldEdge\"],\n function (geocode, model, chain, validators, converters, worldEdge) {\n \"use strict\";\n\n var fields = {\n /**\n * A setter and getter for _'key'_ attribute. Key can be set globally when initializing map, with\n * tomtom.key\n * or tomtom.searchKey function.\n * But also per service instance on initialization or with this method.\n *\n * The API Key can be issued from http://developer.tomtom.com\n *\n * @method key\n * @chainable\n * @param {String} [key] key API Key valid for requested service.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geocode|String} Method returns the service instance allowing chaining or _key_ value if\n * argument is omitted.\n */\n key: {validator: validators.string},\n /**\n * A setter and getter for _'query'_ attribute.\n *\n * @method query\n * @chainable\n * @param {String} [query] Query string. Must be properly URL encoded.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geocode|String} Method returns the service instance allowing chaining or _query_ value if\n * argument is omitted.\n */\n query: {validator: validators.string, required: true},\n /**\n * A setter and getter for 'storeResult' attribute. If the _storeResult_ flag is set, the query will be\n * interpreted as a stored geocode and will be billed according to the terms of use. Default value is false\n *\n * @method storeResult\n * @chainable\n * @param {Boolean} [storeResult=false] Determines whether geocode service should be interpreted as a\n * stored geocode.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {geocode|Boolean} Method returns the service instance allowing chaining or _storeResult_ value\n * if argument is omitted.\n */\n storeResult: {validator: validators.bool},\n /**\n * A setter and getter for 'typeahead' attribute. If the _typeahead_ flag is set, the query will be\n * interpreted as a partial input and the search will enter predictive mode. Default value is false\n *\n * @method typeahead\n * @chainable\n * @param {Boolean} [typeahead=false] Defines whether geocode service should enter _predictive_ mode.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geocode|Boolean} Method returns the service instance allowing chaining or _typeahead_ value if\n * argument is omitted.\n */\n typeahead: {validator: validators.bool},\n /**\n * A setter and getter for _'limit'_ attribute. Maximum number of responses that will be returned.\n * Default value is 10.\n *\n * @method limit\n * @chainable\n * @param {integer} [limit=10] Maximum number of responses that will be returned.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geocode|integer} Method returns the service instance allowing chaining or _limit_ value if\n * argument is omitted.\n */\n limit: {validator: validators.positiveInteger},\n /**\n * A setter and getter for _'offset'_ attribute. Starting offset of the returned results within the full\n * result set. Default value is 0.\n *\n * @method offset\n * @chainable\n * @param {integer} [offset=0] Starting offset of the returned results within the full result set.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geocode|integer} Method returns the service instance allowing chaining or _offset_ value\n * if argument is omitted.\n */\n offset: {validator: validators.naturalInteger, name: \"ofs\"},\n /**\n * A setter and getter for _'boundingBox'_ attribute. The bounding box of the area which user\n * wants to search on. It can be omitted, then whole world is taken into consideration.\n *\n * Bounding box can exceed world boundaries (-180, -90, 180, 90) it is not an issue. The service will\n * internally normalize it by overwriting any exceeding value with maximal or minimal allowed.\n * Longitude will be recalculated to fit the allowed range, if bounding box includes edge of the world\n * it will be split into two bounding boxes and the response will contain merged results for both areas.\n *\n * The service is able to convert a number of popular formats into the bounding box.\n * Supported formats are listed below:\n * * _{minLon: 0, minLat: 0, maxLon: 1, maxLat: 1}_ // plain object with minLon, minLat, maxLon, maxLat\n * fields\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _[0, 0, 1, 1]_ // array of numbers containing in order minLon, minLat, maxLon, maxLat\n * * _ol.Extent_ // open layers extend object\n * * _[ol.Coordinate, ol.Coordinate]_ // array of two open layers coordinate objects in order southWest,\n * northEast\n * * _[[0, 0], [1, 1]]_ // array of two arrays (southWest, northEast) with latitude and longitude values\n * * _\"0,0,1,1\"_ // comma seperated string of number values minLon, minLat, maxLon, maxLat\n * * _[{lon: 0, lat: 0},{lon: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lon fields\n * * _[{lng: 0, lat: 0},{lng: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lng fields\n * * _[L.latLng(...), L.latLng(...)]_ // array of southWest and northEast leaflet latLng objects\n * * _google.maps.LatLngBounds_ // Google Maps bounds object\n * * _google.maps.LatLngBoundsLiteral_ // Google Maps bounds object\n * * _[LatLng, LatLng]_ // array of two google.maps.LatLng\n * * _[LatLngLiteral, LatLngLiteral]_ // array of two google.maps.LatLngLiteral\n *\n * @method boundingBox\n * @chainable\n * @param {Object|Array|String} [boundingBox] The bounding box of the area that search is supposed to\n * search on.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or converted bounding box\n * value if argument is omitted.\n */\n boundingBox: {validator: validators.boundingBox, converter: converters.boundingBox},\n /**\n * A setter and getter for _'center'_ attribute. This attribute allows to bias the search results.\n *\n * Supplying only that attribute - without _radius_ parameter - will bias search results only to\n * that area.\n *\n * The service is able to convert a number of popular formats into the point.\n * Supported formats are listed below:\n * * _[0, 0]_ // array of latitude and longitude\n * * _\"0,1\"_ // string of latitude and longitude, divided by comma\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _{lat: function() {...}, lng: function() {...}}_ // object with two functions returning latitude and\n * longitude\n * * _{lat: 0, lon: 1}_ // object with two properties: latitude and longitude\n * * _{x: 0, y: 1}_ // object with two properties: x as latitude and y as longitude\n * * _{latitude: 0, longitude: 1}_ // object with two properties: latitude and longitude\n *\n * @method center\n * @chainable\n * @param {Point} [center] Point with latitude and longitude data.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Point} Method returns the service instance allowing chaining or _center_ value\n * if argument is omitted.\n */\n center: {converter: converters.point, validator: validators.point},\n /**\n * A setter and getter for _'countrySet'_ attribute.\n * Comma separated string of country codes (e.g.: FR,ES). This will limit the search to the specified\n * countries.\n *\n * @method countrySet\n * @chainable\n * @param {String} [countrySet] List of country codes, divided by commas.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geocode|String} Method returns the service instance allowing chaining or _countrySet_ value\n * if argument is omitted.\n */\n countrySet: {validator: validators.countrySet},\n /**\n * A setter and getter for _'radius'_ attribute.\n * If radius and position are set, the results will be constrained to the defined area. The radius parameter\n * is specified in meters.\n *\n * @method radius\n * @chainable\n * @param {integer} [radius] Radius value specified in meters.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geocode|integer} Method returns the service instance allowing chaining or _radius_ value\n * if argument is omitted.\n */\n radius: {validator: validators.naturalInteger},\n /**\n * A setter and getter for _'best result'_ option. It makes the service return only one, best match result.\n * This option overwrites both limit and offset parameters. It changes the response from array to single\n * result. Default value is false.\n *\n * @method bestResult\n * @chainable\n * @param {Boolean} [bestResult] Defines whether geocode service should return the best result.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geocode|Boolean} Method returns the service instance allowing chaining or _bestResult_ value\n * if argument is omitted.\n */\n bestResult: {validator: validators.bool},\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geocode|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n protocol: {validator: validators.oneOfValue([\"http\", \"https\"], \"protocol\")},\n baseUrl: {validator: validators.string},\n serviceUrl: {validator: validators.string}\n };\n\n /**\n * The function performing actual call to the web service. This method can be executed multiple times, it is\n * not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * // this is optional if you passed global key earlier\n * tomtom.searchKey();\n * var geocode = tomtom.geocode().query('Amsterdam').go(myFunction);\n * ```\n */\n /**\n * A setter and getter for callback function. This function is called after receiving successful response from\n * service. It takes one argument which is the response - JSON described in go() function documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {geocode} Method returns the service instance allowing chaining or function if argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {geocode|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n function addBoundingBoxParameters(data, boundingBox) {\n data.topLeft = [boundingBox.maxLat, boundingBox.minLon];\n data.btmRight = [boundingBox.minLat, boundingBox.maxLon];\n return data;\n }\n\n function callbackBestResult(bestResult, callback) {\n return function (response) {\n callback(bestResult ? response[0] : response);\n };\n }\n\n function handleChain(data, callback) {\n var bestResult = !!data.bestResult;\n if (bestResult) {\n data.limit = 1;\n data.offset = 0;\n }\n data.bestResult = null;\n if (data.center) {\n data.center = data.center.split(\",\");\n data.lat = data.center[0];\n data.lon = data.center[1];\n delete data.center;\n }\n worldEdge(geocode.geocode, model, data, callbackBestResult(bestResult, callback), addBoundingBoxParameters);\n }\n\n /**\n *\n * @method geocode\n *\n * @param {Object} [options] Options to be passed to the geocode call.\n * @param {String} [options.key] The API Key issued from http://developer.tomtom.com.\n * @param {String} [options.query] Query string. Must be properly URL encoded.\n * @param {Boolean} [options.storeResult] If the \"storeResult\" flag is set, the query will be interpreted as a\n * stored geocode and will be billed according to the terms of use.\n * @param {Boolean} [options.typeahead] If the \"typeahead\" flag is set, the query will be interpreted as a\n * partial input and the search will enter predictive mode.\n * @param {Integer} [options.limit] Maximum number of responses that will be returned.\n * @param {Integer} [options.offset] Starting offset of the returned results within the full result set.\n * @param {Point} [options.center] Point of center where results should be biased.\n * @param {String} [options.countrySet] Comma separated string of country codes (e.g.: FR,ES). This will limit\n * the search to the specified countries.\n * @param {Integer} [options.radius] If radius and position are set, the results will be constrained to the\n * defined area. The radius parameter is specified in meters.\n * @param {Object|Array|String} [options.boundingBox] Area (two points with latitude and longitude) that search\n * will look for results onto.\n * @param {Boolean} [options.bestResult] If the \"bestResult\" flag is set, service responses with single (best\n * match) result.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @param {Function} [options.fail] The callback function to be called on failure.\n * @param {Function} [options.callback] Specifies the callback method.\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * tomtom.geocoder.key(); // this is optional if you passed global key earlier\n * var geocoder = tomtom.geocode()\n * .query('Amsterdam, The Netherlands')\n * .callback(myFunction).go();\n * ```\n */\n return function (options) {\n return chain(fields, handleChain, options);\n };\n });\n","define('rest/structuredGeocode',['http', './utils', \"security\"],\n function (http, utils, security) {\n \"use strict\";\n\n var queryParamNames = [\n 'limit', 'ofs', 'streetNumber', 'streetName', 'crossStreet', 'municipality', 'municipalitySubdivision',\n 'countryTertiarySubdivision', 'countrySecondarySubdivision', 'countrySubdivision', 'postalCode'\n ];\n\n return {\n structuredGeocode: function (options, callback) {\n var pathParams = {}, queryParams = {};\n\n // Required: \"countryCode\" param\n queryParams.countryCode = utils.required(options.countryCode, \"\\\"countryCode\\\" parameter is required for structuredGeocode service.\");\n\n // if an API key is specified, include it\n // an API key can be omitted if an API proxy is being used\n queryParams.key = utils.or(options.key, security.getKey(\"services/search\"));\n\n utils.extractQueryParams(options, queryParams, queryParamNames);\n\n var baseUrl = utils.or(options.baseUrl, \"{protocol}://api.tomtom.com/\");\n var serviceUrl = utils.or(options.serviceUrl, \"search/2/structuredGeocode.{contentType}\");\n\n http.get({\n url: baseUrl + serviceUrl,\n pathParameters: pathParams,\n queryParameters: queryParams,\n callback: callback,\n callbackParam: \"callback\",\n fail: options.fail\n });\n }\n };\n }\n);\n","/**\n * The structured geocode implementation. Creates a new instance of service call.\n *\n * Parameters can be passed on creation or provided via convenient functions that can be chained.\n *\n * The method go() performs the actual call. The call is asynchronous therefore user needs to pass callback function.\n *\n * @class structuredGeocode\n */\ndefine('services/structuredGeocode',[\"rest/structuredGeocode\", \"model/geocode/geocode\", \"./chain\", \"./validators\"],\n function (structuredGeocode, model, chain, validators) {\n \"use strict\";\n\n var fields = {\n /**\n * A setter and getter for _'key'_ attribute. Key can be set globally when initializing map, with\n * tomtom.key or tomtom.searchKey function.\n * But also per service instance on initialization or with this method.\n *\n * The API Key can be issued from http://developer.tomtom.com.\n *\n * @method key\n * @chainable\n * @param {String} [key] key API Key valid for requested service.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _key_ value if\n * argument is omitted.\n */\n key: {validator: validators.string},\n /**\n * A setter and getter for required _'countryCode'_ attribute. Represents 2 or 3 letter country code\n * (e.g.: FR, ES).\n *\n * @method countryCode\n * @chainable\n * @param {String} [countryCode] 2 or 3 letter country code.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _countryCode_\n * value if argument is omitted.\n */\n countryCode: {validator: validators.countryCode, required: true},\n /**\n * A setter and getter for _'limit'_ attribute. Maximum number of responses that will be returned.\n * Default value is 10.\n *\n * @method limit\n * @chainable\n * @param {integer} [limit=10] Maximum number of responses that will be returned.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|integer} Method returns the service instance allowing chaining or _limit_ value if\n * argument is omitted.\n */\n limit: {validator: validators.limit},\n /**\n * A setter and getter for _'offset'_ attribute. Represents starting offset of the returned results within the full\n * result set. Default value is 0.\n *\n * @method offset\n * @chainable\n * @param {integer} [offset=0] Starting offset of the returned results within the full result set.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|integer} Method returns the service instance allowing chaining or _offset_ value\n * if argument is omitted.\n */\n offset: {validator: validators.naturalInteger, name: \"ofs\"},\n /**\n * A setter and getter for _'streetNumber'_ attribute. Means street number for the structured address.\n *\n * @method streetNumber\n * @chainable\n * @param {String} [streetNumber] The street number for the structured address.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _streetNumber_\n * value if argument is omitted.\n */\n streetNumber: {validator: validators.string},\n /**\n * A setter and getter for _'streetName'_ attribute. Represents street name for the structured address.\n *\n * @method streetName\n * @chainable\n * @param {String} [streetName] The street name for the structured address.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _streetName_\n * value if argument is omitted.\n */\n streetName: {validator: validators.string},\n /**\n * A setter and getter for _'crossStreet'_ attribute. Represents cross street name for the structured address.\n *\n * @method crossStreet\n * @chainable\n * @param {String} [crossStreet] The cross street name for the structured address.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _crossStreet_\n * value if argument is omitted.\n */\n crossStreet: {validator: validators.string},\n /**\n * A setter and getter for _'municipality'_ attribute. Represents municipality (city/town) for the\n * structured address.\n *\n * @method municipality\n * @chainable\n * @param {String} [municipality] The municipality (city/town) for the structured address.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _municipality_\n * value if argument is omitted.\n */\n municipality: {validator: validators.string},\n /**\n * A setter and getter for _'municipalitySubdivision'_ attribute. Represents municipality subdivision\n * (sub/super city) for the structured address.\n *\n * @method municipalitySubdivision\n * @chainable\n * @param {String} [municipalitySubdivision] The municipality subdivision (sub/super city) for the structured address.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _municipalitySubdivision_\n * value if argument is omitted.\n */\n municipalitySubdivision: {validator: validators.string},\n /**\n * A setter and getter for _'countryTertiarySubdivision'_ attribute. Represents named area for the structured\n * address.\n *\n * @method countryTertiarySubdivision\n * @chainable\n * @param {String} [countryTertiarySubdivision] The named area for the structured address.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _countryTertiarySubdivision_\n * value if argument is omitted.\n */\n countryTertiarySubdivision: {validator: validators.string},\n /**\n * A setter and getter for _'countrySecondarySubdivision'_ attribute. Represents country for the structured\n * address.\n *\n * @method countrySecondarySubdivision\n * @chainable\n * @param {String} [countrySecondarySubdivision] The country for the structured address.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _countrySecondarySubdivision_\n * value if argument is omitted.\n */\n countrySecondarySubdivision: {validator: validators.string},\n /**\n * A setter and getter for _'countrySubdivision'_ attribute. Represents state or province for the structured\n * address.\n *\n * @method countrySubdivision\n * @chainable\n * @param {String} [countrySubdivision] The state or province for the structured address.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _countrySubdivision_\n * value if argument is omitted.\n */\n countrySubdivision: {validator: validators.string},\n /**\n * A setter and getter for _'postalCode'_ attribute. Represents zip code or postal code for the structured\n * address.\n *\n * @method postalCode\n * @chainable\n * @param {String} [postalCode] The zip code or postal code for the structured address.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _postalCode_\n * value if argument is omitted.\n */\n postalCode: {validator: validators.string},\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n protocol: {validator: validators.oneOfValue([\"http\", \"https\"], \"protocol\")},\n /**\n * A setter and getter for _'best result'_ option. It makes the service return only one, best match result.\n * This option overwrites both limit and offset parameters. It changes the response from array to single\n * result. Default value is false.\n *\n * @method bestResult\n * @chainable\n * @param {Boolean} [bestResult] Defines whether structured geocode service should return the best result.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {structuredGeocode|Boolean} Method returns the service instance allowing chaining or _bestResult_\n * value if argument is omitted.\n */\n bestResult: {validator: validators.bool},\n baseUrl: {validator: validators.string},\n serviceUrl: {validator: validators.string}\n };\n\n /**\n * The function performing actual call to the web service. This method can be executed multiple times, it is\n * not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * // this is optional if you passed global key earlier\n * tomtom.searchKey();\n * var structuredGeocode = tomtom.structuredGeocode().countryCode('GB').go(myFunction);\n * ```\n */\n /**\n * A setter and getter for callback function. This function is called after receiving successful response from\n * service. It takes one argument which is the response - JSON described in go() function documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {structuredGeocode} Method returns the service instance allowing chaining or function if argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {structuredGeocode|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n\n function checkBestResult(data) {\n var result = !!data.bestResult;\n delete data.bestResult;\n return result;\n }\n\n function handleChain(data, callback) {\n var bestResult = checkBestResult(data);\n if (bestResult) {\n data.limit = 1;\n data.offset = 0;\n }\n structuredGeocode.structuredGeocode(data, function (response) {\n if (bestResult) {\n callback.call(this, model(response)[0]);\n } else {\n callback.call(this, model(response));\n }\n });\n }\n\n /**\n * @function structuredGeocode\n *\n * @param {Object} [options] Options to be passed to the structured geocode call.\n * @param {String} [options.key] The API Key issued from http://developer.tomtom.com.\n * @param {String} [options.countryCode] 2 or 3 letter country code (e.g.: FR, ES).\n * @param {Integer} [options.limit] Maximum number of responses that will be returned.\n * @param {Integer} [options.offset] Starting offset of the returned results within the full result set.\n * @param {String} [options.streetNumber] The street number for the structured address.\n * @param {String} [options.streetName] The street name for the structured address.\n * @param {String} [options.crossStreet] The cross street name for the structured address.\n * @param {String} [options.municipality] The municipality (city/town) for the structured address.\n * @param {String} [options.municipalitySubdivision] The municipality subdivision (sub/super city) for the structured\n * address.\n * @param {String} [options.countryTertiarySubdivision] The named area for the structured address.\n * @param {String} [options.countrySecondarySubdivision] The county for the structured address.\n * @param {String} [options.countrySubdivision] The state or province for the structured address.\n * @param {String} [options.postalCode] The zip code or postal code for the structured address.\n * @param {Boolean} [options.bestResult] If the \"bestResult\" flag is set, service responses with single (best\n * match) result.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @param {Function} [options.callback] Specifies the callback method. Only used where format is jsonp.\n * @param {Function} [options.fail] The callback function to be called on failure.\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var structuredGeocode = tomtom.structuredGeocode()\n * .countryCode('GB')\n * .callback(myFunction).go();\n * ```\n */\n return function (options) {\n return chain(fields, handleChain, options);\n };\n });\n","define('rest/reverseGeocode',[\"http\", \"./utils\", \"security\"],\n function (http, utils, security) {\n \"use strict\";\n\n var queryParamNames = [\n \"spatialKeys\", \"returnSpeedLimit\", \"heading\", \"radius\", \"streetNumber\", \"returnRoadUse\", \"roadUse\"\n ];\n\n return {\n reverseGeocode: function (options, callback) {\n var pathParams = {}, queryParams = {};\n\n // Required parameter: position\n pathParams.position = utils.required(options.position, \"\\\"position\\\" parameter is required for reverseGeocode service.\");\n\n // if an API key is specified, include it\n // an API key can be omitted if an API proxy is being used\n queryParams.key = utils.or(options.key, security.getKey(\"services/search\"));\n pathParams.type = utils.required(options.type, \"Missing type definition in Search service\");\n\n // optional parameters (spatialKeys, returnSpeedLimit, heading, radius, streetNumber, returnRoadUse,\n // roadUse) look for optional passed params and set them if they are not undefined\n utils.extractQueryParams(options, queryParams, queryParamNames);\n\n var baseUrl = utils.or(options.baseUrl, \"{protocol}://api.tomtom.com/\");\n var serviceUrl = utils.or(options.serviceUrl, \"search/2/{type}/{position}.{contentType}\");\n\n http.get({\n url: baseUrl + serviceUrl,\n pathParameters: pathParams,\n queryParameters: queryParams,\n callback: callback,\n callbackParam: \"callback\",\n fail: options.fail\n });\n }\n };\n }\n);\n\n","define('model/reverseGeocode/reverseGeocode',['../selector'], function (selector) {\n \"use strict\";\n return function (json) {\n return selector(json, \"addresses\");\n };\n});\n","define('services/reverseGeocode/reverseGeocodeBase',[\"rest/reverseGeocode\", \"model/reverseGeocode/reverseGeocode\", \"../chain\", \"../validators\", \"../converters\",\n \"../utils\"], function (reverseGeocode, model, chain, validators, converters, utils) {\n \"use strict\";\n\n var TYPES = {\n reverseGeocode: \"reverseGeocode\",\n crossStreetLookup: \"reverseGeocode/crossStreet\"\n }, fields = {\n key: {\n validator: validators.string\n },\n position: {\n converter: converters.point,\n validator: validators.point,\n required: true\n },\n spatialKeys: {\n validator: validators.bool\n },\n heading: {\n validator: validators.number\n },\n radius: {validator: validators.naturalInteger},\n protocol: {validator: validators.oneOfValue([\"http\", \"https\"], \"protocol\")},\n baseUrl: {validator: validators.string},\n serviceUrl: {validator: validators.string}\n };\n\n function ReverseGeocodeBase(options) {\n this.options = options;\n this.defaultFields = utils.clone(fields);\n this.fields = {};\n }\n\n ReverseGeocodeBase.prototype.TYPE = TYPES;\n ReverseGeocodeBase.prototype.construct = function () {\n var mergedFields = utils.addFields.call(this, this.fields);\n return chain.call(this, mergedFields, this.handleChain, this.options);\n };\n ReverseGeocodeBase.prototype.handleChain = function (data, callback) {\n reverseGeocode.reverseGeocode(data, function (response) {\n callback.call(this, model(response)[0]);\n });\n };\n\n function reverseGeocodeConstructor(options) {\n return (new ReverseGeocodeBase(options)).construct();\n }\n\n reverseGeocodeConstructor.prototype.constructor = ReverseGeocodeBase;\n\n return reverseGeocodeConstructor;\n});\n\n","/**\n * Reverse geocode service implementation. It allows to convert the geographical coordinates into textual address\n * representation.\n *\n * The tomtom.reverseGeocode() method creates a new instance of service. Parameters can be passed on creation or\n * provided via convenient functions that can be chained. The method go() performs the actual call.\n *\n * The call is asynchronous therefore user have two options to handle response, either by passing callback function or\n * by using [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). The\n * SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class reverseGeocode\n */\ndefine('services/reverseGeocode/reverseGeocode',[\"./reverseGeocodeBase\", \"../validators\", \"../converters\"], function (reverseGeocodeBase, validators, converters) {\n \"use strict\";\n\n var reverseGeocodeBasePrototype = reverseGeocodeBase.prototype.constructor;\n\n\n function ReverseGeocode(options) {\n reverseGeocodeBasePrototype.call(this, options);\n\n this.fields.type = {\n defaultValue: this.TYPE.reverseGeocode,\n visible: false\n };\n\n /**\n * A setter and getter for 'returnSpeedLimit' attribute. Allows, if possible, to receive the speed limit\n * information at given location.\n *\n * @method returnSpeedLimit\n * @chainable\n * @param {Boolean|String|integer} [returnSpeedLimit] To enable return of the posted speed limit (where\n * available). Given value will get converted to boolean.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {reverseGeocode|Boolean} Method returns the service instance allowing chaining or converted\n * returnSpeedLimit value if argument is omitted.\n */\n this.fields.returnSpeedLimit = {\n validator: validators.bool\n };\n\n /**\n * A setter and getter for 'streetNumber' attribute. Allowing to extract more precise information regarding\n * the address to lookup.\n *\n * @method streetNumber\n * @chainable\n * @param {String} [streetNumber] If a street number is sent in along with the request, the response may\n * include the side of the street (Left/Right) and also an offset position for that street number.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {reverseGeocode|String} Method returns the service instance allowing chaining or street number\n * value if argument is omitted.\n */\n this.fields.streetNumber = {\n validator: validators.string\n };\n /**\n * A setter and getter for 'returnRoadUse' attribute. Allows, if possible, to receive the speed limit\n * information at given location.\n *\n * @method returnRoadUse\n * @chainable\n * @param {Boolean|String|integer} [returnRoadUse] To enable return of the road use array for reverse\n * geocoder at street level.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {reverseGeocode|Boolean} Method returns the service instance allowing chaining or converted\n * returnSpeedLimit value if argument is omitted.\n */\n this.fields.returnRoadUse = {\n validator: validators.bool\n };\n /**\n * A setter and getter for 'roadUse' attribute. Restricts the service response to one or many road use\n * from: LimitedAccess, Arterial, Terminal, Ramp, Rotary, LocalStreet.\n *\n * @method roadUse\n * @chainable\n * @param {Array|String} [roadUse] To restrict reverse geocoder to a certain type of roadUse. The road use\n * array for reverse geocoder can be one or more of: LimitedAccess, Arterial, Terminal, Ramp, Rotary,\n * LocalStreet. Array of strings or comma separated string is accepted.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {reverseGeocode|String} Method returns the service instance allowing chaining or converted\n * roadUse value if argument is omitted.\n */\n this.fields.roadUse = {\n converter: converters.roadUse,\n validator: validators.roadUse\n };\n /**\n * A setter and getter for _'key'_ attribute. Key can be set globally when initializing map, with\n * tomtom.key or tomtom.{service}.key function. But also per service instance on initialization or\n * with this method.\n *\n * @method key\n * @chainable\n * @param {String} key API Key valid for requested service.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {service|String} Method returns the service instance allowing chaining or key value if\n * argument is omitted.\n */\n /**\n * A setter and getter for 'position' attribute. The lon, lat location to be reverse geocoded. Among others\n * Leaflet and OpenLayers objects can be passed as argument. Following input types are allowed:\n * * array of two float values: first as latitude and second as longitude, for example [43.71,-72.48]\n * * array of two string values: first as latitude and second as longitude, for example ['43.71','-72.48']\n * * string, that contains two float values divided by comma, for example '43.71,-72.48'\n * * object, that contains two properties: _lat_ as latitude and _lon_ as longitude\n * * object, that contains two properties: _latitude_ and _longitude_\n * * Leaflet LatLng object or google.maps.LatLngLiteral, that contains two properties: _lat_ and _lng_\n * * google.maps.LatLng object, that contains two methods: _lat_ and _lng_\n *\n * @method position\n * @chainable\n * @param {String|Array|Object} [position] This is the specified longitude and latitude of the location\n * that address is supposed to be found.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {service|String} Method returns the service instance allowing chaining or converted\n * position value if argument is omitted.\n */\n /**\n * A setter and getter for 'spatialKeys' attribute. Enhance, if possible, response with a proprietary\n * geo-spatial key information.\n *\n * @method spatialKeys\n * @chainable\n * @param {Boolean|String|integer} [spatialKeys] If the \"spatialKeys\" flag is set, the response will also\n * contain a proprietary geo-spatial key information for a specified location. Given value will get\n * converted to boolean.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {service|Boolean} Method returns the service instance allowing chaining or converted\n * returnSpeedLimit value if argument is omitted.\n */\n /**\n * A setter and getter for 'heading' attribute. Makes possible to get address information of road keeping\n * in mind direction\n *\n * @method heading\n * @chainable\n * @param {float|String} [heading] The directional heading of the vehicle in degrees, for travel along a\n * segment of roadway. 0 is North, 90 is East and so on, values range from -360 to 360. The precision\n * can include upto one decimal place.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {service|float} Method returns the service instance allowing chaining or converted\n * heading value if argument is omitted.\n */\n /**\n * A setter and getter for 'radius' attribute. The maximal distance in meters from the specified position\n * for the service to consider.\n *\n * @method radius\n * @chainable\n * @param {integer|String} [radius] A positive (>0) integer with maximum distance in meters from the\n * specified position for the service to consider.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {service|integer} Method returns the service instance allowing chaining or converted\n * radius value if argument is omitted.\n */\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {service|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n }\n\n /**\n * A setter and getter for callback function. This function is called after receiving successful response from\n * service. It takes one argument which is the response - JSON described in go() function documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {service|Function} Method returns the service instance allowing chaining or function if\n * argument is omitted.\n */\n /**\n * A setter and getter for fail callback function. This function is called after unsuccessful response from\n * service or communication error. It takes one argument which is the error description.\n *\n * If callback function is not passed and promise is used to handle the response this parameter is ignored.\n * When using promise errors can be handled i.e. whit second attribute of then() method or catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n *\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on failure. By default error is logged on\n * console and thrown.\n * @throws {TypeError} if the given argument is not a function\n * @return {service|Function} Method returns the service instance allowing chaining or function if\n * argument is omitted.\n */\n /**\n * The function performing actual call to the web service. This method can be executed multiple times, it is\n * not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * The final response from service is a JSON object with the following structure:\n *\n * ```javascript\n *\n * {\n * address: {\n * buildingNumber: 19,\n * streetNumber: 19,\n * landmark: \"\",\n * street: \"N 2nd St\",\n * streetName: \"N 2nd St\",\n * streetNameAndNumber: \"\",\n * speedLimit: \"\",\n * countryCode: \"US\",\n * countrySubdivision: \"CA\",\n * countrySecondarySubdivision: \"Santa Clara\",\n * countryTertiarySubdivision: \"\",\n * municipality: \"San Jose\",\n * postalCode: \"95113\",\n * municipalitySubdivision: \"San Francisco Bay Area\",\n * freeformAddress: \"19 N 2nd St, San Jose, CA, 95113\"\n * },\n * position: \"37.337083, -121.8898\",\n * roadUse: [\"LocalStreet\"]\n * }\n * ```\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n *\n * @example\n * ```javascript\n * var myFunction = function(result) { console.log(result); };\n * // this is optional if you passed global key earlier\n * tomtom.searchKey();\n * var reverseGeocode = tomtom.reverseGeocode().position('43.71,-72.48').go(myFunction);\n * ```\n */\n /**\n * The method to instantiates the service. The options can be passed on creation or later during the execution\n * using function with the name matching parameter name. Each option can be retrieved using the exactly same\n * function but without parameter. The instance of service can be reused by calling multiple times go()\n * function.\n *\n * @method reverseGeocode\n * @param {Object} [options] Options to be passed to the reverseGeocode call.\n * @param {String|Array|Object} [options.position] This is the specified longitude and latitude of the location\n * that address is supposed to be found. The possible inputs are explained with position function.\n * @param {String} [options.key] API Key valid for requested service.\n * @param {Boolean} [options.spatialKeys=false] If the \"spatialKeys\" flag is set, the response will also\n * contain a proprietary geo-spatial key information for a specified location.\n * @param {Boolean} [options.returnSpeedLimit=false] To enable return of the posted speed limit (where\n * available).\n * @param {float} [options.heading] The directional heading of the vehicle in degrees, for travel along a\n * segment of roadway. 0 is North, 90 is East and so on, values range from -360 to 360. The precision can\n * include upto one decimal place.\n * @param {integer} [options.radius=10000] The maximum distance in meters from the specified position for the\n * reverse geocode to consider.\n * @param {String} [options.streetNumber] If a street number is sent in along with the request, the response\n * may include the side of the street (Left/Right) and also an offset position for that street number.\n * @param {Boolean} [options.returnRoadUse=false] To enable return of the road use array for reverse geocoder\n * at street level.\n * @param {Array|String} [options.roadUse] To restrict reverse geocoder to a certain type of roadUse. The road\n * use array for reverse geocoder can be one or more of: LimitedAccess, Arterial, Terminal, Ramp, Rotary,\n * LocalStreet.\n * @param {Function} [options.fail=default] The callback function to be called on failure. By default error is\n * logged on console and thrown.\n * @param {Function} [options.callback] The callback function to be called on success.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @throws {TypeError} if any of the given parameter cannot be converted to a valid value\n * @return {reverseGeocode} Method returns new object that allows communication with the service.\n *\n * @example\n * ```javascript\n *\n * tomtom.reverseGeocode().position('51.759,19.449').go().then(function(response) {\n * console.log(response);\n * });\n * ```\n */\n ReverseGeocode.prototype = new reverseGeocodeBasePrototype();\n ReverseGeocode.prototype.constructor = ReverseGeocode;\n\n return function (options) {\n return (new ReverseGeocode(options)).construct();\n };\n});\n\n","/**\n * Cross street lookup service implementation. It allows to convert the geographical coordinates into textual address\n * representation.\n *\n * The tomtom.crossStreetLookup() method creates a new instance of service. Parameters can be passed on creation or\n * provided via convenient functions that can be chained. The method go() performs the actual call.\n *\n * The call is asynchronous therefore user have two options to handle response, either by passing callback function or\n * by using [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). The\n * SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class crossStreetLookup\n */\ndefine('services/reverseGeocode/crossStreetLookup',[\"./reverseGeocodeBase\", \"../validators\"], function (reverseGeocodeBase, validators) {\n \"use strict\";\n\n var reverseGeocodeBasePrototype = reverseGeocodeBase.prototype.constructor;\n\n function CrossStreetLookup(options) {\n reverseGeocodeBasePrototype.call(this, options);\n\n this.fields.type = {\n defaultValue: this.TYPE.crossStreetLookup,\n visible: false\n };\n\n /**\n * A setter and getter for _'limit'_ attribute. Represents maximum number of responses that will be\n * returned.\n *\n * Maximum value is 100.\n *\n * @method limit\n * @chainable\n * @param {integer} [limit=10] Maximum number of responses that will be returned.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {CrossStreetLookup|integer} Method returns the service instance allowing chaining or _limit_ value\n * if argument is omitted.\n */\n this.fields.limit = {\n validator: validators.limit\n };\n /**\n * A setter and getter for _'key'_ attribute. Key can be set globally when initializing map, with\n * tomtom.key or tomtom.{service}.key function. But also per service instance on initialization or\n * with this method.\n *\n * @method key\n * @chainable\n * @param {String} key API Key valid for requested service.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {service|String} Method returns the service instance allowing chaining or key value if\n * argument is omitted.\n */\n /**\n * A setter and getter for 'position' attribute. The lon, lat location to be reverse geocoded. Among others\n * Leaflet and OpenLayers objects can be passed as argument. Following input types are allowed:\n * * array of two float values: first as latitude and second as longitude, for example [43.71,-72.48]\n * * array of two string values: first as latitude and second as longitude, for example ['43.71','-72.48']\n * * string, that contains two float values divided by comma, for example '43.71,-72.48'\n * * object, that contains two properties: _lat_ as latitude and _lon_ as longitude\n * * object, that contains two properties: _latitude_ and _longitude_\n * * Leaflet LatLng object or google.maps.LatLngLiteral, that contains two properties: _lat_ and _lng_\n * * google.maps.LatLng object, that contains two methods: _lat_ and _lng_\n *\n * @method position\n * @chainable\n * @param {String|Array|Object} [position] This is the specified longitude and latitude of the location\n * that address is supposed to be found.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {service|String} Method returns the service instance allowing chaining or converted\n * position value if argument is omitted.\n */\n /**\n * A setter and getter for 'spatialKeys' attribute. Enhance, if possible, response with a proprietary\n * geo-spatial key information.\n *\n * @method spatialKeys\n * @chainable\n * @param {Boolean|String|integer} [spatialKeys] If the \"spatialKeys\" flag is set, the response will also\n * contain a proprietary geo-spatial key information for a specified location. Given value will get\n * converted to boolean.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {service|Boolean} Method returns the service instance allowing chaining or converted\n * returnSpeedLimit value if argument is omitted.\n */\n /**\n * A setter and getter for 'heading' attribute. Makes possible to get address information of road keeping\n * in mind direction\n *\n * @method heading\n * @chainable\n * @param {float|String} [heading] The directional heading of the vehicle in degrees, for travel along a\n * segment of roadway. 0 is North, 90 is East and so on, values range from -360 to 360. The precision\n * can include upto one decimal place.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {service|float} Method returns the service instance allowing chaining or converted\n * heading value if argument is omitted.\n */\n /**\n * A setter and getter for 'radius' attribute. The maximal distance in meters from the specified position\n * for the service to consider.\n *\n * @method radius\n * @chainable\n * @param {integer|String} [radius] A positive (>0) integer with maximum distance in meters from the\n * specified position for the service to consider.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {service|integer} Method returns the service instance allowing chaining or converted\n * radius value if argument is omitted.\n */\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {service|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n }\n\n /**\n * A setter and getter for callback function. This function is called after receiving successful response from\n * service. It takes one argument which is the response - JSON described in go() function documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {service|Function} Method returns the service instance allowing chaining or function if\n * argument is omitted.\n */\n /**\n * A setter and getter for fail callback function. This function is called after unsuccessful response from\n * service or communication error. It takes one argument which is the error description.\n *\n * If callback function is not passed and promise is used to handle the response this parameter is ignored.\n * When using promise errors can be handled i.e. whit second attribute of then() method or catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n *\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on failure. By default error is logged on\n * console and thrown.\n * @throws {TypeError} if the given argument is not a function\n * @return {service|Function} Method returns the service instance allowing chaining or function if\n * argument is omitted.\n */\n /**\n * The function performing actual call to the web service. This method can be executed multiple times, it is\n * not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * The final response from service is a JSON object with the following structure:\n *\n * ```javascript\n *\n * {\n * address: {\n * buildingNumber: 19,\n * streetNumber: 19,\n * street: \"N 2nd St\",\n * streetName: \"N 2nd St\",\n * crossStreet: \"E SANTA CLARA ST\"\n * streetNameAndNumber: \"\",\n * speedLimit: \"\",\n * countryCode: \"US\",\n * countrySubdivision: \"CA\",\n * countrySecondarySubdivision: \"Santa Clara\",\n * countryTertiarySubdivision: \"\",\n * municipality: \"San Jose\",\n * postalCode: \"95113\",\n * municipalitySubdivision: \"San Francisco Bay Area\",\n * freeformAddress: \"E SANTA CLARA ST & N 2nd St, San Jose, CA, 95113\"\n * },\n * position: \"37.337083, -121.8898\"\n * }\n * ```\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * // this is optional if you passed global key earlier\n * tomtom.crossStreetLookup.key();\n * var crossStreetLookup =\n * tomtom.crossStreetLookup().position('43.71,-72.48').go(myFunction);\n * ```\n */\n /**\n * The method to instantiates the service. The options can be passed on creation or later during the execution\n * using function with the name matching parameter name. Each option can be retrieved using the exactly same\n * function but without parameter. The instance of service can be reused by calling multiple times go()\n * function.\n *\n * @method crossStreetLookup\n * @param {Object} [options] Options to be passed to the crossStreetLookup call.\n * @param {String|Array|Object} [options.position] This is the specified longitude and latitude of the location\n * that address is supposed to be found. The possible inputs are explained with position function.\n * @param {String} [options.key] API Key valid for requested service.\n * @param {Boolean} [options.spatialKeys=false] If the \"spatialKeys\" flag is set, the response will also\n * contain a proprietary geo-spatial key information for a specified location.\n * @param {float} [options.heading] The directional heading of the vehicle in degrees, for travel along a\n * segment of roadway. 0 is North, 90 is East and so on, values range from -360 to 360. The precision can\n * include upto one decimal place.\n * @param {integer} [options.radius=10000] The maximum distance in meters from the specified position for the\n * service to consider.\n * @param {integer} [options.limit=10] Maximum number of responses that will be returned.\n * @param {Function} [options.fail=default] The callback function to be called on failure. By default error is\n * logged on console and thrown.\n * @param {Function} [options.callback] The callback function to be called on success.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @throws {TypeError} if any of the given parameter cannot be converted to a valid value\n * @return {crossStreetLookup} Method returns new object that allows communication with the service.\n *\n * @example\n * ```javascript\n *\n * tomtom.crossStreetLookup().position('51.759,19.449').go().then(function(response) {\n * console.log(response);\n * });\n * ```\n */\n CrossStreetLookup.prototype = new reverseGeocodeBasePrototype();\n CrossStreetLookup.prototype.constructor = CrossStreetLookup;\n\n return function (options) {\n return (new CrossStreetLookup(options)).construct();\n };\n});\n","define('rest/search',[\"http\", \"./utils\", \"security\"], function (http, utils, security) {\n \"use strict\";\n\n var queryParamsNames = [\n \"typeahead\", \"limit\", \"offset\", \"countrySet\", \"lat\", \"lon\",\n \"radius\", \"topLeft\", \"btmRight\", \"idxSet\", \"maxFuzzyLevel\", \"geometryList\"\n ];\n\n return {\n search: function (options, callback) {\n var pathParams = {};\n var queryParams = {};\n\n // if an API key is specified, include it\n // an API key can be omitted if an API proxy is being used\n queryParams.key = utils.or(options.key, security.getKey(\"services/search\"));\n\n // get required query statement\n pathParams.query = utils.required(options.query, \"Missing query statement in Search service\");\n pathParams.type = utils.required(options.type, \"Missing type definition in Search service\");\n\n // look for optional passed params and set them if they are not undefined\n utils.extractQueryParams(options, queryParams, queryParamsNames);\n\n var baseUrl = utils.or(options.baseUrl, \"{protocol}://api.tomtom.com/\");\n var serviceUrl = utils.or(options.serviceUrl, \"search/2/{type}/{query}.{contentType}\");\n http.get({\n url: baseUrl + serviceUrl,\n pathParameters: pathParams,\n queryParameters: queryParams,\n callback: callback,\n callbackParam: \"callback\",\n fail: options.fail\n });\n }\n };\n});\n","define('model/search/search',['../selector'], function (selector) {\n \"use strict\";\n return function (json) {\n return selector(json, \"results\", \"address, position, score, poi, type, addressRanges, boundingBox\");\n };\n});\n","define('services/search/search',[\"rest/search\", \"model/search/search\", \"../chain\", \"../validators\", \"../converters\", \"../worldEdge\", \"../utils\"],\n function (search, model, chain, validators, converters, worldEdge, utils) {\n \"use strict\";\n\n var TYPES = {\n search: \"search\",\n poi: \"poiSearch\",\n category: \"categorySearch\",\n geometry: \"geometrySearch\",\n nearby: \"nearbySearch\",\n lowBandwidth: \"s\"\n }, fields = {\n key: {validator: validators.string},\n query: {validator: validators.string, required: true},\n typeahead: {validator: validators.bool},\n limit: {validator: validators.limit},\n offset: {validator: validators.offset, name: \"ofs\"},\n countrySet: {validator: validators.countrySet},\n radius: {validator: validators.positiveInteger},\n boundingBox: {validator: validators.boundingBox, converter: converters.boundingBox},\n center: {converter: converters.point, validator: validators.point},\n type: {validator: validators.string, defaultValue: TYPES.search},\n bestResult: {validator: validators.bool},\n protocol: {validator: validators.protocol},\n baseUrl: {validator: validators.string},\n serviceUrl: {validator: validators.string}\n };\n\n function addBoundingBoxParameters(data, boundingBox) {\n data.topLeft = [boundingBox.maxLat, boundingBox.minLon];\n data.btmRight = [boundingBox.minLat, boundingBox.maxLon];\n return data;\n }\n\n function callbackBestResult(bestResult, callback) {\n return function (response) {\n callback(bestResult ? response[0] : response);\n };\n }\n\n function Search(options) {\n this.options = options;\n this.defaultFields = utils.clone(fields);\n this.fields = {};\n }\n\n Search.prototype.TYPE = TYPES;\n Search.prototype.model = model;\n Search.prototype.construct = function () {\n var mergedFields = utils.addFields.call(this, this.fields);\n return chain.call(this, mergedFields, this.handleChain, this.options);\n };\n Search.prototype.handleChain = function (data, callback) {\n var bestResult = !!data.bestResult;\n if (bestResult) {\n data.limit = 1;\n data.offset = 0;\n }\n\n if (data.center) {\n data.center = data.center.split(\",\");\n data.lat = data.center[0];\n data.lon = data.center[1];\n delete data.center;\n }\n worldEdge(search.search, this.model, data, callbackBestResult(bestResult, callback), addBoundingBoxParameters);\n };\n\n function searchConstructor(options) {\n return (new Search(options)).construct();\n }\n\n searchConstructor.prototype.constructor = Search;\n\n return searchConstructor;\n });\n","/**\n * The fuzzy search implementation. Creates a new instance of service call. Parameters can be passed on creation or\n * provided via convenient functions that can be chained. The method go() performs the actual call.\n * The call is asynchronous therefore user have two options to handle response,\n * either by passing callback function or by using\n * [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n *\n * @example\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var fuzzySearch = tomtom.fuzzySearch().query('Amsterdam').callback(myFunction).go();\n *\n * The SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class fuzzySearch\n */\ndefine('services/search/fuzzySearch',[\"./search\", \"../validators\"], function (search, validators) {\n \"use strict\";\n\n var searchPrototype = search.prototype.constructor;\n\n function FuzzySearch(options) {\n searchPrototype.call(this, options);\n\n this.fields.type = {\n defaultValue: this.TYPE.search,\n visible: false\n };\n /**\n * A setter and getter for _'maxFuzzyLevel'_ attribute. Represents state of fuzziness level that has impact\n * on overall working of search service. Default value (_'maxFuzzyLevel=1'_) gains performance on fuzzy\n * search, as well as reduce unusual results.\n *\n * @method maxFuzzyLevel\n * @chainable\n * @param {integer} [maxFuzzyLevel] Value of fuzziness level, it could be 1, 2 or 3.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {fuzzySearch|integer} Method returns the service instance allowing chaining or _maxFuzzyLevel_\n * value if argument is omitted.\n */\n this.fields.maxFuzzyLevel = {\n validator: validators.fuzzinessLevel,\n defaultValue: 1\n };\n /**\n * A setter and getter for _'idxSet'_ attribute. Represents list of parameters that allows to tune fuzzy\n * search service. List should be divided by commas.\n *\n * There are six predefined indexes, but there is a possibility to specify custom ones (if you have had\n * indexed your own content earlier).\n * The predefined indexes are:\n * * _POI_ Points of interest,\n * * _PAD_ Point Addresses,\n * * _Str_ Streets,\n * * _Xstr_ Cross Streets (intersections),\n * * _Geo_ Geographies,\n * * _Addr_ Address range interpolation (when there is no PAD).\n *\n * @method idxSet\n * @chainable\n * @param {String} [idxSet] List of indexes, divided by commas.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {service|idxSet} Method returns the service instance allowing chaining or _idxSet_ value\n * if argument is omitted.\n */\n this.fields.idxSet = {\n validator: validators.string\n };\n }\n\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n /**\n * A setter and getter for _'best result'_ option. It makes the service return only one, best match result.\n * This option overwrites both limit and offset parameters. It changes the response from array to single\n * result. Default value is false.\n *\n * @method bestResult\n * @chainable\n * @param {Boolean} [bestResult] Defines whether geocode service should return the best result.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Boolean} Method returns the service instance allowing chaining or _bestResult_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'center'_ attribute. This attribute allows to bias the search results.\n *\n * Supplying only that attribute - without _radius_ parameter - will bias search results only to\n * that area.\n *\n * The service is able to convert a number of popular formats into the point.\n * Supported formats are listed below:\n * * _[0, 0]_ // array of latitude and longitude\n * * _\"0,1\"_ // string of latitude and longitude, divided by comma\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _{lat: function() {...}, lng: function() {...}}_ // object with two functions returning latitude and\n * longitude\n * * _{lat: 0, lon: 1}_ // object with two properties: latitude and longitude\n * * _{x: 0, y: 1}_ // object with two properties: x as latitude and y as longitude\n * * _{latitude: 0, longitude: 1}_ // object with two properties: latitude and longitude\n *\n * @method center\n * @chainable\n * @param {Point} [center] Point with latitude and longitude data.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Point} Method returns the service instance allowing chaining or _center_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'boundingBox'_ attribute. The bounding box of the area which user\n * wants to search on. It can be omitted, then whole world is taken into consideration.\n *\n * Bounding box can exceed world boundaries (-180, -90, 180, 90) it is not an issue. The service will\n * internally normalize it by overwriting any exceeding value with maximal or minimal allowed.\n * Longitude will be recalculated to fit the allowed range, if bounding box includes edge of the world\n * it will be split into two bounding boxes and the response will contain merged results for both areas.\n *\n * The service is able to convert a number of popular formats into the bounding box.\n * Supported formats are listed below:\n * * _{minLon: 0, minLat: 0, maxLon: 1, maxLat: 1}_ // plain object with minLon, minLat, maxLon, maxLat\n * fields\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _[0, 0, 1, 1]_ // array of numbers containing in order minLon, minLat, maxLon, maxLat\n * * _ol.Extent_ // open layers extend object\n * * _[ol.Coordinate, ol.Coordinate]_ // array of two open layers coordinate objects in order southWest,\n * northEast\n * * _[[0, 0], [1, 1]]_ // array of two arrays (southWest, northEast) with latitude and longitude values\n * * _\"0,0,1,1\"_ // comma separated string of number values minLon, minLat, maxLon, maxLat\n * * _[{lon: 0, lat: 0},{lon: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lon fields\n * * _[{lng: 0, lat: 0},{lng: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lng fields\n * * _[L.latLng(...), L.latLng(...)]_ // array of southWest and northEast leaflet latLng objects\n * * _google.maps.LatLngBounds_ // Google Maps bounds object\n * * _google.maps.LatLngBoundsLiteral_ // Google Maps bounds object\n * * _[LatLng, LatLng]_ // array of two google.maps.LatLng\n * * _[LatLngLiteral, LatLngLiteral]_ // array of two google.maps.LatLngLiteral\n *\n * @method boundingBox\n * @chainable\n * @param {Object|Array|String} [boundingBox] The bounding box of the area that search is supposed to\n * search on.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or converted bounding box\n * value if argument is omitted.\n */\n /**\n * A setter and getter for _'radius'_ attribute. Represents the area that results will be constrained to.\n * The passed value is meant to be specified in meters.\n *\n * This attribute is taken into the consideration only when _position_ attribute is set.\n *\n * @method radius\n * @chainable\n * @param {integer} [radius] Value of radius, specified in meters.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|integer} Method returns the service instance allowing chaining or _radius_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'countrySet'_ attribute. Represents comma separated string of country codes\n * (e.g.: FR,ES). This will limit the search to the specified countries.\n *\n * @method countrySet\n * @chainable\n * @param {String} [countrySet] Comma separated list of country codes.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _countrySet_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'offset'_ attribute. Represents starting offset of the returned results\n * within the full result set.\n *\n * An alias for this attribute is _'ofs'_. That means it is possible to set or get this attribute in\n * other way.\n *\n * Maximum value is 1900.\n *\n * @method offset\n * @chainable\n * @param {integer} [offset=0] Starting offset of the returned results within the full result set.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|integer} Method returns the service instance allowing chaining or _offset_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'limit'_ attribute. Represents maximum number of responses that will be\n * returned.\n *\n * Maximum value is 100.\n *\n * @method limit\n * @chainable\n * @param {integer} [limit=10] Maximum number of responses that will be returned.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {search|integer} Method returns the service instance allowing chaining or _limit_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'typeahead'_ attribute. If the \"typeahead\" flag is set,\n * the query will be interpreted as a partial input and the search will enter predictive mode.\n *\n * @method typeahead\n * @chainable\n * @param {Boolean} [typeahead=false] Flag that determines state of typeahead.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {search|Boolean} Method returns the service instance allowing chaining or _typeahead_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'query'_ attribute. Value passed within this method represents text that will be\n * searched.\n *\n * This method is required to call, unless search value was passed by options.\n *\n * @method query\n * @chainable\n * @param {String} [query] Query string. Must be properly URL encoded.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _query_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter method for _'key'_ attribute for given search service instance.\n * Key can be set globally when initializing map with tomtom.key - for all services -\n * or tomtom.searchKey function - for all search service instances.\n *\n * Passing valid key in any way is required to enable search service.\n *\n * The API Key can be issued from http://developer.tomtom.com\n *\n * @method key\n * @chainable\n * @param {String} [key] key API Key valid for requested service.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or key value\n * if argument is omitted.\n */\n\n FuzzySearch.prototype = new searchPrototype();\n FuzzySearch.prototype.constructor = FuzzySearch;\n /**\n * The function performing actual call to the web service. This method can be executed multiple times,\n * it is not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n */\n /**\n * A setter and getter for _callback_ function. This function is called after receiving successful response\n * from the service. It takes one argument which is the response - JSON described in go() function\n * documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {search} Method returns the service instance allowing chaining or function if argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {search|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n /**\n * Creates new instance of fuzzy search service.\n *\n * @method fuzzySearch\n *\n * @param {Object} [options] Options to be passed to the structured search call.\n * @param {String} [options.key] The API Key issued from http://developer.tomtom.com.\n * @param {String} [options.query] Query string. Must be properly URL encoded.\n * @param {Boolean} [options.typeahead=false] If the \"typeahead\" flag is set,\n * the query will be interpreted as a partial input and the search will enter predictive mode.\n * @param {integer} [options.limit=10] Maximum number of responses that will be returned.\n * @param {integer} [options.offset=0] Starting offset of the returned results within the full result set.\n * @param {String} [options.countrySet] Comma separated string of country codes (e.g.: FR,ES).\n * This will limit the search to the specified countries.\n * @param {integer} [options.radius] If radius and position are set, the results will be constrained\n * to the defined area. The radius parameter is specified in meters.\n * @param {Object|Array|String} [options.boundingBox] Area (two points with latitude and longitude) that search\n * will look for results onto.\n * @param {Point} [options.center] Point of current area center.\n * @param {String} [options.idxSet] List of indexes that tunes search service.\n * @param {integer} [options.maxFuzzyLevel] Value of search fuzziness level.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @param {Function} [options.fail] The callback function to be called on failure.\n * @param {Function} [options.callback] Specifies the callback method. Only used where format is jsonp.\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var fuzzySearch = tomtom.fuzzySearch()\n * .query('Amsterdam, The Netherlands').callback(myFunction).go();\n *\n * ```\n */\n return function (options) {\n return (new FuzzySearch(options)).construct();\n };\n});\n","/**\n * The Point of Interest search implementation. Creates a new instance of service call. Parameters can be passed on\n * creation or provided via convenient functions that can be chained. The method go() performs the actual call. The\n * call is asynchronous therefore user have two options to handle response, either by passing callback function or by\n * using [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n *\n * @example\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var poiSearch = tomtom.poiSearch().query('pizza').callback(myFunction).go();\n *\n * The SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class poiSearch\n */\ndefine('services/search/poiSearch',[\"./search\"], function (search) {\n \"use strict\";\n\n var searchPrototype = search.prototype.constructor;\n\n function PoiSearch(options) {\n searchPrototype.call(this, options);\n\n this.fields.type = {\n defaultValue: this.TYPE.poi,\n visible: false\n };\n }\n\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n /**\n * A setter and getter for _'best result'_ option. It makes the service return only one, best match result.\n * This option overwrites both limit and offset parameters. It changes the response from array to single\n * result. Default value is false.\n *\n * @method bestResult\n * @chainable\n * @param {Boolean} [bestResult] Defines whether geocode service should return the best result.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Boolean} Method returns the service instance allowing chaining or _bestResult_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'center'_ attribute. This attribute allows to bias the search results.\n *\n * Supplying only that attribute - without _radius_ parameter - will bias search results only to\n * that area.\n *\n * The service is able to convert a number of popular formats into the point.\n * Supported formats are listed below:\n * * _[0, 0]_ // array of latitude and longitude\n * * _\"0,1\"_ // string of latitude and longitude, divided by comma\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _{lat: function() {...}, lng: function() {...}}_ // object with two functions returning latitude and\n * longitude\n * * _{lat: 0, lon: 1}_ // object with two properties: latitude and longitude\n * * _{x: 0, y: 1}_ // object with two properties: x as latitude and y as longitude\n * * _{latitude: 0, longitude: 1}_ // object with two properties: latitude and longitude\n *\n * @method center\n * @chainable\n * @param {Point} [center] Point with latitude and longitude data.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Point} Method returns the service instance allowing chaining or _center_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'boundingBox'_ attribute. The bounding box of the area which user\n * wants to search on. It can be omitted, then whole world is taken into consideration.\n *\n * Bounding box can exceed world boundaries (-180, -90, 180, 90) it is not an issue. The service will\n * internally normalize it by overwriting any exceeding value with maximal or minimal allowed.\n * Longitude will be recalculated to fit the allowed range, if bounding box includes edge of the world\n * it will be split into two bounding boxes and the response will contain merged results for both areas.\n *\n * The service is able to convert a number of popular formats into the bounding box.\n * Supported formats are listed below:\n * * _{minLon: 0, minLat: 0, maxLon: 1, maxLat: 1}_ // plain object with minLon, minLat, maxLon, maxLat\n * fields\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _[0, 0, 1, 1]_ // array of numbers containing in order minLon, minLat, maxLon, maxLat\n * * _ol.Extent_ // open layers extend object\n * * _[ol.Coordinate, ol.Coordinate]_ // array of two open layers coordinate objects in order southWest,\n * northEast\n * * _[[0, 0], [1, 1]]_ // array of two arrays (southWest, northEast) with latitude and longitude values\n * * _\"0,0,1,1\"_ // comma separated string of number values minLon, minLat, maxLon, maxLat\n * * _[{lon: 0, lat: 0},{lon: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lon fields\n * * _[{lng: 0, lat: 0},{lng: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lng fields\n * * _[L.latLng(...), L.latLng(...)]_ // array of southWest and northEast leaflet latLng objects\n * * _google.maps.LatLngBounds_ // Google Maps bounds object\n * * _google.maps.LatLngBoundsLiteral_ // Google Maps bounds object\n * * _[LatLng, LatLng]_ // array of two google.maps.LatLng\n * * _[LatLngLiteral, LatLngLiteral]_ // array of two google.maps.LatLngLiteral\n *\n * @method boundingBox\n * @chainable\n * @param {Object|Array|String} [boundingBox] The bounding box of the area that search is supposed to\n * search on.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or converted bounding box\n * value if argument is omitted.\n */\n /**\n * A setter and getter for _'radius'_ attribute. Represents the area that results will be constrained to.\n * The passed value is meant to be specified in meters.\n *\n * This attribute is taken into the consideration only when _position_ attribute is set.\n *\n * @method radius\n * @chainable\n * @param {integer} [radius] Value of radius, specified in meters.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|integer} Method returns the service instance allowing chaining or _radius_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'countrySet'_ attribute. Represents comma separated string of country codes\n * (e.g.: FR,ES). This will limit the search to the specified countries.\n *\n * @method countrySet\n * @chainable\n * @param {String} [countrySet] Comma separated list of country codes.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _countrySet_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'offset'_ attribute. Represents starting offset of the returned results\n * within the full result set.\n *\n * An alias for this attribute is _'ofs'_. That means it is possible to set or get this attribute in\n * other way.\n *\n * Maximum value is 1900.\n *\n * @method offset\n * @chainable\n * @param {integer} [offset=0] Starting offset of the returned results within the full result set.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|integer} Method returns the service instance allowing chaining or _offset_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'limit'_ attribute. Represents maximum number of responses that will be\n * returned.\n *\n * Maximum value is 100.\n *\n * @method limit\n * @chainable\n * @param {integer} [limit=10] Maximum number of responses that will be returned.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {search|integer} Method returns the service instance allowing chaining or _limit_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'typeahead'_ attribute. If the \"typeahead\" flag is set,\n * the query will be interpreted as a partial input and the search will enter predictive mode.\n *\n * @method typeahead\n * @chainable\n * @param {Boolean} [typeahead=false] Flag that determines state of typeahead.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {search|Boolean} Method returns the service instance allowing chaining or _typeahead_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'query'_ attribute. Value passed within this method represents text that will be\n * searched.\n *\n * This method is required to call, unless search value was passed by options.\n *\n * @method query\n * @chainable\n * @param {String} [query] Query string. Must be properly URL encoded.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _query_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter method for _'key'_ attribute for given search service instance.\n * Key can be set globally when initializing map with tomtom.key - for all services -\n * or tomtom.searchKey function - for all search service instances.\n *\n * Passing valid key in any way is required to enable search service.\n *\n * The API Key can be issued from http://developer.tomtom.com\n *\n * @method key\n * @chainable\n * @param {String} [key] key API Key valid for requested service.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or key value\n * if argument is omitted.\n */\n\n PoiSearch.prototype = new searchPrototype();\n PoiSearch.prototype.constructor = PoiSearch;\n\n /**\n * The function performing actual call to the web service. This method can be executed multiple times,\n * it is not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n */\n /**\n * A setter and getter for _callback_ function. This function is called after receiving successful response\n * from the service. It takes one argument which is the response - JSON described in go() function\n * documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {search} Method returns the service instance allowing chaining or function if argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {search|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n /**\n * Creates new instance of point of interest search service.\n *\n * @method poiSearch\n *\n * @param {Object} [options] Options to be passed to the structured search call.\n * @param {String} [options.key] The API Key issued from http://developer.tomtom.com.\n * @param {String} [options.query] Query string. Must be properly URL encoded.\n * @param {Boolean} [options.typeahead=false] If the \"typeahead\" flag is set,\n * the query will be interpreted as a partial input and the search will enter predictive mode.\n * @param {integer} [options.limit=10] Maximum number of responses that will be returned.\n * @param {integer} [options.offset=0] Starting offset of the returned results within the full result set.\n * @param {String} [options.countrySet] Comma separated string of country codes (e.g.: FR,ES).\n * This will limit the search to the specified countries.\n * @param {integer} [options.radius] If radius and position are set, the results will be constrained\n * to the defined area. The radius parameter is specified in meters.\n * @param {Object|Array|String} [options.boundingBox] Area (two points with latitude and longitude) that search\n * will look for results onto.\n * @param {Point} [options.center] Point of current area center.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @param {Function} [options.fail] The callback function to be called on failure.\n * @param {Function} [options.callback] Specifies the callback method. Only used where format is jsonp.\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var poiSearch = tomtom.poiSearch().query('pizza').callback(myFunction).go();\n *\n * ```\n */\n return function (options) {\n return (new PoiSearch(options)).construct();\n };\n});\n","/**\n * The category search implementation. Creates a new instance of service call. Parameters can be passed on creation or\n * provided via convenient functions that can be chained. The method go() performs the actual call.\n * The call is asynchronous therefore user have two options to handle response,\n * either by passing callback function or by using\n * [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n *\n * List of all possible categories is available at\n * [developer.tomtom.com](http://developer.tomtom.com/products/onlinenavigation/onlinesearch/documentation/Search/CategorySearch).\n *\n * @example\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var categorySearch = tomtom.categorySearch().query('pizza').callback(myFunction).go();\n *\n * The SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class categorySearch\n */\ndefine('services/search/categorySearch',[\"./search\"], function (search) {\n \"use strict\";\n\n var searchPrototype = search.prototype.constructor;\n\n function CategorySearch(options) {\n searchPrototype.call(this, options);\n\n this.fields.type = {\n defaultValue: this.TYPE.category,\n visible: false\n };\n }\n\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n /**\n * A setter and getter for _'best result'_ option. It makes the service return only one, best match result.\n * This option overwrites both limit and offset parameters. It changes the response from array to single\n * result. Default value is false.\n *\n * @method bestResult\n * @chainable\n * @param {Boolean} [bestResult] Defines whether geocode service should return the best result.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Boolean} Method returns the service instance allowing chaining or _bestResult_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'center'_ attribute. This attribute allows to bias the search results.\n *\n * Supplying only that attribute - without _radius_ parameter - will bias search results only to\n * that area.\n *\n * The service is able to convert a number of popular formats into the point.\n * Supported formats are listed below:\n * * _[0, 0]_ // array of latitude and longitude\n * * _\"0,1\"_ // string of latitude and longitude, divided by comma\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _{lat: function() {...}, lng: function() {...}}_ // object with two functions returning latitude and\n * longitude\n * * _{lat: 0, lon: 1}_ // object with two properties: latitude and longitude\n * * _{x: 0, y: 1}_ // object with two properties: x as latitude and y as longitude\n * * _{latitude: 0, longitude: 1}_ // object with two properties: latitude and longitude\n *\n * @method center\n * @chainable\n * @param {Point} [center] Point with latitude and longitude data.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Point} Method returns the service instance allowing chaining or _center_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'boundingBox'_ attribute. The bounding box of the area which user\n * wants to search on. It can be omitted, then whole world is taken into consideration.\n *\n * Bounding box can exceed world boundaries (-180, -90, 180, 90) it is not an issue. The service will\n * internally normalize it by overwriting any exceeding value with maximal or minimal allowed.\n * Longitude will be recalculated to fit the allowed range, if bounding box includes edge of the world\n * it will be split into two bounding boxes and the response will contain merged results for both areas.\n *\n * The service is able to convert a number of popular formats into the bounding box.\n * Supported formats are listed below:\n * * _{minLon: 0, minLat: 0, maxLon: 1, maxLat: 1}_ // plain object with minLon, minLat, maxLon, maxLat\n * fields\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _[0, 0, 1, 1]_ // array of numbers containing in order minLon, minLat, maxLon, maxLat\n * * _ol.Extent_ // open layers extend object\n * * _[ol.Coordinate, ol.Coordinate]_ // array of two open layers coordinate objects in order southWest,\n * northEast\n * * _[[0, 0], [1, 1]]_ // array of two arrays (southWest, northEast) with latitude and longitude values\n * * _\"0,0,1,1\"_ // comma separated string of number values minLon, minLat, maxLon, maxLat\n * * _[{lon: 0, lat: 0},{lon: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lon fields\n * * _[{lng: 0, lat: 0},{lng: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lng fields\n * * _[L.latLng(...), L.latLng(...)]_ // array of southWest and northEast leaflet latLng objects\n * * _google.maps.LatLngBounds_ // Google Maps bounds object\n * * _google.maps.LatLngBoundsLiteral_ // Google Maps bounds object\n * * _[LatLng, LatLng]_ // array of two google.maps.LatLng\n * * _[LatLngLiteral, LatLngLiteral]_ // array of two google.maps.LatLngLiteral\n *\n * @method boundingBox\n * @chainable\n * @param {Object|Array|String} [boundingBox] The bounding box of the area that search is supposed to\n * search on.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or converted bounding box\n * value if argument is omitted.\n */\n /**\n * A setter and getter for _'radius'_ attribute. Represents the area that results will be constrained to.\n * The passed value is meant to be specified in meters.\n *\n * This attribute is taken into the consideration only when _position_ attribute is set.\n *\n * @method radius\n * @chainable\n * @param {integer} [radius] Value of radius, specified in meters.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|integer} Method returns the service instance allowing chaining or _radius_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'countrySet'_ attribute. Represents comma separated string of country codes\n * (e.g.: FR,ES). This will limit the search to the specified countries.\n *\n * @method countrySet\n * @chainable\n * @param {String} [countrySet] Comma separated list of country codes.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _countrySet_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'offset'_ attribute. Represents starting offset of the returned results\n * within the full result set.\n *\n * An alias for this attribute is _'ofs'_. That means it is possible to set or get this attribute in\n * other way.\n *\n * Maximum value is 1900.\n *\n * @method offset\n * @chainable\n * @param {integer} [offset=0] Starting offset of the returned results within the full result set.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|integer} Method returns the service instance allowing chaining or _offset_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'limit'_ attribute. Represents maximum number of responses that will be\n * returned.\n *\n * Maximum value is 100.\n *\n * @method limit\n * @chainable\n * @param {integer} [limit=10] Maximum number of responses that will be returned.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {search|integer} Method returns the service instance allowing chaining or _limit_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'typeahead'_ attribute. If the \"typeahead\" flag is set,\n * the query will be interpreted as a partial input and the search will enter predictive mode.\n *\n * @method typeahead\n * @chainable\n * @param {Boolean} [typeahead=false] Flag that determines state of typeahead.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {search|Boolean} Method returns the service instance allowing chaining or _typeahead_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'query'_ attribute. Value passed within this method represents text that will be\n * searched.\n *\n * This method is required to call, unless search value was passed by options.\n *\n * @method query\n * @chainable\n * @param {String} [query] Query string. Must be properly URL encoded.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _query_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter method for _'key'_ attribute for given search service instance.\n * Key can be set globally when initializing map with tomtom.key - for all services -\n * or tomtom.searchKey function - for all search service instances.\n *\n * Passing valid key in any way is required to enable search service.\n *\n * The API Key can be issued from http://developer.tomtom.com\n *\n * @method key\n * @chainable\n * @param {String} [key] key API Key valid for requested service.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or key value\n * if argument is omitted.\n */\n\n CategorySearch.prototype = new searchPrototype();\n CategorySearch.prototype.constructor = CategorySearch;\n\n /**\n * The function performing actual call to the web service. This method can be executed multiple times,\n * it is not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n */\n /**\n * A setter and getter for _callback_ function. This function is called after receiving successful response\n * from the service. It takes one argument which is the response - JSON described in go() function\n * documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {search} Method returns the service instance allowing chaining or function if argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {search|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n /**\n * Creates new instance of category search service.\n *\n * @method categorySearch\n *\n * @param {Object} [options] Options to be passed to the structured search call.\n * @param {String} [options.key] The API Key issued from http://developer.tomtom.com.\n * @param {String} [options.query] Query string. Must be properly URL encoded.\n * @param {Boolean} [options.typeahead=false] If the \"typeahead\" flag is set,\n * the query will be interpreted as a partial input and the search will enter predictive mode.\n * @param {integer} [options.limit=10] Maximum number of responses that will be returned.\n * @param {integer} [options.offset=0] Starting offset of the returned results within the full result set.\n * @param {String} [options.countrySet] Comma separated string of country codes (e.g.: FR,ES).\n * This will limit the search to the specified countries.\n * @param {integer} [options.radius] If radius and position are set, the results will be constrained\n * to the defined area. The radius parameter is specified in meters.\n * @param {Object|Array|String} [options.boundingBox] Area (two points with latitude and longitude) that search\n * will look for results onto.\n * @param {Point} [options.center] Point of current area center.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @param {Function} [options.fail] The callback function to be called on failure.\n * @param {Function} [options.callback] Specifies the callback method. Only used where format is jsonp.\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var categorySearch = tomtom.categorySearch().query('pizza').callback(myFunction).go();\n *\n * ```\n */\n return function (options) {\n return (new CategorySearch(options)).construct();\n };\n});\n","/**\n * The geometry search implementation. Creates a new instance of service call. Parameters can be passed on creation or\n * provided via convenient functions that can be chained. The method go() performs the actual call.\n * The call is asynchronous therefore user have two options to handle response,\n * either by passing callback function or by using\n * [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n *\n * @example\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var geometryList = [{\"type\":\"POLYGON\",\"vertices\":\n * [\"37.7524152343544,-122.43576049804686\",\n * \"37.70660472542312,-122.43301391601562\",\n * \"37.712059855877314,-122.36434936523438\",\n * \"37.75350561243041,-122.37396240234374\"]},\n * {\"type\": \"CIRCLE\", \"position\": \"37.71205,-121.36434\", \"radius\": 6000},{\n * \"type\": \"CIRCLE\", \"position\": \"37.31205,-121.36434\", \"radius\": 1000}];\n * var geometrySearch = tomtom.geometrySearch().geometryList(geometryList).callback(myFunction).go();\n *\n * The SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class geometrySearch\n */\ndefine('services/search/geometrySearch',[\"./search\", \"../validators\", \"../converters\"], function (search, validators, converters) {\n \"use strict\";\n\n var searchPrototype = search.prototype.constructor;\n\n function GeometrySearch(options) {\n this.options = options;\n this.fields = {};\n\n this.fields.type = {\n defaultValue: this.TYPE.geometry,\n visible: false\n };\n /**\n * A setter and getter method for _'key'_ attribute for given search service instance.\n * Key can be set globally when initializing map with tomtom.key - for all services -\n * or tomtom.searchKey function - for all search service instances.\n *\n * Passing valid key in any way is required to enable geometry search service.\n *\n * The API Key can be issued from http://developer.tomtom.com.\n *\n * @method key\n * @chainable\n * @param {String} [key] key API Key valid for requested service.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geometrySearch|String} Method returns the service instance allowing chaining or key value\n * if argument is omitted.\n */\n this.fields.key = {\n validator: validators.string\n };\n /**\n * A setter and getter for _'query'_ attribute. Value passed within this method represents text that will be\n * searched.\n *\n * This method is required to call, unless search value was passed by options.\n *\n * @method query\n * @chainable\n * @param {String} [query] Query string. Must be properly URL encoded.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {geometrySearch|String} Method returns the service instance allowing chaining or _query_ value\n * if argument is omitted.\n */\n this.fields.query = {\n validator: validators.string,\n required: true\n };\n /**\n * A setter and getter for _'limit'_ attribute. Represents maximum number of responses that will be\n * returned.\n *\n * Maximum value is 100.\n *\n * @method limit\n * @chainable\n * @param {integer} [limit=10] Maximum number of responses that will be returned.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {geometrySearch|integer} Method returns the service instance allowing chaining or _limit_ value\n * if argument is omitted.\n */\n this.fields.limit = {\n validator: validators.limit\n };\n\n /**\n * A setter and getter for _'geometryList'_ attribute. Represents list of geometries for the geometry\n * search.\n *\n * Available geometries are:\n * * polygons _(represent type \"POLYGON\", require list of vertices - points)_,\n * * circles _(represent type \"CIRCLE\", require position (point) and radius information)_.\n *\n * @method geometryList\n * @chainable\n * @param {Array} [idxSet] List of indexes, divided by commas.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {service|idxSet} Method returns the service instance allowing chaining or _geometryList_ value\n * if argument is omitted.\n */\n this.fields.geometryList = {\n validator: validators.geometryList,\n converter: converters.geometryList\n };\n\n /**\n * A setter and getter for _'idxSet'_ attribute. Represents list of parameters that allows to tune fuzzy\n * search service. List should be divided by commas.\n *\n * There are six predefined indexes, but there is a possibility to specify custom ones (if you have had\n * indexed your own content earlier).\n * The predefined indexes are:\n * * _POI_ Points of interest,\n * * _PAD_ Point Addresses,\n * * _Str_ Streets,\n * * _Xstr_ Cross Streets (intersections),\n * * _Geo_ Geographies,\n * * _Addr_ Address range interpolation (when there is no PAD).\n *\n * @method idxSet\n * @chainable\n * @param {String} [idxSet] List of indexes, divided by commas.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {service|idxSet} Method returns the service instance allowing chaining or _idxSet_ value\n * if argument is omitted.\n */\n this.fields.idxSet = {\n validator: validators.string\n };\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n this.fields.protocol = {validator: validators.protocol}\n }\n\n GeometrySearch.prototype = searchPrototype.prototype;\n GeometrySearch.prototype.constructor = GeometrySearch;\n\n /**\n * The function performing actual call to the web service. This method can be executed multiple times,\n * it is not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n */\n /**\n * A setter and getter for _callback_ function. This function is called after receiving successful response\n * from the service. It takes one argument which is the response - JSON described in go() function\n * documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {search} Method returns the service instance allowing chaining or function if argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {search|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n /**\n * Creates new instance of geometry search service.\n *\n * @method geometrySearch\n *\n * @param {Object} [options] Options to be passed to the structured search call.\n * @param {String} [options.key] The API Key issued from http://developer.tomtom.com.\n * @param {String} [options.query] Query string. Must be properly URL encoded.\n * @param {Array} [options.geometryList] Array of geometries for the geometry search, accepts _polygons_ and\n * _circles_.\n * @param {integer} [options.limit=10] Maximum number of responses that will be returned.\n * @param {String} [options.idxSet] List of indexes that tunes geometry search service.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @param {Function} [options.fail] The callback function to be called on failure.\n * @param {Function} [options.callback] Specifies the callback method. Only used where format is jsonp.\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var geometryList = [{\"type\":\"POLYGON\",\"vertices\":\n * [\"37.7524152343544,-122.43576049804686\",\n * \"37.70660472542312,-122.43301391601562\",\n * \"37.712059855877314,-122.36434936523438\",\n * \"37.75350561243041,-122.37396240234374\"]},\n * {\"type\": \"CIRCLE\", \"position\": \"37.71205,-121.36434\", \"radius\": 6000},{\n * \"type\": \"CIRCLE\", \"position\": \"37.31205,-121.36434\", \"radius\": 1000}];\n * var geometrySearch = tomtom.geometrySearch().geometryList(geometryList).callback(myFunction).go();\n *\n * ```\n */\n return function (options) {\n return (new GeometrySearch(options)).construct();\n };\n});\n","/**\n * The nearby search implementation. Creates a new instance of service call. Parameters can be passed on creation or\n * provided via convenient functions that can be chained. The method go() performs the actual call.\n * The call is asynchronous therefore user have two options to handle response,\n * either by passing callback function or by using\n * [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var nearbySearch = tomtom.nearbySearch().center([0,0]).radius(1000).callback(myFunction).go();\n * ```\n *\n * The SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class nearbySearch\n */\ndefine('services/search/nearbySearch',[\"./search\"], function (search) {\n \"use strict\";\n\n var searchPrototype = search.prototype.constructor;\n\n function NearbySearch(options) {\n searchPrototype.call(this, options);\n\n this.fields.type = {\n defaultValue: this.TYPE.nearby,\n visible: false\n };\n this.fields.query = {\n required: false,\n visible: false,\n defaultValue: \"\"\n };\n this.fields.center = {\n required: true\n };\n this.fields.radius = {\n required: true\n };\n this.fields.typeahead = {\n visible: false\n };\n }\n\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n /**\n * A setter and getter for _'best result'_ option. It makes the service return only one, best match result.\n * This option overwrites both limit and offset parameters. It changes the response from array to single\n * result. Default value is false.\n *\n * @method bestResult\n * @chainable\n * @param {Boolean} [bestResult] Defines whether geocode service should return the best result.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Boolean} Method returns the service instance allowing chaining or _bestResult_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'center'_ attribute. This attribute allows to bias the search results.\n *\n * Supplying only that attribute - without _radius_ parameter - will bias search results only to\n * that area.\n *\n * The service is able to convert a number of popular formats into the point.\n * Supported formats are listed below:\n * * _[0, 0]_ // array of latitude and longitude\n * * _\"0,1\"_ // string of latitude and longitude, divided by comma\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _{lat: function() {...}, lng: function() {...}}_ // object with two functions returning latitude and\n * longitude\n * * _{lat: 0, lon: 1}_ // object with two properties: latitude and longitude\n * * _{x: 0, y: 1}_ // object with two properties: x as latitude and y as longitude\n * * _{latitude: 0, longitude: 1}_ // object with two properties: latitude and longitude\n *\n * @method center\n * @chainable\n * @param {Point} [center] Point with latitude and longitude data.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Point} Method returns the service instance allowing chaining or _center_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'boundingBox'_ attribute. The bounding box of the area which user\n * wants to search on. It can be omitted, then whole world is taken into consideration.\n *\n * Bounding box can exceed world boundaries (-180, -90, 180, 90) it is not an issue. The service will\n * internally normalize it by overwriting any exceeding value with maximal or minimal allowed.\n * Longitude will be recalculated to fit the allowed range, if bounding box includes edge of the world\n * it will be split into two bounding boxes and the response will contain merged results for both areas.\n *\n * The service is able to convert a number of popular formats into the bounding box.\n * Supported formats are listed below:\n * * _{minLon: 0, minLat: 0, maxLon: 1, maxLat: 1}_ // plain object with minLon, minLat, maxLon, maxLat\n * fields\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _[0, 0, 1, 1]_ // array of numbers containing in order minLon, minLat, maxLon, maxLat\n * * _ol.Extent_ // open layers extend object\n * * _[ol.Coordinate, ol.Coordinate]_ // array of two open layers coordinate objects in order southWest,\n * northEast\n * * _[[0, 0], [1, 1]]_ // array of two arrays (southWest, northEast) with latitude and longitude values\n * * _\"0,0,1,1\"_ // comma separated string of number values minLon, minLat, maxLon, maxLat\n * * _[{lon: 0, lat: 0},{lon: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lon fields\n * * _[{lng: 0, lat: 0},{lng: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lng fields\n * * _[L.latLng(...), L.latLng(...)]_ // array of southWest and northEast leaflet latLng objects\n * * _google.maps.LatLngBounds_ // Google Maps bounds object\n * * _google.maps.LatLngBoundsLiteral_ // Google Maps bounds object\n * * _[LatLng, LatLng]_ // array of two google.maps.LatLng\n * * _[LatLngLiteral, LatLngLiteral]_ // array of two google.maps.LatLngLiteral\n *\n * @method boundingBox\n * @chainable\n * @param {Object|Array|String} [boundingBox] The bounding box of the area that search is supposed to\n * search on.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or converted bounding box\n * value if argument is omitted.\n */\n /**\n * A setter and getter for _'radius'_ attribute. Represents the area that results will be constrained to.\n * The passed value is meant to be specified in meters.\n *\n * This attribute is taken into the consideration only when _position_ attribute is set.\n *\n * @method radius\n * @chainable\n * @param {integer} [radius] Value of radius, specified in meters.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|integer} Method returns the service instance allowing chaining or _radius_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'countrySet'_ attribute. Represents comma separated string of country codes\n * (e.g.: FR,ES). This will limit the search to the specified countries.\n *\n * @method countrySet\n * @chainable\n * @param {String} [countrySet] Comma separated list of country codes.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _countrySet_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'offset'_ attribute. Represents starting offset of the returned results\n * within the full result set.\n *\n * An alias for this attribute is _'ofs'_. That means it is possible to set or get this attribute in\n * other way.\n *\n * Maximum value is 1900.\n *\n * @method offset\n * @chainable\n * @param {integer} [offset=0] Starting offset of the returned results within the full result set.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|integer} Method returns the service instance allowing chaining or _offset_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'limit'_ attribute. Represents maximum number of responses that will be\n * returned.\n *\n * Maximum value is 100.\n *\n * @method limit\n * @chainable\n * @param {integer} [limit=10] Maximum number of responses that will be returned.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {search|integer} Method returns the service instance allowing chaining or _limit_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter method for _'key'_ attribute for given search service instance.\n * Key can be set globally when initializing map with tomtom.key - for all services -\n * or tomtom.searchKey function - for all search service instances.\n *\n * Passing valid key in any way is required to enable search service.\n *\n * The API Key can be issued from http://developer.tomtom.com\n *\n * @method key\n * @chainable\n * @param {String} [key] key API Key valid for requested service.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or key value\n * if argument is omitted.\n */\n\n NearbySearch.prototype = new searchPrototype();\n NearbySearch.prototype.constructor = NearbySearch;\n\n /**\n * The function performing actual call to the web service. This method can be executed multiple times,\n * it is not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n */\n /**\n * A setter and getter for _callback_ function. This function is called after receiving successful response\n * from the service. It takes one argument which is the response - JSON described in go() function\n * documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {search} Method returns the service instance allowing chaining or function if argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {search|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n /**\n * Creates new instance of nearby search service.\n *\n * @method nearbySearch\n *\n * @param {Object} [options] Options to be passed to the structured search call.\n * @param {String} [options.key] The API Key issued from http://developer.tomtom.com.\n * @param {Point} [options.center] Point of current map center. This parameter is required to be defined\n * either by options or setter method.\n * @param {integer} [options.radius] If radius and center are set, the results will be constrained\n * to the defined area. The radius parameter is specified in meters. This parameter is required\n * to be defined either by options or setter method.\n * @param {integer} [options.limit=10] Maximum number of responses that will be returned.\n * @param {integer} [options.offset=0] Starting offset of the returned results within the full result set.\n * @param {String} [options.countrySet] Comma separated string of country codes (e.g.: FR,ES).\n * This will limit the search to the specified countries.\n * @param {Object|Array|String} [options.boundingBox] Area (two points with latitude and longitude) that search\n * will look for results onto.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @param {Function} [options.fail] The callback function to be called on failure.\n * @param {Function} [options.callback] Specifies the callback method. Only used where format is jsonp.\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var nearbySearch = tomtom.nearbySearch().center([0,0]).radius(1000).callback(myFunction).go();\n *\n * ```\n */\n return function (options) {\n return (new NearbySearch(options)).construct();\n };\n});\n","define('model/search/lowBandwidthSearch',['../selector'], function (selector) {\n \"use strict\";\n return function (json) {\n return selector(json, \"r\", \"a1, tp, cc, a2, nm, ph, ps, gh, ct\");\n };\n});\n","/**\n * The low bandwidth search implementation. Creates a new instance of service call. Parameters can be passed on\n * creation or provided via convenient functions that can be chained. The method go() performs the actual call. The\n * call is asynchronous therefore user have two options to handle response, either by passing callback function or by\n * using [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n *\n * @example\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var lowBandwidth = tomtom.lowBandwidth().query('Amsterdam').callback(myFunction).go();\n *\n * The SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * @class lowBandwidthSearch\n */\ndefine('services/search/lowBandwidthSearch',[\"./search\", \"model/search/lowBandwidthSearch\", \"../validators\"], function (search, model, validators) {\n \"use strict\";\n\n var searchPrototype = search.prototype.constructor;\n\n function LowBandwidthSearch(options) {\n searchPrototype.call(this, options);\n\n this.model = model;\n this.fields.type = {\n defaultValue: this.TYPE.lowBandwidth,\n visible: false\n };\n /**\n * A setter and getter for _'idxSet'_ attribute. Represents list of parameters that allows to tune\n * low bandwidth search service. List should be divided by commas.\n *\n * There are six predefined indexes, but there is a possibility to specify custom ones (if you have had\n * indexed your own content earlier).\n * The predefined indexes are:\n * * _POI_ Points of interest,\n * * _PAD_ Point Addresses,\n * * _Str_ Streets,\n * * _Xstr_ Cross Streets (intersections),\n * * _Geo_ Geographies,\n * * _Addr_ Address range interpolation (when there is no PAD).\n *\n * @method idxSet\n * @chainable\n * @param {String} [idxSet] List of indexes, divided by commas.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {lowBandwidthSearch|idxSet} Method returns the service instance allowing chaining or _idxSet_\n * value if argument is omitted.\n */\n this.fields.idxSet = {\n validator: validators.string\n };\n }\n\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n /**\n * A setter and getter for _'best result'_ option. It makes the service return only one, best match result.\n * This option overwrites both limit and offset parameters. It changes the response from array to single\n * result. Default value is false.\n *\n * @method bestResult\n * @chainable\n * @param {Boolean} [bestResult] Defines whether geocode service should return the best result.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Boolean} Method returns the service instance allowing chaining or _bestResult_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'center'_ attribute. This attribute allows to bias the search results.\n *\n * Supplying only that attribute - without _radius_ parameter - will bias search results only to\n * that area.\n *\n * The service is able to convert a number of popular formats into the point.\n * Supported formats are listed below:\n * * _[0, 0]_ // array of latitude and longitude\n * * _\"0,1\"_ // string of latitude and longitude, divided by comma\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _{lat: function() {...}, lng: function() {...}}_ // object with two functions returning latitude and\n * longitude\n * * _{lat: 0, lon: 1}_ // object with two properties: latitude and longitude\n * * _{x: 0, y: 1}_ // object with two properties: x as latitude and y as longitude\n * * _{latitude: 0, longitude: 1}_ // object with two properties: latitude and longitude\n *\n * @method center\n * @chainable\n * @param {Point} [center] Point with latitude and longitude data.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|Point} Method returns the service instance allowing chaining or _center_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'boundingBox'_ attribute. The bounding box of the area which user\n * wants to search on. It can be omitted, then whole world is taken into consideration.\n *\n * Bounding box can exceed world boundaries (-180, -90, 180, 90) it is not an issue. The service will\n * internally normalize it by overwriting any exceeding value with maximal or minimal allowed.\n * Longitude will be recalculated to fit the allowed range, if bounding box includes edge of the world\n * it will be split into two bounding boxes and the response will contain merged results for both areas.\n *\n * The service is able to convert a number of popular formats into the bounding box.\n * Supported formats are listed below:\n * * _{minLon: 0, minLat: 0, maxLon: 1, maxLat: 1}_ // plain object with minLon, minLat, maxLon, maxLat\n * fields\n * * _L.latLngBounds(...)_ // leaflet bounds object\n * * _[0, 0, 1, 1]_ // array of numbers containing in order minLon, minLat, maxLon, maxLat\n * * _ol.Extent_ // open layers extend object\n * * _[ol.Coordinate, ol.Coordinate]_ // array of two open layers coordinate objects in order southWest,\n * northEast\n * * _[[0, 0], [1, 1]]_ // array of two arrays (southWest, northEast) with latitude and longitude values\n * * _\"0,0,1,1\"_ // comma separated string of number values minLon, minLat, maxLon, maxLat\n * * _[{lon: 0, lat: 0},{lon: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lon fields\n * * _[{lng: 0, lat: 0},{lng: 1, lat: 1}]_ // array of two plain objects (southWest, northEast)\n * with lat and lng fields\n * * _[L.latLng(...), L.latLng(...)]_ // array of southWest and northEast leaflet latLng objects\n * * _google.maps.LatLngBounds_ // Google Maps bounds object\n * * _google.maps.LatLngBoundsLiteral_ // Google Maps bounds object\n * * _[LatLng, LatLng]_ // array of two google.maps.LatLng\n * * _[LatLngLiteral, LatLngLiteral]_ // array of two google.maps.LatLngLiteral\n *\n * @method boundingBox\n * @chainable\n * @param {Object|Array|String} [boundingBox] The bounding box of the area that search is supposed to\n * search on.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or converted bounding box\n * value if argument is omitted.\n */\n /**\n * A setter and getter for _'radius'_ attribute. Represents the area that results will be constrained to.\n * The passed value is meant to be specified in meters.\n *\n * This attribute is taken into the consideration only when _position_ attribute is set.\n *\n * @method radius\n * @chainable\n * @param {integer} [radius] Value of radius, specified in meters.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|integer} Method returns the service instance allowing chaining or _radius_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'countrySet'_ attribute. Represents comma separated string of country codes\n * (e.g.: FR,ES). This will limit the search to the specified countries.\n *\n * @method countrySet\n * @chainable\n * @param {String} [countrySet] Comma separated list of country codes.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _countrySet_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'offset'_ attribute. Represents starting offset of the returned results\n * within the full result set.\n *\n * An alias for this attribute is _'ofs'_. That means it is possible to set or get this attribute in\n * other way.\n *\n * Maximum value is 1900.\n *\n * @method offset\n * @chainable\n * @param {integer} [offset=0] Starting offset of the returned results within the full result set.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|integer} Method returns the service instance allowing chaining or _offset_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'limit'_ attribute. Represents maximum number of responses that will be\n * returned.\n *\n * Maximum value is 100.\n *\n * @method limit\n * @chainable\n * @param {integer} [limit=10] Maximum number of responses that will be returned.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {search|integer} Method returns the service instance allowing chaining or _limit_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'typeahead'_ attribute. If the \"typeahead\" flag is set,\n * the query will be interpreted as a partial input and the search will enter predictive mode.\n *\n * @method typeahead\n * @chainable\n * @param {Boolean} [typeahead=false] Flag that determines state of typeahead.\n * @throws {TypeError} If the given argument cannot be converted to a valid value\n * @return {search|Boolean} Method returns the service instance allowing chaining or _typeahead_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter for _'query'_ attribute. Value passed within this method represents text that will be\n * searched.\n *\n * This method is required to call, unless search value was passed by options.\n *\n * @method query\n * @chainable\n * @param {String} [query] Query string. Must be properly URL encoded.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or _query_ value\n * if argument is omitted.\n */\n /**\n * A setter and getter method for _'key'_ attribute for given search service instance.\n * Key can be set globally when initializing map with tomtom.key - for all services -\n * or tomtom.searchKey function - for all search service instances.\n *\n * Passing valid key in any way is required to enable search service.\n *\n * The API Key can be issued from http://developer.tomtom.com\n *\n * @method key\n * @chainable\n * @param {String} [key] key API Key valid for requested service.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {search|String} Method returns the service instance allowing chaining or key value\n * if argument is omitted.\n */\n LowBandwidthSearch.prototype = new searchPrototype();\n LowBandwidthSearch.prototype.constructor = LowBandwidthSearch;\n\n /**\n * The function performing actual call to the web service. This method can be executed multiple times,\n * it is not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n */\n /**\n * A setter and getter for _callback_ function. This function is called after receiving successful response\n * from the service. It takes one argument which is the response - JSON described in go() function\n * documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {search} Method returns the service instance allowing chaining or function if argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {search|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n /**\n * Creates new instance of low bandwidth search service.\n *\n * @method lowBandwidthSearch\n *\n * @param {Object} [options] Options to be passed to the search call.\n * @param {String} [options.key] The API Key issued from http://developer.tomtom.com.\n * @param {String} [options.query] Query string. Must be properly URL encoded.\n * @param {Boolean} [options.typeahead=false] If the \"typeahead\" flag is set,\n * the query will be interpreted as a partial input and the search will enter predictive mode.\n * @param {integer} [options.limit=10] Maximum number of responses that will be returned.\n * @param {integer} [options.offset=0] Starting offset of the returned results within the full result set.\n * @param {String} [options.countrySet] Comma separated string of country codes (e.g.: FR,ES).\n * This will limit the search to the specified countries.\n * @param {integer} [options.radius] If radius and position are set, the results will be constrained\n * to the defined area. The radius parameter is specified in meters.\n * @param {Object|Array|String} [options.boundingBox] Area (two points with latitude and longitude) that search\n * will look for results onto.\n * @param {Point} [options.center] Point of current area center.\n * @param {String} [options.idxSet] List of indexes that tunes search service.\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n * @param {Function} [options.fail] The callback function to be called on failure.\n * @param {Function} [options.callback] Specifies the callback method. Only used where format is jsonp.\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * tomtom.searchKey(); // this is optional if you passed global key earlier\n * var lowBandwidthSearch = tomtom.lowBandwidthSearch().query('Amsterdam, The\n * Netherlands').callback(myFunction).go();\n *\n * ```\n */\n return function (options) {\n return (new LowBandwidthSearch(options)).construct();\n };\n});\n","define('rest/routing',[\"http\", \"./utils\", \"security\"], function (http, utils, security) {\n \"use strict\";\n\n var queryParamNames = [\n \"maxAlternatives\", \"routeType\", \"traffic\", \"instructionsType\", \"language\", \"departAt\", \"arriveAt\",\n \"computeBestOrder\", \"routeRepresentation\", \"travelMode\", \"hilliness\", \"windingness\", \"report\",\n \"computeTravelTimeFor\", \"vehicleEngineType\", \"vehicleMaxSpeed\", \"vehicleWeight\", \"vehicleAxleWeight\",\n \"vehicleLength\", \"vehicleWidth\", \"vehicleHeight\", \"vehicleCommercial\", \"vehicleHeading\"];\n\n function isEmpty(values) {\n return !values || !values.length;\n }\n\n function getMultipleParamQueryString(values, name, firstParam) {\n if (isEmpty(values)) {\n return \"\";\n }\n return (firstParam ? \"?\" : \"&\") + name + \"=\" + values.join(\"&\" + name + \"=\");\n }\n\n return {\n calculateRoute: function (options, callback) {\n var pathParams = {},\n queryParams = {},\n queryStringAvoid,\n queryStringVehicleLoadType;\n\n queryParams.key = utils.or(options.key, security.getKey(\"services/routing\"));\n\n pathParams.locations = utils.required(options.locations);\n\n // language\n queryParams.language = utils.or(options.language, \"en-GB\");\n\n // look for not required passed params and set them if they are not undefined\n utils.extractQueryParams(options, queryParams, queryParamNames);\n\n queryStringAvoid = getMultipleParamQueryString(options.avoid, \"avoid\", true);\n queryStringVehicleLoadType = getMultipleParamQueryString(options.vehicleLoadType, \"vehicleLoadType\", !queryStringAvoid);\n\n // Define service call\n var baseUrl = utils.required(utils.or(options.baseUrl, \"{protocol}://api.tomtom.com/routing/1/\"));\n var serviceUrl = utils.required(utils.or(options.serviceUrl, \"calculateRoute/{locations}/{contentType}\"));\n\n http.get({\n url: baseUrl + serviceUrl + queryStringAvoid + queryStringVehicleLoadType,\n pathParameters: pathParams,\n queryParameters: queryParams,\n callbackParam: \"callback\",\n callback: callback,\n fail: options.fail\n });\n }\n };\n});\n\n","define('model/routing/routing',[], function () {\n \"use strict\";\n\n function newFeature(summary, isMultiLineString) {\n return {\n type: \"Feature\",\n geometry: {type: isMultiLineString ? \"MultiLineString\" : \"LineString\", coordinates: []},\n properties: {summary: summary, segmentSummary: []}\n };\n }\n\n function newFeatureCollection() {\n return {\n type: \"FeatureCollection\",\n features: []\n };\n }\n\n function getCoordinates(points) {\n var coordinates = [];\n for (var i = 0; i < points.length; i += 1) {\n coordinates.push([points[i].longitude, points[i].latitude]);\n }\n return coordinates;\n }\n\n function getRouteFeature(route) {\n var isMultiLineString = route.legs.length > 1;\n var feature = newFeature(route.summary, isMultiLineString);\n for (var i = 0; i < route.legs.length; i += 1) {\n feature.properties.segmentSummary.push(route.legs[i].summary);\n if (isMultiLineString) {\n feature.geometry.coordinates.push(getCoordinates(route.legs[i].points));\n } else {\n feature.geometry.coordinates = getCoordinates(route.legs[i].points);\n }\n }\n if (route.guidance) {\n feature.properties.guidance = route.guidance;\n }\n return feature;\n }\n\n return function (data) {\n var result = newFeatureCollection();\n if (!data || !data.routes) {\n return result;\n }\n for (var i = 0; i < data.routes.length; i += 1) {\n result.features.push(getRouteFeature(data.routes[i]));\n }\n return result;\n };\n});\n\n","/**\n * Routing service implementation. It allows to obtain route between to locations.\n *\n * The tomtom.routing() method creates a new instance of service. Parameters can be passed on creation or provided via\n * convenient functions that can be chained. The method go() performs the actual call.\n *\n * The call is asynchronous therefore user have two options to handle response, either by passing callback function or\n * by using [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). The\n * SDK provides polyfill for browsers (IE<9) without native Ecma Script 6 promise support.\n *\n * The types used in routing service:\n *\n * point - Latitude, longitude pair (in EPSG4326 projection), with the following constraints: Latitude values must be\n * in the range -90..+90 inclusive. Longitude values must be in the range -180..+180 inclusive. Example:\n * 52.37245,4.89406\n *\n * circle - A circle with a center point and a radius (in meters).\n * The radius must be a positive integer with the maximum value of 20050000.\n * Note that larger integer values will not be rejected but lowered to the maximum value. Example:\n * circle(52.37245,4.89406,10000)\n *\n * location - A point or a circle. Example: 52.37245,4.89406 circle(52.37245,4.89406,10000)\n *\n * dateTime - A date and time specified in RFC-3339 format with an optional time zone offset. Example:\n * 1996-12-19T16:39:57 1996-12-19T16:39:57-08:00\n *\n * @class routing\n */\ndefine('services/routing',[\"rest/routing\", \"model/routing/routing\", \"./chain\", \"./validators\", \"./converters\"],\n function (routing, model, chain, validators, converters) {\n \"use strict\";\n\n var LANGUAGE = {\n Afrikaans_South_Africa: \"ar-ZA\",\n Arabic: \"ar\",\n Bulgarian: \"bg-BG\",\n Chinese_Taiwan: \"zh-TW\",\n Czech: \"cs-CZ\",\n Danish: \"da-DK\",\n Dutch: \"nl-NL\",\n English_GB: \"en-GB\",\n English_US: \"en-US\",\n Finnish: \"fi-FI\",\n French: \"fr-FR\",\n German: \"de-DE\",\n Greek: \"el-GR\",\n Hungarian: \"hu-HU\",\n Indonesian: \"id-ID\",\n Italian: \"it-IT\",\n Korean: \"ko-KR\",\n Lithuanian: \"lt-LT\",\n Malay: \"ms-MY\",\n Norwegian: \"nb-NO\",\n Polish: \"pl-PL\",\n Portuguese_Brazil: \"pt-BR\",\n Portuguese_Portugal: \"pt-PT\",\n Russian: \"ru-RU\",\n Slovak: \"sk-SK\",\n Slovenian: \"sl-SI\",\n Spanish: \"es-ES\",\n Spanish_Mexico: \"es-MX\",\n Swedish: \"sv-SE\",\n Thai: \"th-TH\",\n Turkish: \"tr-TR\"\n };\n\n var fields = {\n\n /**\n * A setter and getter for _'key'_ attribute. Key can be set globally when initializing map, with\n * tomtom.key or tomtom.routingKey function. But also per service instance on initialization or with this\n * method.\n *\n * @method key\n * @chainable\n * @param {String} key API Key valid for requested service.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or key value if argument\n * is omitted.\n */\n key: {validator: validators.string},\n\n /**\n * A setter and getter for 'locations' attribute. Locations through which the route is calculated. The\n * following constraints apply: At least two locations must be provided. The first location in the sequence\n * defines the origin and must be of type point. The last location in the sequence defines the destination\n * and must be of type point. One or more optional intermediate locations (known as waypoints) may be\n * provided: The maximum allowed number of waypoints is 50, reduced to 20 when computeBestOrder is true. A\n * point waypoint results in an extra leg in the response, a circle waypoint does not. Circle waypoints\n * cannot be used when computeBestOrder is true.\n *\n * The points or circles that will be used to calculate the route. Following input types are allowed:\n * 1. string with Colon-delimited locations. For example\n * 2. array containing locations\n * location can be defined as string,object or array\n *\n * @method locations\n * @chainable\n * @param {String|Array} [locations] This is the specified locations for route calculation.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or converted locations\n * value if argument is omitted.\n */\n locations: {validator: validators.routingLocations, converter: converters.routingLocations, required: true},\n\n /**\n * A setter and getter for 'maxAlternatives' attribute.\n * Number of desired alternative routes to be calculated. The value provided:\n * must be an integer in the range 0-5\n * using a value greater than 0 in conjunction with computeBestOrder set to true is not allowed\n * fewer alternative routes may be returned if either fewer alternatives exist or the requested number of\n * alternatives is larger than the service can calculate Default value is 0, Maximum value is 5\n *\n * @method maxAlternatives\n * @chainable\n * @param {Number} [maxAlternatives] To restrict maximum alternative routes to be calculated.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Number} Method returns the service instance allowing chaining or maxAlternatives value\n * if argument is omitted.\n */\n maxAlternatives: {validator: validators.numberInInterval(0, 5)},\n\n /**\n * A setter and getter for 'routeType' attribute.\n * The type of route requested. Notes on specific values:\n * fastest returns the fastest route.\n * shortest returns the shortest route by distance.\n * eco routes balance economy and speed.\n * thrilling routes include interesting or challenging roads and use as few motorways as possible. You can\n * choose the level of turns included and also the degree of hilliness. See the hilliness and windingness\n * parameters for how to set this. There is a limit of 900 km on routes planned with routeType=thrilling\n * Default value is fastest\n *\n * @method routeType\n * @chainable\n * @param {String} [routeType] Route type to be used during route calculation.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or route type value if\n * argument is omitted.\n */\n routeType: {validator: validators.oneOfValue([\"fastest\", \"shortest\", \"eco\", \"thrilling\"], \"route type\")},\n\n /**\n * A setter and getter for 'traffic' attribute.\n * Possible values:\n * true (do consider all available traffic information during routing)\n * false (ignore current traffic data during routing). Note that although the current traffic data is\n * ignored during routing, the effect of historic traffic on effective road speeds is still incorporated.\n * Default is true\n *\n * @method traffic\n * @chainable\n * @param {String|Boolean} [traffic] Boolean flag determine if traffic data should be used to calculate the\n * route.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Boolean} Method returns the service instance allowing chaining or traffic value if\n * argument is omitted.\n */\n traffic: {validator: validators.bool},\n\n /**\n * A setter and getter for 'avoid' attribute.\n * Specifies something that the route calculation should try to avoid when determining the route. Can be\n * specified multiple times. Possible values: tollRoads avoids toll roads. motorways avoids motorways.\n * ferries avoids ferries. unpavedRoads avoids unpaved roads. carpools avoids routes that require use of\n * carpool (HOV/ High Occupancy Vehicle) lanes. alreadyUsedRoads avoids using the same road multiple times.\n * Most useful in conjunction with routeType=thrilling.\n *\n * @method avoid\n * @chainable\n * @param {Array|String} [avoid] Specifies something that the route calculation should try to avoid when\n * determining the route\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Array} Method returns the service instance allowing chaining or street number value if\n * argument is omitted.\n */\n avoid: {\n validator: validators.arrayOfValues([\"tollRoads\", \"motorways\", \"ferries\", \"unpavedRoads\", \"carpools\",\n \"alreadyUsedRoads\"], \"avoid\"),\n converter: converters.arrayOfStrings\n },\n\n /**\n * A setter and getter for 'instructionsType' attribute.\n * If specified, guidance instructions will be returned (if available).\n *\n * Possible values:\n * * _coded_ returns raw instruction data without human-readable messages.\n * * _text_ returns raw instructions data with human-readable messages in plain text.\n * * _tagged_ returns raw instruction data with tagged human-readable messages to permit formatting.\n *\n * Note that the instructionsType parameter cannot be used in conjunction with routeRepresentation=none.\n * If alternative routes are requested, instructions will be generated for each route returned.\n *\n * @method instructionsType\n * @chainable\n * @param {String} [instructionsType] If a street number is sent in along with the request, the response\n * may include the side of the street (Left/Right) and also an offset position for that street number.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or street number value if\n * argument is omitted.\n */\n instructionsType: {validator: validators.oneOfValue([\"coded\", \"text\", \"tagged\"], \"instructions type\")},\n\n /**\n * A setter and getter for 'language' attribute.\n * The language parameter determines the language of the guidance messages. It does not affect proper nouns\n * (the names of streets, plazas, etc.) It has no effect when instructionsType=coded. Allowed values are (a\n * subset of) the IETF language tags described here. The currently supported languages are listed in the\n * supported languages section below.\n *\n * @method language\n * @chainable\n * @param {String} [language] The language value\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or language if argument\n * is omitted.\n */\n language: {validator: validators.routingGuidanceLanguage, converter: converters.routingGuidanceLanguage},\n\n /**\n * A setter and getter for 'departAt' attribute.\n * The date and time of departure from the origin point.\n * Departure times apart from now must be specified as a dateTime.\n * When a time zone offset is not specified, it will be assumed to be that of the origin point.\n * The departAt value must be in the future. The departAt parameter cannot be used in conjunction with\n * arriveAt.\n *\n * @method departAt\n * @chainable\n * @param {String} [departAt] The properly formatted date with time or 'now' value. Date cannot be in the\n * past.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or language if argument\n * is omitted.\n */\n departAt: {validator: validators.departAt, converter: converters.dateTime},\n\n /**\n * A setter and getter for 'arriveAt' attribute.\n * The date and time of arrival at the destination point.\n * It must be specified as a dateTime.\n * When a time zone offset is not specified it will be assumed to be that of the destination point.\n * The arriveAt value must be in the future. The arriveAt parameter cannot be used in conjunction with\n * departAt.\n *\n * @method arriveAt\n * @chainable\n * @param {String} [arriveAt] The properly formatted date with time value. Date cannot be in the past.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or language if argument\n * is omitted.\n */\n arriveAt: {validator: validators.arriveAt, converter: converters.dateTime},\n\n /**\n * A setter and getter for 'computeBestOrder' attribute. Allows to reorder the route waypoints to reduce\n * the route length. Yields best results when used in conjunction with routeType shortest. Possible values:\n * true (compute a better order, if possible; not allowed to be used in conjunction with maxAlternatives\n * value greater than 0; not allowed to be used in conjunction with circle waypoints). The response will\n * include the optimized waypoint indices. This feature can be used with a maximum of 20 route waypoints.\n * false (use the locations in the given order). Not allowed to be used in conjunction with\n * routeRepresentation none.\n *\n * @method computeBestOrder\n * @chainable\n * @param {String} [computeBestOrder] Flag to reorder the route waypoints to reduce the route length\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or language if argument\n * is omitted.\n */\n computeBestOrder: {validator: validators.bool},\n\n /**\n * A setter and getter for 'routeRepresentation' attribute.\n * Specifies the representation of the set of routes provided as response. Possible values:\n * * _polyline_ includes routes in the response.\n * * _none_ includes only the optimized waypoint indices but does not include the routes in the response.\n *\n * This parameter value can only be used in conjunction with computeBestOrder true.\n *\n * @method routeRepresentation\n * @chainable\n * @param {String} [routeRepresentation] Allows the routing response to omit the actual route and give only\n * the best ordered waypoints.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or language if argument\n * is omitted.\n */\n routeRepresentation: {validator: validators.oneOfValue([\"polyline\", \"none\"], \"route representation\")},\n\n /**\n * A setter and getter for 'travelMode' attribute.\n * The mode of travel for the requested route. Possible values: _car, truck, taxi, bus, van, motorcycle,\n * bicycle, pedestrian_ Note that the requested travelMode may not be available for the entire route. Where\n * the requested travelMode is not available for a particular section, the element of the\n * response for that section will be other.\n *\n * @method travelMode\n * @chainable\n * @param {String} [travelMode] The primary mean of transportation to be used while routing.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or language if argument\n * is omitted.\n */\n travelMode: {\n validator: validators.oneOfValue([\"car\", \"truck\", \"taxi\", \"bus\", \"van\", \"motorcycle\", \"bicycle\",\n \"pedestrian\"], \"travel mode\")\n },\n\n /**\n * A setter and getter for 'hilliness' attribute.\n * Degree of hilliness for thrilling route. Possible values: low, normal, high\n * This parameter can only be used in conjunction with routeType thrilling.\n *\n * @method hilliness\n * @chainable\n * @param {String} [hilliness] The level of hilliness on a thrilling route.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or language if argument\n * is omitted.\n */\n hilliness: {validator: validators.oneOfValue([\"low\", \"normal\", \"high\"], \"hilliness\")},\n\n /**\n * A setter and getter for 'windingness' attribute.\n * Level of turns for thrilling route. Possible values: low, normal, high\n * This parameter can only be used in conjunction with routeType thrilling.\n *\n * @method windingness\n * @chainable\n * @param {String} [windingness] The level of windingness on a thrilling route.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or language if argument\n * is omitted.\n */\n windingness: {validator: validators.oneOfValue([\"low\", \"normal\", \"high\"], \"windingness\")},\n\n /**\n * A setter and getter for 'report' attribute.\n * Specifies which data should be reported for diagnosis purposes. Possible values: _effectiveSettings_\n * Reports the effective parameters or data used when calling the API.\n * In the case of defaulted parameters the default will be reflected where the parameter was not specified\n * by the caller.\n *\n * @method report\n * @chainable\n * @param {String} [report] Level of verbose answer from service, useful for debugging purposes.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or language if argument\n * is omitted.\n */\n report: {validator: validators.oneOfValue([\"effectiveSettings\"], \"report\")},\n\n /**\n * A setter and getter for 'computeTravelTimeFor' attribute.\n * Specifies whether to return additional travel times using different types of traffic information (none,\n * historic, live) as well as the default best-estimate travel time. Possible values:\n * * none - do not compute additional travel times,\n * * all - compute travel times for all types of traffic information. Specifying all results in the fields\n * noTrafficTravelTimeInSeconds, historicTrafficTravelTimeInSeconds and\n * liveTrafficIncidentsTravelTimeInSeconds being included in the summaries in the route response.\n *\n * @method computeTravelTimeFor\n * @chainable\n * @param {String} [computeTravelTimeFor] Setting _all_ provides additional information regards travel\n * times.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n computeTravelTimeFor: {validator: validators.oneOfValue([\"none\", \"all\"], \"compute travel time for\")},\n\n /**\n * A setter and getter for 'vehicleEngineType' attribute.\n * Engine type of the vehicle. This parameter is currently only considered for travelMode truck. Valid\n * options are: _combustion, electric_\n *\n * @method vehicleEngineType\n * @chainable\n * @param {String} [vehicleEngineType] The vehicle engine type.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n vehicleEngineType: {validator: validators.oneOfValue([\"combustion\", \"electric\"], \"vehicle engine type\")},\n\n /**\n * A setter and getter for 'vehicleMaxSpeed' attribute.\n * Maximum speed of the vehicle in km/hour. A value of 0 means that an appropriate value for the vehicle\n * will be determined and applied during route planning. A non-zero value may be overridden during route\n * planning. This parameter is currently only considered for travelMode truck.\n *\n * @method vehicleMaxSpeed\n * @chainable\n * @param {Integer} [vehicleMaxSpeed] The maximal allowed vehicle speed in km/h.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Integer} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n vehicleMaxSpeed: {validator: validators.naturalInteger},\n\n /**\n * A setter and getter for 'vehicleWeight' attribute.\n * Weight of the vehicle in kg. A value of 0 means that weight restrictions are not considered during route\n * planning. This parameter is currently only considered for travelMode truck.\n *\n * @method vehicleWeight\n * @chainable\n * @param {Integer} [vehicleWeight] The vehicle weight in kg.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Integer} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n vehicleWeight: {validator: validators.naturalInteger},\n\n /**\n * A setter and getter for 'vehicleAxleWeight' attribute.\n * Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not\n * considered during route planning. This parameter is currently only considered for travelMode truck.\n *\n * @method vehicleAxleWeight\n * @chainable\n * @param {Integer} [vehicleAxleWeight] The vehicle axle wight in kg.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Integer} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n vehicleAxleWeight: {validator: validators.naturalInteger},\n\n /**\n * A setter and getter for 'vehicleLength' attribute.\n * Length of the vehicle in meters. A value of 0 means that length restrictions are not considered during\n * route planning. This parameter is currently only considered for travelMode truck.\n *\n * @method vehicleLength\n * @chainable\n * @param {Float} [vehicleLength] The vehicle length in m.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Float} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n vehicleLength: {validator: validators.numberInInterval(0, Number.MAX_VALUE)},\n\n /**\n * A setter and getter for 'vehicleWidth' attribute.\n * Width of the vehicle in meters. A value of 0 means that width restrictions are not considered during\n * route planning. This parameter is currently only considered for travelMode truck.\n *\n * @method vehicleWidth\n * @chainable\n * @param {Float} [vehicleWidth] The vehicle width in m.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Float} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n vehicleWidth: {validator: validators.numberInInterval(0, Number.MAX_VALUE)},\n\n /**\n * A setter and getter for 'vehicleHeight' attribute.\n * Height of the vehicle in meters. A value of 0 means that height restrictions are not considered\n * during route planning. This parameter is currently only considered for travelMode truck.\n *\n * @method vehicleHeight\n * @chainable\n * @param {Float} [vehicleHeight] The vehicle height in m.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Float} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n vehicleHeight: {validator: validators.numberInInterval(0, Number.MAX_VALUE)},\n\n /**\n * A setter and getter for 'vehicleCommercial' attribute.\n * Vehicle is used for commercial purposes and thus may not be allowed to drive on some roads. This\n * parameter is currently only considered for travelMode truck.\n *\n * @method vehicleCommercial\n * @chainable\n * @param {Boolean} [vehicleCommercial] True if vehicle is used for commercial purposes.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|String} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n vehicleCommercial: {validator: validators.bool},\n\n /**\n * A setter and getter for 'vehicleHeading' attribute.\n * The directional heading of the vehicle in degrees starting at true North and continuing in clockwise\n * direction. North is 0 degrees, east is 90 degrees, south is 180 degrees, west is 270 degrees. Possible\n * values 0-359.\n *\n * @method vehicleHeading\n * @chainable\n * @param {Integer} [vehicleHeading] The angle in which the vehicle is heading.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Integer} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n vehicleHeading: {validator: validators.integerInInterval(-1, 359)},\n\n /**\n * A setter and getter for 'vehicleLoadType' attribute.\n * Types of cargo that may be classified as hazardous materials and restricted from some roads. Available\n * vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other\n * countries.\n *\n * __Use these for routing in US__\n * * USHazmatClass1 Explosives\n * * USHazmatClass2 Compressed gas\n * * USHazmatClass3 Flammable liquids\n * * USHazmatClass4 Flammable solids\n * * USHazmatClass5 Oxidizers\n * * USHazmatClass6 Poisons\n * * USHazmatClass7 Radioactive\n * * USHazmatclass8 Corrosives\n * * USHazmatClass9 Miscellaneous\n *\n * __Use these for routing in all other countries__\n * * otherHazmatExplosive Explosives\n * * otherHazmatGeneral Miscellaneous\n * * otherHazmatHarmfulToWater Harmful to water\n *\n * This parameter is currently only considered for travelMode truck.\n *\n * @method vehicleLoadType\n * @chainable\n * @param {Array|String} [vehicleLoadType] The array of truck cargo classification.\n * @throws {TypeError} if the given argument cannot be converted to a valid value\n * @return {routing|Array} Method returns the service instance allowing chaining or current value if\n * argument is omitted.\n */\n vehicleLoadType: {\n validator: validators.arrayOfValues([\"USHazmatClass1\", \"USHazmatClass2\", \"USHazmatClass3\",\n \"USHazmatClass4\", \"USHazmatClass5\", \"USHazmatClass6\", \"USHazmatClass7\", \"USHazmatClass8\",\n \"USHazmatClass9\", \"otherHazmatExplosive\", \"otherHazmatGeneral\", \"otherHazmatHarmfulToWater\"],\n \"vehicle load type\"),\n converter: converters.arrayOfStrings\n },\n\n /**\n * A setter and getter for _'protocol'_ attribute. Represents type of protocol used to perform service call.\n *\n * @method protocol\n * @chainable\n * @param {String} [protocol] Protocol type, one of _http_ or _https_.\n * @throws {TypeError} If the given argument cannot be converted to a valid value.\n * @return {routing|String} Method returns the service instance allowing chaining or _protocol_\n * value if argument is omitted.\n */\n protocol: {validator: validators.oneOfValue([\"http\", \"https\"], \"protocol\")},\n baseUrl: {validator: validators.string},\n serviceUrl: {validator: validators.string}\n };\n\n /**\n * The function performing actual call to the web service. This method can be executed multiple times, it is\n * not changing parameters itself.\n *\n * Callback function takes a response parameter and fail callback takes error as only parameter.\n *\n * @method go\n * @param {Function} [callback] The callback function to be called on success.\n * @param {Function} [fail] The callback function to be called on failure. If success callback is not passed\n * fail callback is ignored. Returned promise can handle exceptional behaviour i.e. with then() method.\n * @return {Promise} If callback is omitted function returns promise\n *\n * @example\n * ```javascript\n *\n * var myFunction = function(result) { console.log(result); };\n * // this is optional if you passed global key earlier\n * tomtom.routingKey();\n * var routing =\n * tomtom.routing().locations('52.3679,4.8786:52.3678,4.8797').go(myFunction);\n * ```\n */\n /**\n * A setter and getter for callback function. This function is called after receiving successful response from\n * service. It takes one argument which is the response - JSON described in go() function documentation.\n *\n * @method callback\n * @chainable\n * @param {Function} [callback] The callback function to be called on success.\n * @throws {TypeError} if the given argument is not a function\n * @return {routing} Method returns the service instance allowing chaining or function if argument is omitted.\n */\n /**\n * A setter and getter for the fail callback function. This function is called after an unsuccessful response\n * from the service or after a communication error. It takes one argument which is the error description.\n *\n * This parameter is ignored if callback function is not passed and therefore promise mechanism is used to\n * handle the response. When using promises, errors are handled with the second attribute of the then() method\n * or with the catch() method.\n *\n * By default the fail function is:\n * ```javascript\n *\n * function(error) {\n * console.error(error);\n * throw new Error(error);\n * }\n * ```\n * @method fail\n * @chainable\n * @param {Function} [fail] The callback function to be called on a failure. By default, an error is logged on\n * the console and thrown.\n * @throws {TypeError} If the given argument is not a function.\n * @return {routing|Function} Returns the service instance that allows chaining or a function, if the argument\n * is omitted.\n */\n function handleChain(data, callback) {\n routing.calculateRoute(data, function (response) {\n callback.call(this, model(response));\n });\n }\n\n /**\n * The method to instantiates the routing service. The options can be passed on creation or later during the\n * execution using function with the name matching parameter name. Each option can be retrieved using the\n * exactly same function but without parameter. The instance of service can be reused by calling multiple times\n * go() function.\n *\n * @method routing\n * @param {Object} [options] Options to be passed to the routing call.\n * @param {String} [options.key=global API key] The API key to be used.\n * @param {String} [options.locations] Locations through which the route is calculated\n * @param {String} [options.contentType] The content type of the response structure\n * @param {String} [options.maxAlternatives] Number of desired alternative routes to be calculated\n * @param {String} [options.routeType] The type of route requested.\n * @param {String} [options.traffic] consider all available traffic information during routing\n * @param {String} [options.avoid] Specifies something that the route calculation should try to avoid when\n * determining the route.\n * @param {String} [options.instructionsType] If specified, guidance instructions will be returned (if\n * available)\n * @param {String} [options.language] The language parameter determines the language of the guidance messages\n * @param {String} [options.departAt] The date and time of departure from the origin point\n * @param {String} [options.arriveAt] The date and time of arrival at the destination point\n * @param {String} [options.computeBestOrder] Re-order the route waypoints to reduce the route length\n * @param {String} [options.routeRepresentation] Specifies the representation of the set of routes provided as\n * response\n * @param {String} [options.travelMode] The mode of travel for the requested route\n * @param {String} [options.hilliness] Degree of hilliness for thrilling route\n * @param {String} [options.windingness] Level of turns for thrilling route\n * @param {Boolean} [options.protocol] Protocol's type, one of \"http\" or \"https\".\n *\n * @example\n * ```javascript\n *\n * tomtom.routing().locations('52.3,4.8:52.37,4.87').go().then(function(routeGeoJson) {\n * console.log(routeGeoJson);\n * });\n * ```\n */\n return function (options) {\n var serviceFunction = chain(fields, handleChain, options);\n serviceFunction.LANGUAGE = LANGUAGE;\n return serviceFunction;\n };\n });\n\n","/**\n * The location control. Provides a button with location capabilities.\n *\n * The tomtom.location() method creates a new instance of control.\n *\n * @class location\n */\ndefine('widgets/controls/location',['display/map'], function (L) {\n \"use strict\";\n\n var EVENTS = {\n LocationFound: \"locationFound\",\n LocationError: \"locationError\"\n };\n\n function getClassName(options) {\n return options.className || options.imageSrc ? options.className : \"icon-locate_me_btn\";\n }\n\n function setSizeStyle(style, size) {\n if (size) {\n style.width = size[0] + \"px\";\n style.height = size[1] + \"px\";\n style.backgroundSize = size[0] + \"px \" + size[1] + \"px\";\n }\n }\n\n var Location = L.Control.extend({\n\n includes: L.Mixin.Events,\n\n options: {\n imageSrc: null,\n size: L.Browser.retina ? [57, 57] : [34, 34],\n className: \"\"\n },\n\n createContainer: function () {\n var className = getClassName(this.options),\n container = L.DomUtil.create(\"div\", \"leaflet-control-location \" + className);\n setSizeStyle(container.style, this.options.size);\n container.style.cursor = \"pointer\";\n if (!L.Browser.svg || this.options.imageSrc) {\n var img = L.DomUtil.create(\"img\", \"\", container);\n img.src = this.options.imageSrc || L.Icon.Default.imagePath + \"/locate_me_btn.png\";\n img.style.cursor = \"pointer\";\n }\n return container;\n },\n\n /**\n * The method to instantiates the location control.\n * Executed when adding to map.\n *\n * @method onAdd\n * @param {Object} [map] Leaflet map to add control to.\n *\n * @example\n * ```javascript\n *\n * var locationInstance = tomtom.location().addTo(map);\n *\n * ```\n */\n onAdd: function (map) {\n var container = this.createContainer();\n\n L.DomEvent.addListener(container, \"mousedown\", map.locate, map);\n var control = this;\n map.on(\"locationfound\", function (location) {\n control.fire(EVENTS.LocationFound, location);\n });\n map.on(\"locationerror\", function (error) {\n control.fire(EVENTS.LocationError, error);\n });\n return container;\n },\n /**\n * Event that is fired when obtaining user's current location succeed.\n *\n * @event LocationFound\n * @param {Object} eventObject The found location details.\n * @param {String} type Event's name, equal to \"locationFound\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var locationInstance = tomtom.location().addTo(map);\n * locationInstance.on(locationInstance.Event.locationFound, function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n /**\n * Event that is fired when obtaining user's current location fails.\n *\n * @event LocationError\n * @param {Object} eventObject All failure information.\n * @param {String} type Event's name, equal to \"locationError\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var locationInstance = tomtom.location().addTo(map);\n * locationInstance.on(locationInstance.Event.LocationError, function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n Event: EVENTS\n });\n\n /**\n * The method to instantiates the location control. The options can be passed on creation.\n *\n * @method location\n * @param {Object} [options] Options to be passed to the routing call.\n * @param {String} [options.imageSrc] The image path for locate button. If this option is passed the button would\n * be created as an tag.\n * @param {Array} [options.size=[34,34]] Array of two integers (width, height). Allows to change size of the image,\n * a useful option for SVG images. By default 34 by 34, for retina display size is doubled.\n * @param {String} [options.className] The class name of container element. With this option external icon library\n * (i.e. Font Awsome) can be used for button display.\n *\n * @example\n * ```javascript\n *\n * var locationInstance = tomtom.location().addTo(map);\n *\n * locationInstance.on(locationInstance.Events.LocationFound, function (object) {\n * console.log('LocationFound');\n * console.log(object);\n * });\n *\n * locationInstance.on(locationInstance.Events.LocationError, function (object) {\n * console.log('LocationError');\n * console.log(object);\n * });\n *\n * ```\n */\n return function (options) {\n return new Location(options);\n };\n});\n","/**\n * The SearchBox view allows to create search control on a map.\n *\n * The tomtom.searchBox() method creates a new instance of SearchBox component.\n *\n * @class searchBox\n */\ndefine('widgets/controls/searchBox',[\"display/map\", \"services/search/fuzzySearch\", \"services/reverseGeocode/reverseGeocode\", \"widgets/controls/location\", \"services/utils\"],\n function (L, searchService, reverseGeocodeService, location, utils) {\n \"use strict\";\n\n var ENTER = 13, ARROWUP = 38, ARROWDOWN = 40,\n EVENTS = {\n ResultCreated: \"resultCreated\",\n ResultClicked: \"resultClicked\",\n ClearButtonClicked: \"clearButtonClicked\",\n ResultsCleared: \"resultsCleared\",\n ResultsFound: \"resultsFound\",\n ResultsDrawn: \"resultsDrawn\",\n SearchInputChanged: \"searchInputChanged\",\n LocationError: \"locationError\"\n };\n\n function searchBoxEvent(element, data, text) {\n return {element: element, data: data, text: text};\n }\n\n function locationError(control) {\n return function (error) {\n control.input.value = \"\";\n control.input.focus();\n control.clearResultsContainer();\n createResult(control);\n control.fire(EVENTS.LocationError, searchBoxEvent(control.input, error, error.message));\n console.error(error);\n };\n }\n\n function locationSuccess(control) {\n return function (location) {\n var options = utils.clone(control.options.serviceOptions);\n reverseGeocodeService(options).position(location.latlng).go(function (result) {\n result.position = location.latlng;\n control.clearResultsContainer();\n control.input.value = resolveResultText(result);\n control.input.focus();\n control.fire(EVENTS.ResultClicked, searchBoxEvent(control.locationIcon, result, control.input.value));\n });\n };\n }\n\n function createCurrentLocationButton(control) {\n control.location = location({size: null});\n control.locationIcon = control.location.onAdd(control._map);\n control.inputContainer.appendChild(control.locationIcon);\n control.location.on(control.location.Event.LocationFound, locationSuccess(control));\n control.location.on(control.location.Event.LocationError, locationError(control));\n }\n\n function createDOMElements(control) {\n var container = new L.DomUtil.create(\"div\", \"leaflet-control-search\");\n control._container = container;\n control.inputContainer = new L.DomUtil.create(\"div\", \"leaflet-control-search-input-container\", container);\n control.input = new L.DomUtil.create(\"input\", control.options.icon + \" leaflet-control-search-input\", control.inputContainer);\n control.input.required = true;\n control.clearButton = new L.DomUtil.create(\"div\", \"leaflet-control-search-input-close-icon icon-close-gray\", control.inputContainer);\n control.resultsContainer = new L.DomUtil.create(\"div\", \"leaflet-control-search-results-container\", container);\n if (control.options.location) {\n createCurrentLocationButton(control);\n }\n if (control.options.id) {\n control.input.id = control.options.id;\n }\n setHandlers(control, container);\n control.input.setAttribute(\"placeholder\", control.options.placeholder);\n return container;\n }\n\n function clearSearchBox() {\n this.input.focus();\n this.input.value = \"\";\n this.clearResultsContainer();\n this.fire(EVENTS.ClearButtonClicked, searchBoxEvent(this.clearButton));\n }\n\n function setHandlers(control, container) {\n L.DomEvent.disableClickPropagation(container);\n L.DomEvent.disableScrollPropagation(container);\n L.DomEvent.on(container, \"drag\", L.DomEvent.stopPropagation);\n L.DomEvent.on(container, \"keydown\", onKeyDown, control);\n L.DomEvent.on(container, \"input\", onInputChange(control), control);\n L.DomEvent.on(control._map, \"dragend\", onMapEndDrag, control);\n L.DomEvent.on(control.clearButton, \"click\", clearSearchBox, control);\n if (control.options.collapsible) {\n L.DomEvent.on(control.input, \"focus\", control.expand, control);\n L.DomEvent.on(control.input, \"blur\", control.collapse, control);\n if (control.options.collapsed === true) {\n control.collapse();\n }\n }\n }\n\n function createResult(control, resultData) {\n var result = L.DomUtil.create(\"div\", \"leaflet-control-search-result\", control.resultsContainer);\n result.innerHTML = resolveResultText(resultData) || \"No results found.\";\n control.resultsContainer.style.height = 'auto';\n highlightWords(result, control.input.value);\n control.fire(EVENTS.ResultCreated, searchBoxEvent(result, resultData));\n L.DomEvent.on(result, \"click\", function () {\n onResultSelect.call(control, resultData);\n }, control);\n L.DomEvent.on(result, \"mouseover\", function () {\n this.stopSearch = true;\n }, control);\n }\n\n function highlightWords(element, enteredText) {\n var words = enteredText.split(/[- ,]+/),\n regex = new RegExp(\"(\" + words.join(\"|\") + \")\", \"ig\"),\n highlighted = element.innerHTML;\n highlighted = highlighted.replace(regex, \"$1\");\n element.innerHTML = highlighted;\n }\n\n function handleResults(results) {\n this.clearResultsContainer();\n this.expand();\n this.fire(EVENTS.ResultsFound, searchBoxEvent(this.resultsContainer, results));\n this._searchResponses = results;\n if (!results || results.length === 0) {\n createResult(this);\n return;\n }\n for (var i = 0; i < results.length; i += 1) {\n createResult(this, results[i]);\n }\n this.resultsContainer.style.height = 'auto';\n this.fire(EVENTS.ResultsDrawn, searchBoxEvent(this.resultsContainer, results));\n }\n\n function onResultSelect(resultData) {\n if (!resultData) {\n return;\n }\n this.stopSearch = true;\n this.input.value = resolveResultText(resultData);\n this.clearResultsContainer();\n this.input.blur();\n this.fire(EVENTS.ResultClicked, searchBoxEvent(this.input, resultData, this.input.value));\n }\n\n function resolveResultText(resultData) {\n if (!resultData || !resultData.address) {\n return resultData;\n }\n return resultData.poi ? resultData.poi.name + \", \" + resultData.address.freeformAddress : resultData.address.freeformAddress;\n }\n\n function onInputChange(control) {\n var inputWaiting = false, throttle = false, ignorePrompt = false, lastCallTime, timerId;\n\n function performPromptSearch() {\n var currentCallTime = Date.now();\n if (control.input.value.length === 0) {\n return;\n }\n lastCallTime = currentCallTime;\n if (inputWaiting) {\n control.lastSearchText = \"\";\n searchService(getOptionsForSearch(control, true)).go(function (result) {\n if (!ignorePrompt && currentCallTime === lastCallTime) {\n handleResults.call(control, result);\n }\n });\n setTimeout(performPromptSearch, control.options.throttleTimePrompt);\n inputWaiting = false;\n throttle = true;\n } else {\n throttle = false;\n }\n }\n\n function performSearch() {\n ignorePrompt = true;\n throttle = true;\n inputWaiting = false;\n if (control.input.value.length === 0 || control.lastSearchText === control.input.value || control.stopSearch) {\n return;\n }\n control.lastSearchText = control.input.value;\n searchService(getOptionsForSearch(control)).go(function (result) {\n if (!control.stopSearch) {\n handleResults.call(control, result);\n }\n throttle = false;\n });\n }\n\n return function () {\n this.fire(EVENTS.SearchInputChanged, searchBoxEvent(this.input, this.input.value, this.input.value));\n control.stopSearch = false;\n\n if (timerId) {\n clearTimeout(timerId);\n }\n timerId = setTimeout(performSearch, control.options.idleTimeKeyPress);\n inputWaiting = this.input.value.length > 0;\n\n if (this.options.withPrompt && !throttle && this.input.value.length >= this.options.minNumberCharsPrompt) {\n ignorePrompt = false;\n performPromptSearch();\n }\n };\n }\n\n function onMapEndDrag() {\n if (this._searchResponses) {\n this.search(this.input.value);\n }\n }\n\n function onKeyDown(event) {\n var code = event.keyCode || event.which,\n selectedResult = this.resultsContainer.getElementsByClassName(\"highlight\")[0];\n\n if (code === ENTER && this.input.value) {\n if (selectedResult) {\n var selectedResultIndex = [].indexOf.call(this.resultsContainer.children, selectedResult);\n onResultSelect.call(this, this._searchResponses[selectedResultIndex]);\n } else {\n this.search(this.input.value);\n }\n }\n\n if (this.resultsContainer.hasChildNodes()) {\n if (code === ARROWUP || code === ARROWDOWN) {\n this.stopSearch = true;\n highlightNextResult.call(this, code, selectedResult, this.resultsContainer);\n }\n }\n }\n\n function highlightNextResult(keyCode, selectedElement, resultsContainerElement) {\n var highlightClass = \"highlight\",\n rules = {\n 38: {\n edgeCase: \"firstChild\",\n nextSibling: \"previousElementSibling\",\n nextAfterEdgeCase: \"lastChild\"\n },\n 40: {\n edgeCase: \"lastChild\",\n nextSibling: \"nextElementSibling\",\n nextAfterEdgeCase: \"firstChild\"\n }\n },\n newlySelectedElement;\n if (selectedElement) {\n selectedElement.className = selectedElement.className.replace(highlightClass, \"\");\n }\n\n if (!selectedElement || selectedElement === resultsContainerElement[rules[keyCode].edgeCase]) {\n newlySelectedElement = resultsContainerElement[rules[keyCode].nextAfterEdgeCase];\n } else {\n newlySelectedElement = selectedElement[rules[keyCode].nextSibling];\n }\n\n newlySelectedElement.className += \" \" + highlightClass;\n }\n\n function getOptionsForSearch(control, typeahead) {\n var options = utils.clone(control.options.serviceOptions);\n options.query = control.input.value;\n if (control.options.viewportBoundingBox) {\n options.boundingBox = control._map.getBounds();\n } else {\n options.center = control._map.getCenter();\n }\n if (control.options.disablePOIs) {\n options.idxSet = \"PAD,Str,Xstr,Geo,Addr\";\n }\n options.typeahead = !!typeahead;\n return options;\n }\n\n var SearchBox = L.Control.extend({\n\n includes: L.Mixin.Events,\n\n options: {\n placeholder: \"Search for place...\",\n id: false,\n collapsible: true,\n collapsed: false,\n location: false,\n icon: \"icon-search\",\n disablePOIs: false,\n viewportBoundingBox: false,\n minNumberCharsPrompt: 3,\n throttleTimePrompt: 1000,\n idleTimeKeyPress: 400,\n serviceOptions: {},\n position: 'topleft',\n withPrompt: true\n },\n initialize: function (options) {\n L.Util.setOptions(this, options);\n },\n onAdd: function () {\n return createDOMElements(this);\n },\n onRemove: function () {\n this.clearAllEventListeners();\n },\n /**\n * Method used to clear container of search call results.\n *\n * @method clearResultsContainer\n */\n clearResultsContainer: function () {\n if (this.resultsContainer.hasChildNodes()) {\n this.resultsContainer.style.height = '0px';\n this.resultsContainer.innerHTML = \"\";\n this._searchResponses = undefined;\n this.fire(EVENTS.ResultsCleared, searchBoxEvent(this.resultsContainer));\n }\n },\n /**\n * Method used to set data into searchBox without calling a service.\n *\n * @method setResultData\n * @param {Object} resultData Result data given from search service. Must contain address and/or POI\n * information.\n *\n * @example\n * ```javascript\n *\n * var searchBoxInstance = searchBox().addTo(map);\n *\n * var resultData = {\n * address: {freeformAddress: \"Amsterdam\"},\n * poi: { name: \"TomTom, Oosterdoksstraat, Amsterdam, The Netherlands\" }\n * }\n * searchBoxInstance.setResultData(resultData);\n * ```\n */\n setResultData: function (resultData) {\n if (resultData) {\n this.input.value = resolveResultText(resultData);\n this.clearResultsContainer();\n this.input.blur();\n }\n },\n /**\n * Method used to call a search service with given data.\n *\n * @method search\n * @param {Object} text String object or reverse geocoding object (with query parameter) as a search\n * query.\n *\n * @example\n * ```javascript\n *\n * var searchBoxInstance = searchBox().addTo(map);\n * searchBoxInstance.search(\"Amsterdam\");\n *\n * var reversedGeocodeResponse = {query: \"Amsterdam\"}\n * searchBoxInstance.search(reversedGeocodeResponse);\n *\n * ```\n */\n search: function (text) {\n text = text.query || text;\n if (typeof text !== \"string\" || text.length === 0) {\n return;\n }\n this.input.focus();\n this.input.value = text;\n this.lastSearchText = text;\n var searchBox = this;\n searchService(getOptionsForSearch(searchBox)).go(function (results) {\n handleResults.call(searchBox, results);\n });\n },\n /**\n * Method used to collapse search. Collapsing is possible only if search is empty.\n *\n * @method collapse\n */\n collapse: function () {\n if (!this.input.value) {\n this._container.className += \" collapsed\";\n this.input.readOnly = true;\n this.clearResultsContainer();\n } else {\n this.expand();\n }\n },\n /**\n * Method used to expand collapsed search.\n *\n * @method expand\n */\n expand: function () {\n this._container.className = this._container.className.replace(/\\b collapsed\\b/, \"\");\n this.input.readOnly = false;\n },\n /**\n * Method used to get main container of a searchBox.\n *\n * @method getContainer\n *\n * @return {Node} HTML element representing container of a searchBox.\n */\n getContainer: function () {\n return this._container;\n },\n /**\n * Method used to get location element (if set and added).\n *\n * @method getLocation\n *\n * @return {Node} HTML element representing location element.\n */\n getLocation: function () {\n return this.location;\n },\n /**\n * Method used to set icon by styling search box input.\n *\n * @method setIcon\n * @param className Name of the CSS class that sets _background-image_ property for search box input.\n */\n setIcon: function (className) {\n if (typeof className === \"string\") {\n this.input.className = this.input.className.replace(/(icon)((-)(\\w+))*/, className);\n }\n },\n /**\n * Method used to add location icon.\n *\n * @method addLocationIcon\n */\n addLocationIcon: function () {\n if (this.location === undefined) {\n this.options.location = true;\n createCurrentLocationButton(this);\n }\n },\n /**\n * Method used to remove location icon.\n *\n * @method removeLocationIcon\n */\n removeLocationIcon: function () {\n if (this.location !== undefined) {\n this.options.location = false;\n this.locationIcon.parentNode.removeChild(this.locationIcon);\n this.location.clearAllEventListeners();\n this.location = undefined;\n }\n },\n /**\n * Whenever the input within the search box is changed by the user this event is triggered.\n *\n * @event SearchInputChanged\n * @param {Object} data The current text entered by the user.\n * @param {String} text Same as data.\n * @param {String} type Event's name, equal to \"searchInputChanged\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var searchBoxInstance = searchBox().addTo(map);\n * searchBoxInstance.on(searchBoxInstance.Event.SearchInputChanged, function (eventObject) {\n * console.log(eventObject.text);\n * });\n * ```\n */\n /**\n * This event appears when response from search service is being processed. For each result which is being\n * rendered on the prompt list such event is fired.\n *\n * @event ResultCreated\n * @param {Object} data The result from search service response that is being processed.\n * @param {String} type Event's name, equal to \"resultCreated\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var searchBoxInstance = searchBox().addTo(map);\n * searchBoxInstance.on(searchBoxInstance.Event.ResultCreated, function (eventObject) {\n * console.log(eventObject.data);\n * });\n * ```\n */\n /**\n * Event that is fired when user selects the result from list or when current location is identified.\n *\n * @event ResultClicked\n * @param {Object} data Selected result object from search service response.\n * @param {String} text The human readable string representation of selected result.\n * @param {String} type Event's name, equal to \"resultClicked\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var searchBoxInstance = searchBox().addTo(map);\n * searchBoxInstance.on(searchBoxInstance.Event.ResultClicked, function (eventObject) {\n * console.log(eventObject.text);\n * console.log(eventObject.data);\n * });\n * ```\n */\n /**\n * Event that is fired when the response from search service is already processed and rendered in a form\n * of list of possible results.\n *\n * @event ResultsDrawn\n * @param {Array} data Array of search service results. Each result has, among other parameters, its\n * _type_, _address_ and _position_.\n * @param {String} type Event's name, equal to \"resultsDrawn\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var searchBoxInstance = searchBox().addTo(map);\n * searchBoxInstance.on(searchBoxInstance.Event.ResultsDrawn, function (eventObject) {\n * console.log(eventObject.data);\n * });\n * ```\n */\n /**\n * Event that is fired when the response from search service appears for both normal and prompt query.\n *\n * @event ResultsFound\n * @param {Array} data Array of search service results. Each result has, among other parameters, its\n * _type_, _address_ and _position_.\n * @param {String} type Event's name, equal to \"resultsFound\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var searchBoxInstance = searchBox().addTo(map);\n * searchBoxInstance.on(searchBoxInstance.Event.ResultsFound, function (eventObject) {\n * console.log(eventObject.data);\n * });\n * ```\n */\n /**\n * Event that is fired when user clicks the clear search box input button.\n *\n * @event ClearButtonClicked\n * @param {String} type Event's name, equal to \"clearButtonClicked\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var searchBoxInstance = tomtom.searchBox().addTo(map);\n * searchBoxInstance.on(searchBoxInstance.Event.ClearButtonClicked, function () {\n * console.log(\"User clicked the clear button\");\n * });\n * ```\n */\n /**\n * Event that is fired when prompt results list is being cleared.\n *\n * @event ResultsCleared\n * @param {String} type Event's name, equal to \"resultsCleared\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var searchBoxInstance = tomtom.searchBox().addTo(map);\n * searchBoxInstance.on(searchBoxInstance.Event.LocationsCleared, function () {\n * console.log(\"Results were cleared\");\n * });\n * ```\n */\n /**\n * Event that is fired when obtaining user's current location fails.\n *\n * @event LocationError\n * @param {Object} eventObject All failure information.\n * @param {String} type Event's name, equal to \"locationError\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var searchBoxInstance = tomtom.searchBox().addTo(map);\n * searchBoxInstance.on(searchBoxInstance.Event.LocationError, function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n Event: EVENTS\n });\n\n /**\n * The method to instantiates the searchBox control.\n *\n * @method searchBox\n * @param {Object} [options] Options to be passed to the searchBox control.\n * @param {String} [options.placeholder=\"Search for place...\"] The placeholder text to be displayed inside\n * searchBox.\n * @param {String} [options.id] Id of a searchBox's DOM element.\n * @param {Boolean} [options.collapsed=false] Flag if checkbox is collapsed on initialization.\n * @param {Boolean} [options.collapsible=true] Flag if searchBox can be collapsed.\n * @param {Boolean} [options.location=false] Display location button to search for current location.\n * @param {String} [options.icon=\"icon-search\"] Determines icon of the searchBox.\n * @param {Boolean} [options.disablePOIs=false] Determines whether search results should not contain POIs.\n * @param {Boolean} [options.viewportBoundingBox=false] Enables or disables searching on a currently visible\n * map area. If unset, search service will use current map center.\n * @param {Boolean} [options.withPrompt=true] Should widget show user prompts while typing, the call will have\n * typeahead flag and will be throttled according to the following settings.\n * @param {Integer} [options.minNumberCharsPrompt=3] Sets the minimal required number of characters that are\n * required to perform search.\n * @param {Integer} [options.throttleTimePrompt=1000] Sets the minimal time between the following search\n * service calls when user types text into the input.\n * @param {Integer} [options.idleTimeKeyPress=400] Sets the time between following key press events to assume\n * the user finished typing the query.\n * @param {Object} [options.serviceOptions] Options to be passed to service. See search service options.\n *\n * @example\n * ```javascript\n *\n * // SearchBox with location button\n * var options = {\n * location: true\n * };\n *\n * var searchBoxInstance = searchBox(options).addTo(map);\n *\n * ```\n */\n return function (options) {\n return new SearchBox(options);\n };\n });\n","/**\n * The routeInputs view allows to manage many of search boxes.\n *\n * The tomtom.routeInputs() method creates a new instance of RouteInputs view.\n *\n * @class routeInputs\n */\ndefine('widgets/controls/routeInputs',[\"display/map\", \"widgets/controls/searchBox\", \"services/utils\"], function (L, searchBox, utils) {\n \"use strict\";\n\n var EVENTS = {\n LocationsFound: \"locationsFound\",\n LocationsCleared: \"locationsCleared\",\n LocationError: \"locationError\"\n }, LOCATION = {\n Start: \"start\",\n End: \"end\"\n }, WAYPOINT_PLACEMENT = {\n Last: \"last\",\n BeforeLast: \"beforeLast\"\n };\n\n function getLocationsFromSearchBoxes() {\n var locations = [];\n for (var i = 0; i < this.searchBoxes.length; i += 1) {\n locations.push(this.searchBoxes[i].selectedLocation);\n }\n return locations;\n }\n\n function updateSearchBoxIcons() {\n for (var i = 0; i < this.searchBoxes.length; i += 1) {\n var style = this.getIconClassName(i);\n this.searchBoxes[i].setIcon(style);\n }\n }\n\n function updateLocationButton() {\n for (var i = 0; i < this.searchBoxes.length; i += 1) {\n this.searchBoxes[i].removeLocationIcon();\n }\n var locationIconIndex = this.options.location === LOCATION.Start ? 0 : this.searchBoxes.length - 1;\n this.searchBoxes[locationIconIndex].addLocationIcon();\n }\n\n function showDeleteSearchBoxButton(searchBox) {\n if (searchBox.deleteIcon === undefined) {\n searchBox.deleteIcon = new L.DomUtil.create(\"div\", \"icon-trash-black leaflet-control-routeInputs-remove\");\n searchBox._container.insertBefore(searchBox.deleteIcon, searchBox.resultsContainer);\n L.DomEvent.on(searchBox.deleteIcon, \"click\", function () {\n this.removeInput(searchBox);\n }, this);\n }\n }\n\n function hideDeleteSearchBoxButton(searchBox) {\n if (searchBox.deleteIcon !== undefined) {\n searchBox.deleteIcon.parentNode.removeChild(searchBox.deleteIcon);\n searchBox.deleteIcon = undefined;\n }\n }\n\n function setVisibilityForDeleteButton(callback) {\n for (var i = 0; i < this.searchBoxes.length; i += 1) {\n callback.call(this, this.searchBoxes[i]);\n }\n }\n\n function updateDeleteSearchBoxButtons() {\n if (this.options.enableSearchBoxesModifcation === true) {\n if (this.searchBoxes.length === this.options.searchBoxes) {\n setVisibilityForDeleteButton.call(this, hideDeleteSearchBoxButton);\n } else {\n setVisibilityForDeleteButton.call(this, showDeleteSearchBoxButton);\n }\n }\n }\n\n function showInsertSearchBoxButton(container) {\n if (this.insertSearchBoxButton === undefined) {\n this.insertSearchBoxButton = new L.DomUtil.create(\"div\", \"icon-add-black leaflet-control-routeInputs-add\", container || this.getContainer());\n L.DomEvent.on(this.insertSearchBoxButton, \"click\", this.addInput, this);\n }\n }\n\n function hideInsertSearchBoxButton() {\n if (this.insertSearchBoxButton !== undefined) {\n L.DomEvent.off(this.insertSearchBoxButton, \"click\", this.addInput);\n this.insertSearchBoxButton.parentNode.removeChild(this.insertSearchBoxButton);\n this.insertSearchBoxButton = undefined;\n }\n }\n\n function updateInsertSearchBoxButton() {\n if (this.options.enableSearchBoxesModifcation === true) {\n for (var i = 0; i < this.searchBoxes.length; i += 1) {\n if (this.searchBoxes[i].input.value.length === 0) {\n hideInsertSearchBoxButton.call(this);\n return;\n }\n }\n showInsertSearchBoxButton.call(this);\n }\n }\n\n /**\n * The method to instantiate the routeInputs control.\n *\n * @method routeInputs\n * @param {Object} [options] Options to be passed to the routeInputs control.\n * @param {Number} [options.searchBoxes] Number of searchBoxes to be created.\n * @param {String} [options.position] Position of the control on a map.\n * @param {String} [options.location] Definition of place of creation location control. Might be equal: \"start\" or\n * \"end\".\n * @param {String} [options.enableSearchBoxesModifcation=false] Determines whether control should expose\n * functionality of adding or removing waypoints by internal controls.\n * @param {String} [options.waypointPlacement=\"beforeLast\"] Determines the place where new waypoint will added to.\n * There are two options: _\"beforeLast\"_ that adds waypoint before the last one and _\"last\"_ that\n * puts new waypoint at the end of the container.\n * @param {Object} [options.searchOptions] Options passed to the search service.\n *\n * @example\n * ```javascript\n *\n * // Route inputs with two search boxes and location control\n * var options = {\n * searchBoxes: 2,\n * location: routeInputs.Location.Start\n * };\n *\n * var routeInputsInstance = routeInputs(options).addTo(map);\n *\n * ```\n */\n\n var RouteInputs = L.Control.extend({\n\n includes: L.Mixin.Events,\n\n options: {\n searchBoxes: 2,\n position: \"topleft\",\n location: LOCATION.Start,\n enableSearchBoxesModifcation: false,\n waypointPlacement: WAYPOINT_PLACEMENT.BeforeLast,\n searchOptions: {\n collapsible: false\n }\n },\n initialize: function (options) {\n if (options !== undefined && options.searchOptions !== undefined) {\n utils.addFields(options.searchOptions, this.options.searchOptions);\n delete options.searchOptions;\n }\n L.Util.setOptions(this, options);\n this.searchBoxes = [];\n },\n onAdd: function () {\n var container = this.createContainer();\n this.searchBoxesContainer = new L.DomUtil.create(\"div\", \"leaflet-control-search-boxes\", container);\n for (var i = 0; i < this.options.searchBoxes; i += 1) {\n this.searchBoxes.push(this.createSearchBox(i));\n }\n return container;\n },\n /**\n * Method used to create container for search boxes.\n *\n * @method createContainer\n *\n * @return {Node} Container of search boxes.\n */\n createContainer: function () {\n var container = new L.DomUtil.create(\"div\", \"leaflet-control-routeInputs\");\n L.DomEvent.disableClickPropagation(container);\n L.DomEvent.disableScrollPropagation(container);\n return container;\n },\n\n /**\n * Method used to get search box icon's class name, depending on its position (index).\n * Extracted class name will be added to the input.\n *\n * @method getIconClassName\n *\n * @return {String} Class name that determines icon look by setting _background-image_ property.\n */\n getIconClassName: function (index) {\n var className = \"icon-flag-black\",\n lastSearchBoxIndex = this.options.searchBoxes > this.searchBoxes.length ? this.options.searchBoxes - 1 : this.searchBoxes.length - 1;\n if (index === 0) {\n className = \"icon-start-black\";\n } else if (index === lastSearchBoxIndex) {\n className = \"icon-end-black\";\n }\n return className;\n },\n /**\n * Method used to initialize search box by adding element to the container and applying event handlers on\n * it.\n *\n * @method createSearchBox\n * @param {Number} index Index of the search box (starting from 0).\n *\n * @return {Object} Modified search box object.\n */\n createSearchBox: function (index) {\n var options = utils.clone(this.options.searchOptions);\n options.location = this.needsLocationIcon(index);\n options.icon = this.getIconClassName(index);\n var searchBoxInstance = searchBox(options).addTo(this._map);\n\n this.searchBoxesContainer.insertBefore(searchBoxInstance.getContainer(), this.searchBoxesContainer.childNodes[index]);\n this.addSearchBoxEventHandlers(searchBoxInstance);\n return searchBoxInstance;\n },\n /**\n * Method used to remove given search box from the view by specific index.\n *\n * @method removeSearchBox\n * @param {Number} index Index of the search box (starting from 0).\n *\n * @return {Object} Modified search box object.\n */\n removeSearchBox: function (index) {\n var searchBox = this.searchBoxesContainer.childNodes[index];\n searchBox.parentNode.removeChild(searchBox);\n return searchBox;\n },\n /**\n * Method used to check if search box needs location element.\n *\n * @method needsLocationIcon\n * @param {Number} searchBoxIndex Index of the given search box (starting from 0).\n *\n * @return {Boolean} Returns information of presence of location element.\n */\n needsLocationIcon: function (searchBoxIndex) {\n var first = this.options.location === LOCATION.Start && searchBoxIndex === 0,\n last = this.options.location === LOCATION.End && searchBoxIndex === this.options.searchBoxes - 1;\n return first || last;\n },\n /**\n * Method used to add handlers for given search box. If obtaining user's current location fails,\n * Event.LocationError is fired.\n *\n * @method addSearchBoxEventHandlers\n * @param {Object} searchBox Search box instance used to add handlers on it.\n */\n addSearchBoxEventHandlers: function (searchBox) {\n var that = this;\n searchBox.on(searchBox.Event.ResultClicked, function (eventObject) {\n that.onLocationChange(eventObject);\n });\n searchBox.on(searchBox.Event.ClearButtonClicked, function (eventObject) {\n that.onLocationChange(eventObject);\n updateInsertSearchBoxButton.call(that);\n });\n searchBox.on(searchBox.Event.SearchInputChanged, function () {\n updateInsertSearchBoxButton.call(that);\n });\n if (searchBox.getLocation()) {\n searchBox.getLocation().on(searchBox.getLocation().Event.LocationError, function (eventObject) {\n that.fire(EVENTS.LocationError, eventObject);\n });\n }\n },\n /**\n * Method used to manage changing state of search boxes. Depending on the content of the searchBox, there might\n * be fired two events: Event.LocationsFound or Event.LocationsCleared.\n *\n * @method onLocationChange\n * @param {Object} eventObject Object that contains event's information: instance of search box and\n * position chosen within it\n */\n onLocationChange: function (eventObject) {\n var searchBox = eventObject.target;\n searchBox.selectedLocation = eventObject.data ? eventObject.data.position : undefined;\n\n this.fire(eventObject.data ? EVENTS.LocationsFound : EVENTS.LocationsCleared, {\n points: getLocationsFromSearchBoxes.call(this)\n });\n },\n /**\n * Method used to show notification when looking for current location fails.\n *\n * @method showLocationNotFoundMessageBox\n */\n showLocationNotFoundMessageBox: function () {\n L.messageBox({closeAfter: 1500}).openOn(this._map).setContent('Could not find your location');\n },\n\n /**\n * Method used to add searchBox to the specific position (index).\n *\n * @method addInput\n * @param {Number} [index] Represents position where searchBox should be added to. Not passing any index will\n * cause adding a searchBox at the end of list or before the last searchBox.\n *\n * @example\n * ```javascript\n *\n * var routeInputInstance = routeInputs().addTo(map);\n * routeInputInstance.addInput(0);\n * routeInputInstance.addInput();\n * ```\n */\n addInput: function (index) {\n if (index === undefined || index.target) {\n index = this.searchBoxes.length;\n if (this.options.waypointPlacement === WAYPOINT_PLACEMENT.BeforeLast) {\n index -= 1;\n }\n }\n this.searchBoxes.splice(index, 0, this.createSearchBox(index));\n updateSearchBoxIcons.call(this);\n updateLocationButton.call(this);\n updateDeleteSearchBoxButtons.call(this);\n updateInsertSearchBoxButton.call(this)\n },\n\n /**\n * Method used to remove searchBox from the specific position (index).\n *\n * @method removeInput\n * @param {Number|Object} searchBox Represents index of the searchBox to be deleted or the element itself.\n *\n * @example\n * ```javascript\n *\n * var routeInputInstance = routeInputs().addTo(map);\n * routeInputInstance.removeInput(0);\n * routeInputInstance.removeInput();\n * ```\n */\n removeInput: function (searchBox) {\n if (searchBox === undefined) {\n searchBox = this.searchBoxes.length - 1;\n } else if (typeof searchBox === \"object\") {\n var nodeList = Array.prototype.slice.call(this.searchBoxesContainer.children);\n searchBox = nodeList.indexOf(searchBox.getContainer());\n }\n this.removeSearchBox(searchBox);\n this.searchBoxes.splice(searchBox, 1);\n updateSearchBoxIcons.call(this);\n updateLocationButton.call(this);\n updateDeleteSearchBoxButtons.call(this);\n updateInsertSearchBoxButton.call(this);\n\n this.fire(EVENTS.LocationsCleared, {points: getLocationsFromSearchBoxes.call(this)});\n },\n\n /**\n * Event that is fired when locations in all searchBoxes are changing.\n *\n * @event LocationsFound\n * @param {Array} points Array of points that represents locations from all searchBoxes, even if they are\n * undefined.\n * @param {String} type Event's name, equal to \"locationsFound\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInputInstance = tomtom.routeInputs().addTo(map);\n * routeInputInstance.on(routeInputInstance.Event.LocationsFound, function (eventObject) {\n * console.log(eventObject.points);\n * });\n * ```\n */\n /**\n * Event that is fired when locations in all searchBoxes are being removed.\n *\n * @event LocationsCleared\n * @param {Array} points Array of points that represents locations from all searchBoxes, even if they are\n * undefined.\n * @param {String} type Event's name, equal to \"locationsCleared\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInputInstance = tomtom.routeInputs().addTo(map);\n * routeInputInstance.on(routeInputInstance.Event.LocationsCleared, function (eventObject) {\n * console.log(eventObject.points);\n * });\n * ```\n */\n /**\n * Event that is fired when obtaining user's current location fails.\n *\n * @event LocationError\n * @param {Object} eventObject All failure information.\n * @param {String} type Event's name, equal to \"locationError\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInputInstance = tomtom.routeInputs().addTo(map);\n * routeInputInstance.on(routeInputInstance.Event.LocationError, function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n Event: EVENTS\n });\n\n var routeInputConstructor = function (options) {\n return new RouteInputs(options);\n };\n /**\n * Determines the position that location icon will be added to.\n * Possible options are:\n * * _Location.Start_ - location will be added to the first searchBox in the list,\n * * _Location.End_ - location will be added to the last searchBox in the list.\n *\n * @property Location\n * @type {Object}\n *\n * @example\n * ```javascript\n *\n * var options = {location: tomtom.routeInputs.Location.Start};\n * var routeInputInstance = tomtom.routeInputs(options).addTo(map);\n * ```\n */\n routeInputConstructor.Location = LOCATION;\n\n /**\n * Determines the position where waypoint will be added to.\n * Possible options are:\n * * _WaypointPlacement.BeforeLast_ - new waypoint will be added before the last searchBox,\n * * _WaypointPlacement.Last_ - new waypoint will be added as the last element in the list.\n *\n * @property WaypointPlacement\n * @type {Object}\n *\n * @example\n * ```javascript\n *\n * var options = {waypointPlacement: tomtom.routeInputs.WaypointPlacement.BeforeLast};\n * var routeInputInstance = tomtom.routeInputs(options).addTo(map);\n * ```\n */\n routeInputConstructor.WaypointPlacement = WAYPOINT_PLACEMENT;\n\n return routeInputConstructor;\n});\n","/**\n * The RouteInstructions view allow to display a route instructions.\n *\n * The tomtom.routeInstructions() method creates a new instance of RouteInstructions control.\n *\n * @class routeInstructions\n */\ndefine('widgets/controls/routeInstructions',[\"display/map\", \"unitFormatConverter/unitFormatConverter\"], function (L, unitFormatConverter) {\n \"use strict\";\n\n var EVENTS = {\n InstructionClickedSelect: \"instructionClickedSelect\",\n InstructionClickedDeselect: \"instructionClickedDeselect\",\n InstructionHoverOn: \"instructionHoverOn\",\n InstructionHoverOff: \"instructionHoverOff\",\n InstructionGroupClickedCollapse: \"instructionGroupClickedCollapse\",\n InstructionGroupClickedExpand: \"instructionGroupClickedExpand\",\n InstructionGroupHoverOn: \"instructionGroupHoverOn\",\n InstructionGroupHoverOff: \"instructionGroupHoverOff\"\n },\n\n CSS_CLASS_NAME = \"leaflet-control-route-instructions\",\n\n MANOUVERS_WITH_LEFT_DRIVING_SIDE_VERSIONS = [\"MAKE_UTURN\", \"TRY_MAKE_UTURN\", \"ROUNDABOUT_RIGHT\",\n \"ROUNDABOUT_LEFT\", \"ROUNDABOUT_CROSS\", \"ROUNDABOUT_BACK\"],\n\n iconsMap = {\n \"ARRIVE\": \"icon-end-black\",\n \"ARRIVE_LEFT\": \"icon-end-black\",\n \"ARRIVE_RIGHT\": \"icon-end-black\",\n \"DEPART\": \"icon-start-black\",\n \"STRAIGHT\": \"icon-follow\",\n \"KEEP_RIGHT\": \"icon-keep_right\",\n \"BEAR_RIGHT\": \"icon-bear_right\",\n \"TURN_RIGHT\": \"icon-turn_right\",\n \"SHARP_RIGHT\": \"icon-sharp_right\",\n \"KEEP_LEFT\": \"icon-keep_left\",\n \"BEAR_LEFT\": \"icon-bear_left\",\n \"TURN_LEFT\": \"icon-turn_left\",\n \"SHARP_LEFT\": \"icon-sharp_left\",\n \"MAKE_UTURN\": \"icon-make_uturn\",\n \"MAKE_UTURN_LEFT_DRIVING_SIDE\": \"icon-make_uturn_left_driving_side\",\n \"ENTER_MOTORWAY\": \"icon-freeway\",\n \"ENTER_FREEWAY\": \"icon-freeway\",\n \"ENTER_HIGHWAY\": \"icon-freeway\",\n \"TAKE_EXIT\": \"icon-follow\",\n \"MOTORWAY_EXIT_LEFT\": \"icon-keep_left\",\n \"MOTORWAY_EXIT_RIGHT\": \"icon-keep_right\",\n \"TAKE_FERRY\": \"icon-ferry\",\n \"ROUNDABOUT_CROSS\": \"icon-roundabout_cross\",\n \"ROUNDABOUT_CROSS_45\": \"icon-roundabout_cross_45\",\n \"ROUNDABOUT_RIGHT_135\": \"icon-roundabout_right_135\",\n \"ROUNDABOUT_CROSS_MINUS_45\": \"icon-roundabout_cross_minus_45\",\n \"ROUNDABOUT_LEFT_MINUS_135\": \"icon-roundabout_left_minus_135\",\n \"ROUNDABOUT_RIGHT\": \"icon-roundabout_right\",\n \"ROUNDABOUT_LEFT\": \"icon-roundabout_left\",\n \"ROUNDABOUT_BACK\": \"icon-roundabout_back\",\n \"TRY_MAKE_UTURN\": \"make_uturn\",\n \"TRY_MAKE_UTURN_LEFT_DRIVING_SIDE\": \"icon-make_uturn_left_driving_side\",\n \"ROUNDABOUT_CROSS_LEFT_DRIVING_SIDE\": \"icon-roundabout_cross_left_driving_side\",\n \"ROUNDABOUT_CROSS_45_LEFT_DRIVING_SIDE\": \"icon-roundabout_cross_45_left_driving_side\",\n \"ROUNDABOUT_RIGHT_135_LEFT_DRIVING_SIDE\": \"icon-roundabout_right_135_left_driving_side\",\n \"ROUNDABOUT_CROSS_MINUS_45_LEFT_DRIVING_SIDE\": \"icon-roundabout_cross_minus_45_left_driving_side\",\n \"ROUNDABOUT_LEFT_MINUS_135_LEFT_DRIVING_SIDE\": \"icon-roundabout_left_minus_135_left_driving_side\",\n \"ROUNDABOUT_RIGHT_LEFT_DRIVING_SIDE\": \"icon-roundabout_right_left_driving_side\",\n \"ROUNDABOUT_LEFT_LEFT_DRIVING_SIDE\": \"icon-roundabout_left_left_driving_side\",\n \"ROUNDABOUT_BACK_LEFT_DRIVING_SIDE\": \"icon-roundabout_back_left_driving_side\",\n \"FOLLOW\": \"icon-follow\",\n //\"SWITCH_PARALLEL_ROAD\": \"?\",\n //\"SWITCH_MAIN_ROAD\": \"?\",\n //\"ENTRANCE_RAMP\": \"?\",\n \"WAYPOINT_LEFT\": \"icon-flag-black\",\n \"WAYPOINT_RIGHT\": \"icon-flag-black\",\n \"WAYPOINT_REACHED\": \"icon-flag-black\"\n };\n\n\n function createDOMElements(control) {\n var container = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \" leaflet-control\");\n control.container = container;\n container.style.width = control.options.size[0] + \"px\";\n container.style.maxHeight = control.options.size[1] + \"px\";\n\n L.DomEvent.disableClickPropagation(container);\n L.DomEvent.disableScrollPropagation(container);\n\n container.style.visibility = \"hidden\";\n\n return container;\n }\n\n function clearDOMElements(control) {\n control.container.innerHTML = \"\";\n }\n\n function updateDOMElements(control) {\n clearDOMElements(control);\n if (control.options.showInstructionGroups) {\n createInstructionsWithGroups(control, control.guidanceData);\n } else {\n createInstructions(control, control.container, control.guidanceData.instructions);\n }\n }\n\n function createInstructionsWithGroups(control, guidance) {\n var container = control.container;\n\n var allInstructionsPoints = [];\n for (var instructionIndex = 0; instructionIndex < guidance.instructions.length; instructionIndex+=1) {\n allInstructionsPoints.push(guidance.instructions[instructionIndex].point);\n }\n\n for (var groupIndex = 0; groupIndex < guidance.instructionGroups.length; groupIndex+=1) {\n var instructionGroup = guidance.instructionGroups[groupIndex];\n var groupElementDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-group-element\", container);\n var groupedInstructionsDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-grouped-instructions\", container);\n\n var groupMessageWithIconDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-group-message-with-icon\", groupElementDiv);\n var collapseIconDiv = createCollapseIconDiv(control.options.instructionGroupsCollapsed);\n var groupMessageDiv = createGroupMessageDiv(instructionGroup);\n groupMessageWithIconDiv.appendChild(collapseIconDiv);\n groupMessageWithIconDiv.appendChild(groupMessageDiv);\n\n var separatorCssClassName = control.options.instructionGroupsCollapsed ? \"separator-end-group\" : \"separator-between-instructions\";\n createSeparatorDiv(groupElementDiv, instructionGroup.groupLengthInMeters, control.isImperialDistance, separatorCssClassName, true);\n\n var instructionListForGroup = guidance.instructions.slice(instructionGroup.firstInstructionIndex,\n instructionGroup.lastInstructionIndex + 1);\n var groupedInstructionPoints = createInstructions(control, groupedInstructionsDiv, instructionListForGroup,\n guidance.instructions[instructionGroup.lastInstructionIndex + 1]);\n\n registerHandlersForGroup({control: control,\n groupElementDiv: groupElementDiv,\n groupMessage: instructionGroup.groupMessage,\n groupedInstructionPoints: groupedInstructionPoints,\n collapseIconDiv: collapseIconDiv,\n groupedInstructionsDiv: groupedInstructionsDiv,\n allInstructionsPoints: allInstructionsPoints\n });\n\n if (control.options.instructionGroupsCollapsed) {\n groupedInstructionsDiv.style.display = \"none\";\n }\n }\n }\n\n function createInstructions(control, divForInstructions, instructionList, instructionNextToGroup) {\n var nextInstructionOffset = 0;\n var instructionPoints = [];\n\n for (var instructionIndex = 0; instructionIndex < instructionList.length; instructionIndex+=1) {\n var currentInstruction = instructionList[instructionIndex];\n instructionPoints.push(currentInstruction.point);\n var nextInstruction = instructionList[instructionIndex + 1];\n var instructionElementDiv = createInstructionElement(currentInstruction);\n divForInstructions.appendChild(instructionElementDiv);\n var separatorCssClassName = \"separator-between-instructions\";\n\n if (nextInstruction !== undefined) {\n nextInstructionOffset = nextInstruction.routeOffsetInMeters;\n } else if (instructionNextToGroup) {\n nextInstructionOffset = instructionNextToGroup.routeOffsetInMeters;\n separatorCssClassName = \"separator-end-group\";\n }\n\n createSeparatorDiv(instructionElementDiv, nextInstructionOffset - currentInstruction.routeOffsetInMeters,\n control.isImperialDistance, separatorCssClassName);\n registerHandlersForInstruction(control, instructionElementDiv, currentInstruction);\n }\n\n return instructionPoints;\n }\n\n function createCollapseIconDiv(isInstructionGroupsCollapsed) {\n var collapseIconClass = isInstructionGroupsCollapsed ? \"icon-expand\" : \"icon-collapse\";\n return L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-collapse-icon \" + collapseIconClass);\n }\n\n function createGroupMessageDiv(instructionGroup) {\n var groupMessageDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-group-message\");\n groupMessageDiv.innerHTML = instructionGroup.groupMessage;\n return groupMessageDiv;\n }\n\n function createInstructionElement(instruction) {\n var instructionElementDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-instruction-element\");\n var messageWithIconDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-message-with-icon\", instructionElementDiv);\n L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-icon \" + iconsMap[getIconPathKey(instruction)], messageWithIconDiv);\n var messageDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-message\", messageWithIconDiv);\n messageDiv.innerHTML = instruction.message;\n return instructionElementDiv;\n }\n\n function createSeparatorDiv(divToSeparate, instructionDistance, isImperialDistance, separatorCssClass, isInstructionGroup) {\n if (instructionDistance === 0) {\n return;\n }\n var separatorDistanceDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-separator-distance\", divToSeparate);\n if (isInstructionGroup) {\n L.DomUtil.addClass(separatorDistanceDiv, CSS_CLASS_NAME + \"-group-separator-distance\");\n }\n var autoLengthSeparatorDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-auto-length-separator\", separatorDistanceDiv);\n var instructionSeparatorDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-separator\", autoLengthSeparatorDiv);\n L.DomUtil.addClass(instructionSeparatorDiv, separatorCssClass);\n var distanceDiv = L.DomUtil.create(\"div\", CSS_CLASS_NAME + \"-distance\", separatorDistanceDiv);\n distanceDiv.innerHTML = unitFormatConverter.formatDistance(instructionDistance, isImperialDistance);\n }\n\n function registerHandlersForGroup(params) {\n L.DomEvent.on(params.groupElementDiv, \"mouseenter\", function () {\n params.control.fire(EVENTS.InstructionGroupHoverOn, createEventObject(params.groupedInstructionPoints, params.groupMessage));\n });\n L.DomEvent.on(params.groupElementDiv, \"mouseleave\", function () {\n params.control.fire(EVENTS.InstructionGroupHoverOff);\n });\n L.DomEvent.on(params.groupElementDiv, \"click\", function () {\n params.control.container.focus();\n var separator = params.groupElementDiv.getElementsByClassName(\"leaflet-control-route-instructions-separator\")[0];\n toggleCssClasses(separator, [\"separator-between-instructions\", \"separator-end-group\"]);\n toggleCssClasses(params.collapseIconDiv, [\"icon-collapse\", \"icon-expand\"]);\n\n if (params.groupedInstructionsDiv.style.display === \"none\") {\n params.groupedInstructionsDiv.style.display = \"\";\n params.control.fire(EVENTS.InstructionGroupClickedExpand, createEventObject(params.groupedInstructionPoints));\n } else {\n params.groupedInstructionsDiv.style.display = \"none\";\n params.control.fire(EVENTS.InstructionGroupClickedCollapse, createEventObject(params.allInstructionsPoints));\n }\n });\n }\n\n function toggleCssClasses(htmlElement, cssClassesArray) {\n cssClassesArray.forEach(function(className) {\n if (L.DomUtil.hasClass(htmlElement, className)) {\n L.DomUtil.removeClass(htmlElement, className);\n } else {\n L.DomUtil.addClass(htmlElement, className);\n }\n });\n }\n\n function createEventObject(instructionPoints, instructionMessage) {\n var eventObject = {};\n if (instructionPoints.constructor.toString().indexOf(\"Array\") > -1) {\n eventObject.points = instructionPoints;\n } else {\n eventObject.point = instructionPoints;\n }\n if (instructionMessage) {\n eventObject.message = instructionMessage;\n }\n\n return eventObject;\n }\n\n function registerHandlersForInstruction(control, instructionElement, instruction) {\n L.DomEvent.on(instructionElement, \"mouseenter\", function () {\n control.fire(EVENTS.InstructionHoverOn, createEventObject(instruction.point, instruction.message));\n });\n L.DomEvent.on(instructionElement, \"mouseleave\", function () {\n control.fire(EVENTS.InstructionHoverOff);\n });\n L.DomEvent.on(instructionElement, \"click\", function () {\n control.container.focus();\n var selectedInstructionClass = [\"selected-instruction\"];\n\n if (L.DomUtil.hasClass(instructionElement, selectedInstructionClass)) {\n control.fire(EVENTS.InstructionClickedDeselect);\n } else {\n deselectInstruction(control.container, selectedInstructionClass, control);\n control.fire(EVENTS.InstructionClickedSelect, createEventObject(instruction.point, instruction.message));\n }\n\n toggleCssClasses(instructionElement, selectedInstructionClass);\n });\n }\n\n function deselectInstruction(container, selectedInstructionClass, control) {\n var selectedInstruction = container.getElementsByClassName(selectedInstructionClass)[0];\n if (selectedInstruction) {\n L.DomUtil.removeClass(selectedInstruction, selectedInstructionClass);\n control.fire(EVENTS.InstructionClickedDeselect);\n }\n }\n\n function getIconPathKey(instruction) {\n var iconKey = instruction.maneuver;\n if (instruction.maneuver === \"ROUNDABOUT_CROSS\") {\n if (instruction.turnAngleInDecimalDegrees >= 22 && instruction.turnAngleInDecimalDegrees <= 68) {\n iconKey += \"_45\";\n } else if (instruction.turnAngleInDecimalDegrees <= -22 && instruction.turnAngleInDecimalDegrees >= -68) {\n iconKey += \"_MINUS_45\";\n }\n }\n if (instruction.maneuver === \"ROUNDABOUT_RIGHT\" && instruction.turnAngleInDecimalDegrees >= 122 && instruction.turnAngleInDecimalDegrees <= 158) {\n iconKey += \"_135\";\n }\n if (instruction.maneuver === \"ROUNDABOUT_LEFT\" && instruction.turnAngleInDecimalDegrees >= -158 && instruction.turnAngleInDecimalDegrees <= -122) {\n iconKey += \"_MINUS_135\";\n }\n if (instruction.drivingSide === \"LEFT\" && MANOUVERS_WITH_LEFT_DRIVING_SIDE_VERSIONS.indexOf(instruction.maneuver) !== -1) {\n iconKey += \"_LEFT_DRIVING_SIDE\";\n }\n return iconKey;\n }\n\n /**\n * The method to instantiates the control. The options can be passed on creation.\n *\n * @method routeInstructions\n * @param {Object} [options] Options to setup control.\n * @param {Object} [options.size=[320, 320]] Size of panel. The first parameter is width and the second is the\n * maximum height. It will fit to the size of the instructions.\n * @param {String} [options.position=\"topleft\"] Where to add view.\n * @param {Boolean} [options.instructionGroupsCollapsed=false] Should instruction groups be collapsed on init.\n * @param {Boolean} [options.showInstructionGroups=true] Should instruction groups be displayed.\n * @param {Boolean} [options.imperialDistance=false] Should the distance be displayed in imperial units.\n *\n * @example\n * ```javascript\n *\n * var options = {\n * size: [270, 268],\n * position: \"topleft\"\n * };\n * var routeInstructionsInstance = routeInstructions(options).addTo(map);\n * ```\n */\n var RouteInstructions = L.Control.extend({\n\n includes: L.Mixin.Events,\n\n options: {\n size: [320, 320],\n position: \"topleft\",\n instructionGroupsCollapsed: false,\n showInstructionGroups: true,\n imperialDistance: false\n },\n\n /**\n * Leaflet init method executed when adding control to map.\n * Options will be stored inside control.\n * @method initialize\n * @param {Object} [options] Options to setup control.\n */\n initialize: function (options) {\n L.Util.setOptions(this, options);\n },\n\n /**\n * Leaflet method executed when adding control to map.\n * Map will be stored inside control.\n * @method onAdd\n * @param {Object} [map] The map instance to which control is added.\n * @return {DOMElement} The main HTML element containing the widget.\n */\n onAdd: function (map) {\n return createDOMElements(this);\n },\n\n /**\n * Method to show route instructions.\n * By default instructions will be hidden.\n * Use this method to show control after data is ready.\n * @method show\n */\n show: function () {\n if (this.guidanceData) {\n this.container.style.visibility = \"\";\n }\n },\n\n /**\n * Method to hide route instructions.\n * By default instructions will be hidden.\n * @method hide\n */\n hide: function () {\n this.container.style.visibility = \"hidden\";\n },\n\n /**\n * Method to update data after route is recalculated.\n * Use this method to update data after each route calculation.\n * @method updateGuidanceData\n * @param {Object} guidanceData The routing properties object containing instruction groups and instructions.\n * @param {Boolean} [imperial] Display distance in imperial units.\n */\n updateGuidanceData: function (guidanceData, imperial) {\n this.guidanceData = guidanceData;\n this.isImperialDistance = imperial || this.options.imperialDistance;\n updateDOMElements(this);\n this.show();\n },\n\n /**\n * Method to show instructions with groups if there are any.\n * @method showInstructionGroups\n */\n showInstructionGroups: function () {\n if (this.guidanceData && !this.options.showInstructionGroups) {\n this.options.showInstructionGroups = true;\n updateDOMElements(this);\n }\n },\n\n /**\n * Method to hide instructions groups. Use this method to disable groups. Only instructions will be visible.\n * @method hideInstructionGroups\n */\n hideInstructionGroups: function () {\n if (this.guidanceData && this.options.showInstructionGroups) {\n this.options.showInstructionGroups = false;\n updateDOMElements(this);\n }\n },\n\n /**\n * Event that is fired when instruction is clicked and is not selected. In this case clicked instruction will\n * be marked as selected (selected-instruction css class will be added). If any other instruction is selected,\n * it will be deselect.\n *\n * @event InstructionClickedSelect\n * @param {Object} point Object of point that represents latitude and longitude of instruction location.\n * @param {String} message Instruction message.\n * @param {String} type Event's name, equal to \"instructionClickedDeselect\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInstructionsInstance = tomtom.routeInstructions().addTo(map);\n * routeInstructionsInstance.on(routeInstructionsInstance.Event.InstructionClickedSelect,\n * function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n /**\n * Event that is fired when instruction is clicked and is selected. In this case clicked instruction will\n * be deselect (selected-instruction css class will be removed).\n *\n * @event InstructionClickedDeselect\n * @param {String} type Event's name, equal to \"instructionClickedDeselect\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInstructionsInstance = tomtom.routeInstructions().addTo(map);\n * routeInstructionsInstance.on(routeInstructionsInstance.Event.InstructionClickedDeselect,\n * function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n /**\n * Event that is fired when cursor is moving into instruction.\n *\n * @event InstructionHoverOn\n * @param {Object} point Object of point that represents latitude and longitude of instruction location.\n * @param {String} message Instruction message.\n * @param {String} type Event's name, equal to \"instructionHoverOn\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInstructionsInstance = tomtom.routeInstructions().addTo(map);\n * routeInstructionsInstance.on(routeInstructionsInstance.Event.InstructionHoverOn,\n * function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n /**\n * Event that is fired when cursor is moving out of instruction.\n *\n * @event InstructionHoverOff\n * @param {String} type Event's name, equal to \"instructionHoverOff\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInstructionsInstance = tomtom.routeInstructions().addTo(map);\n * routeInstructionsInstance.on(routeInstructionsInstance.Event.InstructionHoverOff,\n * function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n /**\n * Event that is fired when group of instructions is clicking and related instructions are collapsing.\n *\n * @event InstructionGroupClickedCollapse\n * @param {Object} points Object with points that represents latitude and longitude of all instruction locations in route.\n * @param {String} type Event's name, equal to \"instructionGroupClickedCollapse\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInstructionsInstance = tomtom.routeInstructions().addTo(map);\n * routeInstructionsInstance.on(routeInstructionsInstance.Event.InstructionGroupClickedCollapse,\n * function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n /**\n * Event that is fired when group of instructions is clicking and related instructions are expanding.\n *\n * @event InstructionGroupClickedExpand\n * @param {Object} points Object with points that represents latitude and longitude of all instruction locations in group.\n * @param {String} type Event's name, equal to \"instructionGroupClickedExpand\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInstructionsInstance = tomtom.routeInstructions().addTo(map);\n * routeInstructionsInstance.on(routeInstructionsInstance.Event.InstructionGroupClickedExpand,\n * function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n /**\n * Event that is fired when cursor is moving into group of instructions.\n *\n * @event InstructionGroupHoverOn\n * @param {Array} points Array of objects that contains points (latitude and longitude) of all instructions from this group.\n * @param {String} message Group message.\n * @param {String} type Event's name, equal to \"instructionGroupHoverOn\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInstructionsInstance = tomtom.routeInstructions().addTo(map);\n * routeInstructionsInstance.on(routeInstructionsInstance.Event.InstructionGroupHoverOn,\n * function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n /**\n * Event that is fired when cursor is moving out of group of instructions.\n *\n * @event InstructionGroupHoverOff\n * @param {String} type Event's name, equal to \"instructionGroupHoverOff\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeInstructionsInstance = tomtom.routeInstructions().addTo(map);\n * routeInstructionsInstance.on(routeInstructionsInstance.Event.InstructionGroupHoverOff,\n * function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n Event: EVENTS\n });\n\n return function (options) {\n return new RouteInstructions(options);\n };\n});\n","(function(root) {\ndefine(\"markercluster\", [\"display/map\"], function() {\n return (function() {\n/*\n Leaflet.markercluster, Provides Beautiful Animated Marker Clustering functionality for Leaflet, a JS library for interactive maps.\n https://github.com/Leaflet/Leaflet.markercluster\n (c) 2012-2013, Dave Leaver, smartrak\n*/\n(function (window, document, undefined) {/*\n * L.MarkerClusterGroup extends L.FeatureGroup by clustering the markers contained within\n */\n\nL.MarkerClusterGroup = L.FeatureGroup.extend({\n\n\toptions: {\n\t\tmaxClusterRadius: 80, //A cluster will cover at most this many pixels from its center\n\t\ticonCreateFunction: null,\n\n\t\tspiderfyOnMaxZoom: true,\n\t\tshowCoverageOnHover: true,\n\t\tzoomToBoundsOnClick: true,\n\t\tsingleMarkerMode: false,\n\n\t\tdisableClusteringAtZoom: null,\n\n\t\t// Setting this to false prevents the removal of any clusters outside of the viewpoint, which\n\t\t// is the default behaviour for performance reasons.\n\t\tremoveOutsideVisibleBounds: true,\n\n\t\t// Set to false to disable all animations (zoom and spiderfy).\n\t\t// If false, option animateAddingMarkers below has no effect.\n\t\t// If L.DomUtil.TRANSITION is falsy, this option has no effect.\n\t\tanimate: true,\n\n\t\t//Whether to animate adding markers after adding the MarkerClusterGroup to the map\n\t\t// If you are adding individual markers set to true, if adding bulk markers leave false for massive performance gains.\n\t\tanimateAddingMarkers: false,\n\n\t\t//Increase to increase the distance away that spiderfied markers appear from the center\n\t\tspiderfyDistanceMultiplier: 1,\n\n\t\t// Make it possible to specify a polyline options on a spider leg\n\t\tspiderLegPolylineOptions: { weight: 1.5, color: '#222', opacity: 0.5 },\n\n\t\t// When bulk adding layers, adds markers in chunks. Means addLayers may not add all the layers in the call, others will be loaded during setTimeouts\n\t\tchunkedLoading: false,\n\t\tchunkInterval: 200, // process markers for a maximum of ~ n milliseconds (then trigger the chunkProgress callback)\n\t\tchunkDelay: 50, // at the end of each interval, give n milliseconds back to system/browser\n\t\tchunkProgress: null, // progress callback: function(processed, total, elapsed) (e.g. for a progress indicator)\n\n\t\t//Options to pass to the L.Polygon constructor\n\t\tpolygonOptions: {}\n\t},\n\n\tinitialize: function (options) {\n\t\tL.Util.setOptions(this, options);\n\t\tif (!this.options.iconCreateFunction) {\n\t\t\tthis.options.iconCreateFunction = this._defaultIconCreateFunction;\n\t\t}\n\n\t\tthis._featureGroup = L.featureGroup();\n\t\tthis._featureGroup.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);\n\n\t\tthis._nonPointGroup = L.featureGroup();\n\t\tthis._nonPointGroup.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);\n\n\t\tthis._inZoomAnimation = 0;\n\t\tthis._needsClustering = [];\n\t\tthis._needsRemoving = []; //Markers removed while we aren't on the map need to be kept track of\n\t\t//The bounds of the currently shown area (from _getExpandedVisibleBounds) Updated on zoom/move\n\t\tthis._currentShownBounds = null;\n\n\t\tthis._queue = [];\n\n\t\t// Hook the appropriate animation methods.\n\t\tvar animate = L.DomUtil.TRANSITION && this.options.animate;\n\t\tL.extend(this, animate ? this._withAnimation : this._noAnimation);\n\t\t// Remember which MarkerCluster class to instantiate (animated or not).\n\t\tthis._markerCluster = animate ? L.MarkerCluster : L.MarkerClusterNonAnimated;\n\t},\n\n\taddLayer: function (layer) {\n\n\t\tif (layer instanceof L.LayerGroup) {\n\t\t\tvar array = [];\n\t\t\tfor (var i in layer._layers) {\n\t\t\t\tarray.push(layer._layers[i]);\n\t\t\t}\n\t\t\treturn this.addLayers(array);\n\t\t}\n\n\t\t//Don't cluster non point data\n\t\tif (!layer.getLatLng) {\n\t\t\tthis._nonPointGroup.addLayer(layer);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!this._map) {\n\t\t\tthis._needsClustering.push(layer);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this.hasLayer(layer)) {\n\t\t\treturn this;\n\t\t}\n\n\n\t\t//If we have already clustered we'll need to add this one to a cluster\n\n\t\tif (this._unspiderfy) {\n\t\t\tthis._unspiderfy();\n\t\t}\n\n\t\tthis._addLayer(layer, this._maxZoom);\n\n\t\t// Refresh bounds and weighted positions.\n\t\tthis._topClusterLevel._recalculateBounds();\n\n\t\t//Work out what is visible\n\t\tvar visibleLayer = layer,\n\t\t\tcurrentZoom = this._map.getZoom();\n\t\tif (layer.__parent) {\n\t\t\twhile (visibleLayer.__parent._zoom >= currentZoom) {\n\t\t\t\tvisibleLayer = visibleLayer.__parent;\n\t\t\t}\n\t\t}\n\n\t\tif (this._currentShownBounds.contains(visibleLayer.getLatLng())) {\n\t\t\tif (this.options.animateAddingMarkers) {\n\t\t\t\tthis._animationAddLayer(layer, visibleLayer);\n\t\t\t} else {\n\t\t\t\tthis._animationAddLayerNonAnimated(layer, visibleLayer);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\tremoveLayer: function (layer) {\n\n\t\tif (layer instanceof L.LayerGroup)\n\t\t{\n\t\t\tvar array = [];\n\t\t\tfor (var i in layer._layers) {\n\t\t\t\tarray.push(layer._layers[i]);\n\t\t\t}\n\t\t\treturn this.removeLayers(array);\n\t\t}\n\n\t\t//Non point layers\n\t\tif (!layer.getLatLng) {\n\t\t\tthis._nonPointGroup.removeLayer(layer);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!this._map) {\n\t\t\tif (!this._arraySplice(this._needsClustering, layer) && this.hasLayer(layer)) {\n\t\t\t\tthis._needsRemoving.push(layer);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!layer.__parent) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this._unspiderfy) {\n\t\t\tthis._unspiderfy();\n\t\t\tthis._unspiderfyLayer(layer);\n\t\t}\n\n\t\t//Remove the marker from clusters\n\t\tthis._removeLayer(layer, true);\n\n\t\t// Refresh bounds and weighted positions.\n\t\tthis._topClusterLevel._recalculateBounds();\n\n\t\tif (this._featureGroup.hasLayer(layer)) {\n\t\t\tthis._featureGroup.removeLayer(layer);\n\t\t\tif (layer.clusterShow) {\n\t\t\t\tlayer.clusterShow();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t//Takes an array of markers and adds them in bulk\n\taddLayers: function (layersArray) {\n\t\tvar fg = this._featureGroup,\n\t\t\tnpg = this._nonPointGroup,\n\t\t\tchunked = this.options.chunkedLoading,\n\t\t\tchunkInterval = this.options.chunkInterval,\n\t\t\tchunkProgress = this.options.chunkProgress,\n\t\t\tnewMarkers, i, l, m;\n\n\t\tif (this._map) {\n\t\t\tvar offset = 0,\n\t\t\t\tstarted = (new Date()).getTime();\n\t\t\tvar process = L.bind(function () {\n\t\t\t\tvar start = (new Date()).getTime();\n\t\t\t\tfor (; offset < layersArray.length; offset++) {\n\t\t\t\t\tif (chunked && offset % 200 === 0) {\n\t\t\t\t\t\t// every couple hundred markers, instrument the time elapsed since processing started:\n\t\t\t\t\t\tvar elapsed = (new Date()).getTime() - start;\n\t\t\t\t\t\tif (elapsed > chunkInterval) {\n\t\t\t\t\t\t\tbreak; // been working too hard, time to take a break :-)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tm = layersArray[offset];\n\n\t\t\t\t\t//Not point data, can't be clustered\n\t\t\t\t\tif (!m.getLatLng) {\n\t\t\t\t\t\tnpg.addLayer(m);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.hasLayer(m)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._addLayer(m, this._maxZoom);\n\n\t\t\t\t\t//If we just made a cluster of size 2 then we need to remove the other marker from the map (if it is) or we never will\n\t\t\t\t\tif (m.__parent) {\n\t\t\t\t\t\tif (m.__parent.getChildCount() === 2) {\n\t\t\t\t\t\t\tvar markers = m.__parent.getAllChildMarkers(),\n\t\t\t\t\t\t\t\totherMarker = markers[0] === m ? markers[1] : markers[0];\n\t\t\t\t\t\t\tfg.removeLayer(otherMarker);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (chunkProgress) {\n\t\t\t\t\t// report progress and time elapsed:\n\t\t\t\t\tchunkProgress(offset, layersArray.length, (new Date()).getTime() - started);\n\t\t\t\t}\n\n\t\t\t\t// Completed processing all markers.\n\t\t\t\tif (offset === layersArray.length) {\n\n\t\t\t\t\t// Refresh bounds and weighted positions.\n\t\t\t\t\tthis._topClusterLevel._recalculateBounds();\n\n\t\t\t\t\t//Update the icons of all those visible clusters that were affected\n\t\t\t\t\tthis._featureGroup.eachLayer(function (c) {\n\t\t\t\t\t\tif (c instanceof L.MarkerCluster && c._iconNeedsUpdate) {\n\t\t\t\t\t\t\tc._updateIcon();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tthis._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(process, this.options.chunkDelay);\n\t\t\t\t}\n\t\t\t}, this);\n\n\t\t\tprocess();\n\t\t} else {\n\t\t\tnewMarkers = [];\n\t\t\tfor (i = 0, l = layersArray.length; i < l; i++) {\n\t\t\t\tm = layersArray[i];\n\n\t\t\t\t//Not point data, can't be clustered\n\t\t\t\tif (!m.getLatLng) {\n\t\t\t\t\tnpg.addLayer(m);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (this.hasLayer(m)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tnewMarkers.push(m);\n\t\t\t}\n\t\t\tthis._needsClustering = this._needsClustering.concat(newMarkers);\n\t\t}\n\t\treturn this;\n\t},\n\n\t//Takes an array of markers and removes them in bulk\n\tremoveLayers: function (layersArray) {\n\t\tvar i, l, m,\n\t\t\tfg = this._featureGroup,\n\t\t\tnpg = this._nonPointGroup;\n\n\t\tif (!this._map) {\n\t\t\tfor (i = 0, l = layersArray.length; i < l; i++) {\n\t\t\t\tm = layersArray[i];\n\t\t\t\tthis._arraySplice(this._needsClustering, m);\n\t\t\t\tnpg.removeLayer(m);\n\t\t\t\tif (this.hasLayer(m)) {\n\t\t\t\t\tthis._needsRemoving.push(m);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this._unspiderfy) {\n\t\t\tthis._unspiderfy();\n\t\t\tfor (i = 0, l = layersArray.length; i < l; i++) {\n\t\t\t\tm = layersArray[i];\n\t\t\t\tthis._unspiderfyLayer(m);\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, l = layersArray.length; i < l; i++) {\n\t\t\tm = layersArray[i];\n\n\t\t\tif (!m.__parent) {\n\t\t\t\tnpg.removeLayer(m);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis._removeLayer(m, true, true);\n\n\t\t\tif (fg.hasLayer(m)) {\n\t\t\t\tfg.removeLayer(m);\n\t\t\t\tif (m.clusterShow) {\n\t\t\t\t\tm.clusterShow();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Refresh bounds and weighted positions.\n\t\tthis._topClusterLevel._recalculateBounds();\n\n\t\t//Fix up the clusters and markers on the map\n\t\tthis._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);\n\n\t\tfg.eachLayer(function (c) {\n\t\t\tif (c instanceof L.MarkerCluster) {\n\t\t\t\tc._updateIcon();\n\t\t\t}\n\t\t});\n\n\t\treturn this;\n\t},\n\n\t//Removes all layers from the MarkerClusterGroup\n\tclearLayers: function () {\n\t\t//Need our own special implementation as the LayerGroup one doesn't work for us\n\n\t\t//If we aren't on the map (yet), blow away the markers we know of\n\t\tif (!this._map) {\n\t\t\tthis._needsClustering = [];\n\t\t\tdelete this._gridClusters;\n\t\t\tdelete this._gridUnclustered;\n\t\t}\n\n\t\tif (this._noanimationUnspiderfy) {\n\t\t\tthis._noanimationUnspiderfy();\n\t\t}\n\n\t\t//Remove all the visible layers\n\t\tthis._featureGroup.clearLayers();\n\t\tthis._nonPointGroup.clearLayers();\n\n\t\tthis.eachLayer(function (marker) {\n\t\t\tdelete marker.__parent;\n\t\t});\n\n\t\tif (this._map) {\n\t\t\t//Reset _topClusterLevel and the DistanceGrids\n\t\t\tthis._generateInitialClusters();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t//Override FeatureGroup.getBounds as it doesn't work\n\tgetBounds: function () {\n\t\tvar bounds = new L.LatLngBounds();\n\n\t\tif (this._topClusterLevel) {\n\t\t\tbounds.extend(this._topClusterLevel._bounds);\n\t\t}\n\n\t\tfor (var i = this._needsClustering.length - 1; i >= 0; i--) {\n\t\t\tbounds.extend(this._needsClustering[i].getLatLng());\n\t\t}\n\n\t\tbounds.extend(this._nonPointGroup.getBounds());\n\n\t\treturn bounds;\n\t},\n\n\t//Overrides LayerGroup.eachLayer\n\teachLayer: function (method, context) {\n\t\tvar markers = this._needsClustering.slice(),\n\t\t\ti;\n\n\t\tif (this._topClusterLevel) {\n\t\t\tthis._topClusterLevel.getAllChildMarkers(markers);\n\t\t}\n\n\t\tfor (i = markers.length - 1; i >= 0; i--) {\n\t\t\tmethod.call(context, markers[i]);\n\t\t}\n\n\t\tthis._nonPointGroup.eachLayer(method, context);\n\t},\n\n\t//Overrides LayerGroup.getLayers\n\tgetLayers: function () {\n\t\tvar layers = [];\n\t\tthis.eachLayer(function (l) {\n\t\t\tlayers.push(l);\n\t\t});\n\t\treturn layers;\n\t},\n\n\t//Overrides LayerGroup.getLayer, WARNING: Really bad performance\n\tgetLayer: function (id) {\n\t\tvar result = null;\n\t\t\n\t\tid = parseInt(id, 10);\n\n\t\tthis.eachLayer(function (l) {\n\t\t\tif (L.stamp(l) === id) {\n\t\t\t\tresult = l;\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t},\n\n\t//Returns true if the given layer is in this MarkerClusterGroup\n\thasLayer: function (layer) {\n\t\tif (!layer) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar i, anArray = this._needsClustering;\n\n\t\tfor (i = anArray.length - 1; i >= 0; i--) {\n\t\t\tif (anArray[i] === layer) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tanArray = this._needsRemoving;\n\t\tfor (i = anArray.length - 1; i >= 0; i--) {\n\t\t\tif (anArray[i] === layer) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn !!(layer.__parent && layer.__parent._group === this) || this._nonPointGroup.hasLayer(layer);\n\t},\n\n\t//Zoom down to show the given layer (spiderfying if necessary) then calls the callback\n\tzoomToShowLayer: function (layer, callback) {\n\t\t\n\t\tif (typeof callback !== 'function') {\n\t\t\tcallback = function () {};\n\t\t}\n\n\t\tvar showMarker = function () {\n\t\t\tif ((layer._icon || layer.__parent._icon) && !this._inZoomAnimation) {\n\t\t\t\tthis._map.off('moveend', showMarker, this);\n\t\t\t\tthis.off('animationend', showMarker, this);\n\n\t\t\t\tif (layer._icon) {\n\t\t\t\t\tcallback();\n\t\t\t\t} else if (layer.__parent._icon) {\n\t\t\t\t\tthis.once('spiderfied', callback, this);\n\t\t\t\t\tlayer.__parent.spiderfy();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (layer._icon && this._map.getBounds().contains(layer.getLatLng())) {\n\t\t\t//Layer is visible ond on screen, immediate return\n\t\t\tcallback();\n\t\t} else if (layer.__parent._zoom < this._map.getZoom()) {\n\t\t\t//Layer should be visible at this zoom level. It must not be on screen so just pan over to it\n\t\t\tthis._map.on('moveend', showMarker, this);\n\t\t\tthis._map.panTo(layer.getLatLng());\n\t\t} else {\n\t\t\tvar moveStart = function () {\n\t\t\t\tthis._map.off('movestart', moveStart, this);\n\t\t\t\tmoveStart = null;\n\t\t\t};\n\n\t\t\tthis._map.on('movestart', moveStart, this);\n\t\t\tthis._map.on('moveend', showMarker, this);\n\t\t\tthis.on('animationend', showMarker, this);\n\t\t\tlayer.__parent.zoomToBounds();\n\n\t\t\tif (moveStart) {\n\t\t\t\t//Never started moving, must already be there, probably need clustering however\n\t\t\t\tshowMarker.call(this);\n\t\t\t}\n\t\t}\n\t},\n\n\t//Overrides FeatureGroup.onAdd\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\t\tvar i, l, layer;\n\n\t\tif (!isFinite(this._map.getMaxZoom())) {\n\t\t\tthrow \"Map has no maxZoom specified\";\n\t\t}\n\n\t\tthis._featureGroup.onAdd(map);\n\t\tthis._nonPointGroup.onAdd(map);\n\n\t\tif (!this._gridClusters) {\n\t\t\tthis._generateInitialClusters();\n\t\t}\n\n\t\tthis._maxLat = map.options.crs.projection.MAX_LATITUDE;\n\n\t\tfor (i = 0, l = this._needsRemoving.length; i < l; i++) {\n\t\t\tlayer = this._needsRemoving[i];\n\t\t\tthis._removeLayer(layer, true);\n\t\t}\n\t\tthis._needsRemoving = [];\n\n\t\t//Remember the current zoom level and bounds\n\t\tthis._zoom = this._map.getZoom();\n\t\tthis._currentShownBounds = this._getExpandedVisibleBounds();\n\n\t\tthis._map.on('zoomend', this._zoomEnd, this);\n\t\tthis._map.on('moveend', this._moveEnd, this);\n\n\t\tif (this._spiderfierOnAdd) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely\n\t\t\tthis._spiderfierOnAdd();\n\t\t}\n\n\t\tthis._bindEvents();\n\n\t\t//Actually add our markers to the map:\n\t\tl = this._needsClustering;\n\t\tthis._needsClustering = [];\n\t\tthis.addLayers(l);\n\t},\n\n\t//Overrides FeatureGroup.onRemove\n\tonRemove: function (map) {\n\t\tmap.off('zoomend', this._zoomEnd, this);\n\t\tmap.off('moveend', this._moveEnd, this);\n\n\t\tthis._unbindEvents();\n\n\t\t//In case we are in a cluster animation\n\t\tthis._map._mapPane.className = this._map._mapPane.className.replace(' leaflet-cluster-anim', '');\n\n\t\tif (this._spiderfierOnRemove) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely\n\t\t\tthis._spiderfierOnRemove();\n\t\t}\n\n\t\tdelete this._maxLat;\n\n\t\t//Clean up all the layers we added to the map\n\t\tthis._hideCoverage();\n\t\tthis._featureGroup.onRemove(map);\n\t\tthis._nonPointGroup.onRemove(map);\n\n\t\tthis._featureGroup.clearLayers();\n\n\t\tthis._map = null;\n\t},\n\n\tgetVisibleParent: function (marker) {\n\t\tvar vMarker = marker;\n\t\twhile (vMarker && !vMarker._icon) {\n\t\t\tvMarker = vMarker.__parent;\n\t\t}\n\t\treturn vMarker || null;\n\t},\n\n\t//Remove the given object from the given array\n\t_arraySplice: function (anArray, obj) {\n\t\tfor (var i = anArray.length - 1; i >= 0; i--) {\n\t\t\tif (anArray[i] === obj) {\n\t\t\t\tanArray.splice(i, 1);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Removes a marker from all _gridUnclustered zoom levels, starting at the supplied zoom.\n\t * @param marker to be removed from _gridUnclustered.\n\t * @param z integer bottom start zoom level (included)\n\t * @private\n\t */\n\t_removeFromGridUnclustered: function (marker, z) {\n\t\tvar map = this._map,\n\t\t gridUnclustered = this._gridUnclustered;\n\n\t\tfor (; z >= 0; z--) {\n\t\t\tif (!gridUnclustered[z].removeObject(marker, map.project(marker.getLatLng(), z))) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\n\t//Internal function for removing a marker from everything.\n\t//dontUpdateMap: set to true if you will handle updating the map manually (for bulk functions)\n\t_removeLayer: function (marker, removeFromDistanceGrid, dontUpdateMap) {\n\t\tvar gridClusters = this._gridClusters,\n\t\t\tgridUnclustered = this._gridUnclustered,\n\t\t\tfg = this._featureGroup,\n\t\t\tmap = this._map;\n\n\t\t//Remove the marker from distance clusters it might be in\n\t\tif (removeFromDistanceGrid) {\n\t\t\tthis._removeFromGridUnclustered(marker, this._maxZoom);\n\t\t}\n\n\t\t//Work our way up the clusters removing them as we go if required\n\t\tvar cluster = marker.__parent,\n\t\t\tmarkers = cluster._markers,\n\t\t\totherMarker;\n\n\t\t//Remove the marker from the immediate parents marker list\n\t\tthis._arraySplice(markers, marker);\n\n\t\twhile (cluster) {\n\t\t\tcluster._childCount--;\n\t\t\tcluster._boundsNeedUpdate = true;\n\n\t\t\tif (cluster._zoom < 0) {\n\t\t\t\t//Top level, do nothing\n\t\t\t\tbreak;\n\t\t\t} else if (removeFromDistanceGrid && cluster._childCount <= 1) { //Cluster no longer required\n\t\t\t\t//We need to push the other marker up to the parent\n\t\t\t\totherMarker = cluster._markers[0] === marker ? cluster._markers[1] : cluster._markers[0];\n\n\t\t\t\t//Update distance grid\n\t\t\t\tgridClusters[cluster._zoom].removeObject(cluster, map.project(cluster._cLatLng, cluster._zoom));\n\t\t\t\tgridUnclustered[cluster._zoom].addObject(otherMarker, map.project(otherMarker.getLatLng(), cluster._zoom));\n\n\t\t\t\t//Move otherMarker up to parent\n\t\t\t\tthis._arraySplice(cluster.__parent._childClusters, cluster);\n\t\t\t\tcluster.__parent._markers.push(otherMarker);\n\t\t\t\totherMarker.__parent = cluster.__parent;\n\n\t\t\t\tif (cluster._icon) {\n\t\t\t\t\t//Cluster is currently on the map, need to put the marker on the map instead\n\t\t\t\t\tfg.removeLayer(cluster);\n\t\t\t\t\tif (!dontUpdateMap) {\n\t\t\t\t\t\tfg.addLayer(otherMarker);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!dontUpdateMap || !cluster._icon) {\n\t\t\t\t\tcluster._updateIcon();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcluster = cluster.__parent;\n\t\t}\n\n\t\tdelete marker.__parent;\n\t},\n\n\t_isOrIsParent: function (el, oel) {\n\t\twhile (oel) {\n\t\t\tif (el === oel) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\toel = oel.parentNode;\n\t\t}\n\t\treturn false;\n\t},\n\n\t_propagateEvent: function (e) {\n\t\tif (e.layer instanceof L.MarkerCluster) {\n\t\t\t//Prevent multiple clustermouseover/off events if the icon is made up of stacked divs (Doesn't work in ie <= 8, no relatedTarget)\n\t\t\tif (e.originalEvent && this._isOrIsParent(e.layer._icon, e.originalEvent.relatedTarget)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.type = 'cluster' + e.type;\n\t\t}\n\n\t\tthis.fire(e.type, e);\n\t},\n\n\t//Default functionality\n\t_defaultIconCreateFunction: function (cluster) {\n\t\tvar childCount = cluster.getChildCount();\n\n\t\tvar c = ' marker-cluster-';\n\t\tif (childCount < 10) {\n\t\t\tc += 'small';\n\t\t} else if (childCount < 100) {\n\t\t\tc += 'medium';\n\t\t} else {\n\t\t\tc += 'large';\n\t\t}\n\n\t\treturn new L.DivIcon({ html: '
' + childCount + '
', className: 'marker-cluster' + c, iconSize: new L.Point(40, 40) });\n\t},\n\n\t_bindEvents: function () {\n\t\tvar map = this._map,\n\t\t spiderfyOnMaxZoom = this.options.spiderfyOnMaxZoom,\n\t\t showCoverageOnHover = this.options.showCoverageOnHover,\n\t\t zoomToBoundsOnClick = this.options.zoomToBoundsOnClick;\n\n\t\t//Zoom on cluster click or spiderfy if we are at the lowest level\n\t\tif (spiderfyOnMaxZoom || zoomToBoundsOnClick) {\n\t\t\tthis.on('clusterclick', this._zoomOrSpiderfy, this);\n\t\t}\n\n\t\t//Show convex hull (boundary) polygon on mouse over\n\t\tif (showCoverageOnHover) {\n\t\t\tthis.on('clustermouseover', this._showCoverage, this);\n\t\t\tthis.on('clustermouseout', this._hideCoverage, this);\n\t\t\tmap.on('zoomend', this._hideCoverage, this);\n\t\t}\n\t},\n\n\t_zoomOrSpiderfy: function (e) {\n\t\tvar cluster = e.layer,\n\t\t bottomCluster = cluster;\n\n\t\twhile (bottomCluster._childClusters.length === 1) {\n\t\t\tbottomCluster = bottomCluster._childClusters[0];\n\t\t}\n\n\t\tif (bottomCluster._zoom === this._maxZoom && bottomCluster._childCount === cluster._childCount) {\n\t\t\t// All child markers are contained in a single cluster from this._maxZoom to this cluster.\n\t\t\tif (this.options.spiderfyOnMaxZoom) {\n\t\t\t\tcluster.spiderfy();\n\t\t\t}\n\t\t} else if (this.options.zoomToBoundsOnClick) {\n\t\t\tcluster.zoomToBounds();\n\t\t}\n\n\t\t// Focus the map again for keyboard users.\n\t\tif (e.originalEvent && e.originalEvent.keyCode === 13) {\n\t\t\tthis._map._container.focus();\n\t\t}\n\t},\n\n\t_showCoverage: function (e) {\n\t\tvar map = this._map;\n\t\tif (this._inZoomAnimation) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._shownPolygon) {\n\t\t\tmap.removeLayer(this._shownPolygon);\n\t\t}\n\t\tif (e.layer.getChildCount() > 2 && e.layer !== this._spiderfied) {\n\t\t\tthis._shownPolygon = new L.Polygon(e.layer.getConvexHull(), this.options.polygonOptions);\n\t\t\tmap.addLayer(this._shownPolygon);\n\t\t}\n\t},\n\n\t_hideCoverage: function () {\n\t\tif (this._shownPolygon) {\n\t\t\tthis._map.removeLayer(this._shownPolygon);\n\t\t\tthis._shownPolygon = null;\n\t\t}\n\t},\n\n\t_unbindEvents: function () {\n\t\tvar spiderfyOnMaxZoom = this.options.spiderfyOnMaxZoom,\n\t\t\tshowCoverageOnHover = this.options.showCoverageOnHover,\n\t\t\tzoomToBoundsOnClick = this.options.zoomToBoundsOnClick,\n\t\t\tmap = this._map;\n\n\t\tif (spiderfyOnMaxZoom || zoomToBoundsOnClick) {\n\t\t\tthis.off('clusterclick', this._zoomOrSpiderfy, this);\n\t\t}\n\t\tif (showCoverageOnHover) {\n\t\t\tthis.off('clustermouseover', this._showCoverage, this);\n\t\t\tthis.off('clustermouseout', this._hideCoverage, this);\n\t\t\tmap.off('zoomend', this._hideCoverage, this);\n\t\t}\n\t},\n\n\t_zoomEnd: function () {\n\t\tif (!this._map) { //May have been removed from the map by a zoomEnd handler\n\t\t\treturn;\n\t\t}\n\t\tthis._mergeSplitClusters();\n\n\t\tthis._zoom = this._map._zoom;\n\t\tthis._currentShownBounds = this._getExpandedVisibleBounds();\n\t},\n\n\t_moveEnd: function () {\n\t\tif (this._inZoomAnimation) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar newBounds = this._getExpandedVisibleBounds();\n\n\t\tthis._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, this._zoom, newBounds);\n\t\tthis._topClusterLevel._recursivelyAddChildrenToMap(null, this._map._zoom, newBounds);\n\n\t\tthis._currentShownBounds = newBounds;\n\t\treturn;\n\t},\n\n\t_generateInitialClusters: function () {\n\t\tvar maxZoom = this._map.getMaxZoom(),\n\t\t\tradius = this.options.maxClusterRadius,\n\t\t\tradiusFn = radius;\n\t\n\t\t//If we just set maxClusterRadius to a single number, we need to create\n\t\t//a simple function to return that number. Otherwise, we just have to\n\t\t//use the function we've passed in.\n\t\tif (typeof radius !== \"function\") {\n\t\t\tradiusFn = function () { return radius; };\n\t\t}\n\n\t\tif (this.options.disableClusteringAtZoom) {\n\t\t\tmaxZoom = this.options.disableClusteringAtZoom - 1;\n\t\t}\n\t\tthis._maxZoom = maxZoom;\n\t\tthis._gridClusters = {};\n\t\tthis._gridUnclustered = {};\n\t\n\t\t//Set up DistanceGrids for each zoom\n\t\tfor (var zoom = maxZoom; zoom >= 0; zoom--) {\n\t\t\tthis._gridClusters[zoom] = new L.DistanceGrid(radiusFn(zoom));\n\t\t\tthis._gridUnclustered[zoom] = new L.DistanceGrid(radiusFn(zoom));\n\t\t}\n\n\t\t// Instantiate the appropriate L.MarkerCluster class (animated or not).\n\t\tthis._topClusterLevel = new this._markerCluster(this, -1);\n\t},\n\n\t//Zoom: Zoom to start adding at (Pass this._maxZoom to start at the bottom)\n\t_addLayer: function (layer, zoom) {\n\t\tvar gridClusters = this._gridClusters,\n\t\t gridUnclustered = this._gridUnclustered,\n\t\t markerPoint, z;\n\n\t\tif (this.options.singleMarkerMode) {\n\t\t\tthis._overrideMarkerIcon(layer);\n\t\t}\n\n\t\t//Find the lowest zoom level to slot this one in\n\t\tfor (; zoom >= 0; zoom--) {\n\t\t\tmarkerPoint = this._map.project(layer.getLatLng(), zoom); // calculate pixel position\n\n\t\t\t//Try find a cluster close by\n\t\t\tvar closest = gridClusters[zoom].getNearObject(markerPoint);\n\t\t\tif (closest) {\n\t\t\t\tclosest._addChild(layer);\n\t\t\t\tlayer.__parent = closest;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//Try find a marker close by to form a new cluster with\n\t\t\tclosest = gridUnclustered[zoom].getNearObject(markerPoint);\n\t\t\tif (closest) {\n\t\t\t\tvar parent = closest.__parent;\n\t\t\t\tif (parent) {\n\t\t\t\t\tthis._removeLayer(closest, false);\n\t\t\t\t}\n\n\t\t\t\t//Create new cluster with these 2 in it\n\n\t\t\t\tvar newCluster = new this._markerCluster(this, zoom, closest, layer);\n\t\t\t\tgridClusters[zoom].addObject(newCluster, this._map.project(newCluster._cLatLng, zoom));\n\t\t\t\tclosest.__parent = newCluster;\n\t\t\t\tlayer.__parent = newCluster;\n\n\t\t\t\t//First create any new intermediate parent clusters that don't exist\n\t\t\t\tvar lastParent = newCluster;\n\t\t\t\tfor (z = zoom - 1; z > parent._zoom; z--) {\n\t\t\t\t\tlastParent = new this._markerCluster(this, z, lastParent);\n\t\t\t\t\tgridClusters[z].addObject(lastParent, this._map.project(closest.getLatLng(), z));\n\t\t\t\t}\n\t\t\t\tparent._addChild(lastParent);\n\n\t\t\t\t//Remove closest from this zoom level and any above that it is in, replace with newCluster\n\t\t\t\tthis._removeFromGridUnclustered(closest, zoom);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//Didn't manage to cluster in at this zoom, record us as a marker here and continue upwards\n\t\t\tgridUnclustered[zoom].addObject(layer, markerPoint);\n\t\t}\n\n\t\t//Didn't get in anything, add us to the top\n\t\tthis._topClusterLevel._addChild(layer);\n\t\tlayer.__parent = this._topClusterLevel;\n\t\treturn;\n\t},\n\n\t//Enqueue code to fire after the marker expand/contract has happened\n\t_enqueue: function (fn) {\n\t\tthis._queue.push(fn);\n\t\tif (!this._queueTimeout) {\n\t\t\tthis._queueTimeout = setTimeout(L.bind(this._processQueue, this), 300);\n\t\t}\n\t},\n\t_processQueue: function () {\n\t\tfor (var i = 0; i < this._queue.length; i++) {\n\t\t\tthis._queue[i].call(this);\n\t\t}\n\t\tthis._queue.length = 0;\n\t\tclearTimeout(this._queueTimeout);\n\t\tthis._queueTimeout = null;\n\t},\n\n\t//Merge and split any existing clusters that are too big or small\n\t_mergeSplitClusters: function () {\n\n\t\t//Incase we are starting to split before the animation finished\n\t\tthis._processQueue();\n\n\t\tif (this._zoom < this._map._zoom && this._currentShownBounds.intersects(this._getExpandedVisibleBounds())) { //Zoom in, split\n\t\t\tthis._animationStart();\n\t\t\t//Remove clusters now off screen\n\t\t\tthis._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, this._zoom, this._getExpandedVisibleBounds());\n\n\t\t\tthis._animationZoomIn(this._zoom, this._map._zoom);\n\n\t\t} else if (this._zoom > this._map._zoom) { //Zoom out, merge\n\t\t\tthis._animationStart();\n\n\t\t\tthis._animationZoomOut(this._zoom, this._map._zoom);\n\t\t} else {\n\t\t\tthis._moveEnd();\n\t\t}\n\t},\n\n\t//Gets the maps visible bounds expanded in each direction by the size of the screen (so the user cannot see an area we do not cover in one pan)\n\t_getExpandedVisibleBounds: function () {\n\t\tif (!this.options.removeOutsideVisibleBounds) {\n\t\t\treturn this._mapBoundsInfinite;\n\t\t} else if (L.Browser.mobile) {\n\t\t\treturn this._checkBoundsMaxLat(this._map.getBounds());\n\t\t}\n\n\t\treturn this._checkBoundsMaxLat(this._map.getBounds().pad(1)); // Padding expands the bounds by its own dimensions but scaled with the given factor.\n\t},\n\n\t/**\n\t * Expands the latitude to Infinity (or -Infinity) if the input bounds reach the map projection maximum defined latitude\n\t * (in the case of Web/Spherical Mercator, it is 85.0511287798 / see https://en.wikipedia.org/wiki/Web_Mercator#Formulas).\n\t * Otherwise, the removeOutsideVisibleBounds option will remove markers beyond that limit, whereas the same markers without\n\t * this option (or outside MCG) will have their position floored (ceiled) by the projection and rendered at that limit,\n\t * making the user think that MCG \"eats\" them and never displays them again.\n\t * @param bounds L.LatLngBounds\n\t * @returns {L.LatLngBounds}\n\t * @private\n\t */\n\t_checkBoundsMaxLat: function (bounds) {\n\t\tvar maxLat = this._maxLat;\n\n\t\tif (maxLat !== undefined) {\n\t\t\tif (bounds.getNorth() >= maxLat) {\n\t\t\t\tbounds._northEast.lat = Infinity;\n\t\t\t}\n\t\t\tif (bounds.getSouth() <= -maxLat) {\n\t\t\t\tbounds._southWest.lat = -Infinity;\n\t\t\t}\n\t\t}\n\n\t\treturn bounds;\n\t},\n\n\t//Shared animation code\n\t_animationAddLayerNonAnimated: function (layer, newCluster) {\n\t\tif (newCluster === layer) {\n\t\t\tthis._featureGroup.addLayer(layer);\n\t\t} else if (newCluster._childCount === 2) {\n\t\t\tnewCluster._addToMap();\n\n\t\t\tvar markers = newCluster.getAllChildMarkers();\n\t\t\tthis._featureGroup.removeLayer(markers[0]);\n\t\t\tthis._featureGroup.removeLayer(markers[1]);\n\t\t} else {\n\t\t\tnewCluster._updateIcon();\n\t\t}\n\t},\n\n\t/**\n\t * Implements the singleMarkerMode option.\n\t * @param layer Marker to re-style using the Clusters iconCreateFunction.\n\t * @returns {L.Icon} The newly created icon.\n\t * @private\n\t */\n\t_overrideMarkerIcon: function (layer) {\n\t\tvar icon = layer.options.icon = this.options.iconCreateFunction({\n\t\t\tgetChildCount: function () {\n\t\t\t\treturn 1;\n\t\t\t},\n\t\t\tgetAllChildMarkers: function () {\n\t\t\t\treturn [layer];\n\t\t\t}\n\t\t});\n\n\t\treturn icon;\n\t}\n});\n\n// Constant bounds used in case option \"removeOutsideVisibleBounds\" is set to false.\nL.MarkerClusterGroup.include({\n\t_mapBoundsInfinite: new L.LatLngBounds(new L.LatLng(-Infinity, -Infinity), new L.LatLng(Infinity, Infinity))\n});\n\nL.MarkerClusterGroup.include({\n\t_noAnimation: {\n\t\t//Non Animated versions of everything\n\t\t_animationStart: function () {\n\t\t\t//Do nothing...\n\t\t},\n\t\t_animationZoomIn: function (previousZoomLevel, newZoomLevel) {\n\t\t\tthis._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, previousZoomLevel);\n\t\t\tthis._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds());\n\n\t\t\t//We didn't actually animate, but we use this event to mean \"clustering animations have finished\"\n\t\t\tthis.fire('animationend');\n\t\t},\n\t\t_animationZoomOut: function (previousZoomLevel, newZoomLevel) {\n\t\t\tthis._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, previousZoomLevel);\n\t\t\tthis._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds());\n\n\t\t\t//We didn't actually animate, but we use this event to mean \"clustering animations have finished\"\n\t\t\tthis.fire('animationend');\n\t\t},\n\t\t_animationAddLayer: function (layer, newCluster) {\n\t\t\tthis._animationAddLayerNonAnimated(layer, newCluster);\n\t\t}\n\t},\n\t_withAnimation: {\n\t\t//Animated versions here\n\t\t_animationStart: function () {\n\t\t\tthis._map._mapPane.className += ' leaflet-cluster-anim';\n\t\t\tthis._inZoomAnimation++;\n\t\t},\n\t\t_animationZoomIn: function (previousZoomLevel, newZoomLevel) {\n\t\t\tvar bounds = this._getExpandedVisibleBounds(),\n\t\t\t fg = this._featureGroup,\n\t\t\t i;\n\n\t\t\t//Add all children of current clusters to map and remove those clusters from map\n\t\t\tthis._topClusterLevel._recursively(bounds, previousZoomLevel, 0, function (c) {\n\t\t\t\tvar startPos = c._latlng,\n\t\t\t\t markers = c._markers,\n\t\t\t\t m;\n\n\t\t\t\tif (!bounds.contains(startPos)) {\n\t\t\t\t\tstartPos = null;\n\t\t\t\t}\n\n\t\t\t\tif (c._isSingleParent() && previousZoomLevel + 1 === newZoomLevel) { //Immediately add the new child and remove us\n\t\t\t\t\tfg.removeLayer(c);\n\t\t\t\t\tc._recursivelyAddChildrenToMap(null, newZoomLevel, bounds);\n\t\t\t\t} else {\n\t\t\t\t\t//Fade out old cluster\n\t\t\t\t\tc.clusterHide();\n\t\t\t\t\tc._recursivelyAddChildrenToMap(startPos, newZoomLevel, bounds);\n\t\t\t\t}\n\n\t\t\t\t//Remove all markers that aren't visible any more\n\t\t\t\t//TODO: Do we actually need to do this on the higher levels too?\n\t\t\t\tfor (i = markers.length - 1; i >= 0; i--) {\n\t\t\t\t\tm = markers[i];\n\t\t\t\t\tif (!bounds.contains(m._latlng)) {\n\t\t\t\t\t\tfg.removeLayer(m);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t\tthis._forceLayout();\n\n\t\t\t//Update opacities\n\t\t\tthis._topClusterLevel._recursivelyBecomeVisible(bounds, newZoomLevel);\n\t\t\t//TODO Maybe? Update markers in _recursivelyBecomeVisible\n\t\t\tfg.eachLayer(function (n) {\n\t\t\t\tif (!(n instanceof L.MarkerCluster) && n._icon) {\n\t\t\t\t\tn.clusterShow();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t//update the positions of the just added clusters/markers\n\t\t\tthis._topClusterLevel._recursively(bounds, previousZoomLevel, newZoomLevel, function (c) {\n\t\t\t\tc._recursivelyRestoreChildPositions(newZoomLevel);\n\t\t\t});\n\n\t\t\t//Remove the old clusters and close the zoom animation\n\t\t\tthis._enqueue(function () {\n\t\t\t\t//update the positions of the just added clusters/markers\n\t\t\t\tthis._topClusterLevel._recursively(bounds, previousZoomLevel, 0, function (c) {\n\t\t\t\t\tfg.removeLayer(c);\n\t\t\t\t\tc.clusterShow();\n\t\t\t\t});\n\n\t\t\t\tthis._animationEnd();\n\t\t\t});\n\t\t},\n\n\t\t_animationZoomOut: function (previousZoomLevel, newZoomLevel) {\n\t\t\tthis._animationZoomOutSingle(this._topClusterLevel, previousZoomLevel - 1, newZoomLevel);\n\n\t\t\t//Need to add markers for those that weren't on the map before but are now\n\t\t\tthis._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds());\n\t\t\t//Remove markers that were on the map before but won't be now\n\t\t\tthis._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, previousZoomLevel, this._getExpandedVisibleBounds());\n\t\t},\n\t\t_animationAddLayer: function (layer, newCluster) {\n\t\t\tvar me = this,\n\t\t\t fg = this._featureGroup;\n\n\t\t\tfg.addLayer(layer);\n\t\t\tif (newCluster !== layer) {\n\t\t\t\tif (newCluster._childCount > 2) { //Was already a cluster\n\n\t\t\t\t\tnewCluster._updateIcon();\n\t\t\t\t\tthis._forceLayout();\n\t\t\t\t\tthis._animationStart();\n\n\t\t\t\t\tlayer._setPos(this._map.latLngToLayerPoint(newCluster.getLatLng()));\n\t\t\t\t\tlayer.clusterHide();\n\n\t\t\t\t\tthis._enqueue(function () {\n\t\t\t\t\t\tfg.removeLayer(layer);\n\t\t\t\t\t\tlayer.clusterShow();\n\n\t\t\t\t\t\tme._animationEnd();\n\t\t\t\t\t});\n\n\t\t\t\t} else { //Just became a cluster\n\t\t\t\t\tthis._forceLayout();\n\n\t\t\t\t\tme._animationStart();\n\t\t\t\t\tme._animationZoomOutSingle(newCluster, this._map.getMaxZoom(), this._map.getZoom());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Private methods for animated versions.\n\t_animationZoomOutSingle: function (cluster, previousZoomLevel, newZoomLevel) {\n\t\tvar bounds = this._getExpandedVisibleBounds();\n\n\t\t//Animate all of the markers in the clusters to move to their cluster center point\n\t\tcluster._recursivelyAnimateChildrenInAndAddSelfToMap(bounds, previousZoomLevel + 1, newZoomLevel);\n\n\t\tvar me = this;\n\n\t\t//Update the opacity (If we immediately set it they won't animate)\n\t\tthis._forceLayout();\n\t\tcluster._recursivelyBecomeVisible(bounds, newZoomLevel);\n\n\t\t//TODO: Maybe use the transition timing stuff to make this more reliable\n\t\t//When the animations are done, tidy up\n\t\tthis._enqueue(function () {\n\n\t\t\t//This cluster stopped being a cluster before the timeout fired\n\t\t\tif (cluster._childCount === 1) {\n\t\t\t\tvar m = cluster._markers[0];\n\t\t\t\t//If we were in a cluster animation at the time then the opacity and position of our child could be wrong now, so fix it\n\t\t\t\tm.setLatLng(m.getLatLng());\n\t\t\t\tif (m.clusterShow) {\n\t\t\t\t\tm.clusterShow();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcluster._recursively(bounds, newZoomLevel, 0, function (c) {\n\t\t\t\t\tc._recursivelyRemoveChildrenFromMap(bounds, previousZoomLevel + 1);\n\t\t\t\t});\n\t\t\t}\n\t\t\tme._animationEnd();\n\t\t});\n\t},\n\n\t_animationEnd: function () {\n\t\tif (this._map) {\n\t\t\tthis._map._mapPane.className = this._map._mapPane.className.replace(' leaflet-cluster-anim', '');\n\t\t}\n\t\tthis._inZoomAnimation--;\n\t\tthis.fire('animationend');\n\t},\n\n\t//Force a browser layout of stuff in the map\n\t// Should apply the current opacity and location to all elements so we can update them again for an animation\n\t_forceLayout: function () {\n\t\t//In my testing this works, infact offsetWidth of any element seems to work.\n\t\t//Could loop all this._layers and do this for each _icon if it stops working\n\n\t\tL.Util.falseFn(document.body.offsetWidth);\n\t}\n});\n\nL.markerClusterGroup = function (options) {\n\treturn new L.MarkerClusterGroup(options);\n};\n\n\nL.MarkerCluster = L.Marker.extend({\n\tinitialize: function (group, zoom, a, b) {\n\n\t\tL.Marker.prototype.initialize.call(this, a ? (a._cLatLng || a.getLatLng()) : new L.LatLng(0, 0), { icon: this });\n\n\n\t\tthis._group = group;\n\t\tthis._zoom = zoom;\n\n\t\tthis._markers = [];\n\t\tthis._childClusters = [];\n\t\tthis._childCount = 0;\n\t\tthis._iconNeedsUpdate = true;\n\t\tthis._boundsNeedUpdate = true;\n\n\t\tthis._bounds = new L.LatLngBounds();\n\n\t\tif (a) {\n\t\t\tthis._addChild(a);\n\t\t}\n\t\tif (b) {\n\t\t\tthis._addChild(b);\n\t\t}\n\t},\n\n\t//Recursively retrieve all child markers of this cluster\n\tgetAllChildMarkers: function (storageArray) {\n\t\tstorageArray = storageArray || [];\n\n\t\tfor (var i = this._childClusters.length - 1; i >= 0; i--) {\n\t\t\tthis._childClusters[i].getAllChildMarkers(storageArray);\n\t\t}\n\n\t\tfor (var j = this._markers.length - 1; j >= 0; j--) {\n\t\t\tstorageArray.push(this._markers[j]);\n\t\t}\n\n\t\treturn storageArray;\n\t},\n\n\t//Returns the count of how many child markers we have\n\tgetChildCount: function () {\n\t\treturn this._childCount;\n\t},\n\n\t//Zoom to the minimum of showing all of the child markers, or the extents of this cluster\n\tzoomToBounds: function () {\n\t\tvar childClusters = this._childClusters.slice(),\n\t\t\tmap = this._group._map,\n\t\t\tboundsZoom = map.getBoundsZoom(this._bounds),\n\t\t\tzoom = this._zoom + 1,\n\t\t\tmapZoom = map.getZoom(),\n\t\t\ti;\n\n\t\t//calculate how far we need to zoom down to see all of the markers\n\t\twhile (childClusters.length > 0 && boundsZoom > zoom) {\n\t\t\tzoom++;\n\t\t\tvar newClusters = [];\n\t\t\tfor (i = 0; i < childClusters.length; i++) {\n\t\t\t\tnewClusters = newClusters.concat(childClusters[i]._childClusters);\n\t\t\t}\n\t\t\tchildClusters = newClusters;\n\t\t}\n\n\t\tif (boundsZoom > zoom) {\n\t\t\tthis._group._map.setView(this._latlng, zoom);\n\t\t} else if (boundsZoom <= mapZoom) { //If fitBounds wouldn't zoom us down, zoom us down instead\n\t\t\tthis._group._map.setView(this._latlng, mapZoom + 1);\n\t\t} else {\n\t\t\tthis._group._map.fitBounds(this._bounds);\n\t\t}\n\t},\n\n\tgetBounds: function () {\n\t\tvar bounds = new L.LatLngBounds();\n\t\tbounds.extend(this._bounds);\n\t\treturn bounds;\n\t},\n\n\t_updateIcon: function () {\n\t\tthis._iconNeedsUpdate = true;\n\t\tif (this._icon) {\n\t\t\tthis.setIcon(this);\n\t\t}\n\t},\n\n\t//Cludge for Icon, we pretend to be an icon for performance\n\tcreateIcon: function () {\n\t\tif (this._iconNeedsUpdate) {\n\t\t\tthis._iconObj = this._group.options.iconCreateFunction(this);\n\t\t\tthis._iconNeedsUpdate = false;\n\t\t}\n\t\treturn this._iconObj.createIcon();\n\t},\n\tcreateShadow: function () {\n\t\treturn this._iconObj.createShadow();\n\t},\n\n\n\t_addChild: function (new1, isNotificationFromChild) {\n\n\t\tthis._iconNeedsUpdate = true;\n\n\t\tthis._boundsNeedUpdate = true;\n\t\tthis._setClusterCenter(new1);\n\n\t\tif (new1 instanceof L.MarkerCluster) {\n\t\t\tif (!isNotificationFromChild) {\n\t\t\t\tthis._childClusters.push(new1);\n\t\t\t\tnew1.__parent = this;\n\t\t\t}\n\t\t\tthis._childCount += new1._childCount;\n\t\t} else {\n\t\t\tif (!isNotificationFromChild) {\n\t\t\t\tthis._markers.push(new1);\n\t\t\t}\n\t\t\tthis._childCount++;\n\t\t}\n\n\t\tif (this.__parent) {\n\t\t\tthis.__parent._addChild(new1, true);\n\t\t}\n\t},\n\n\t/**\n\t * Makes sure the cluster center is set. If not, uses the child center if it is a cluster, or the marker position.\n\t * @param child L.MarkerCluster|L.Marker that will be used as cluster center if not defined yet.\n\t * @private\n\t */\n\t_setClusterCenter: function (child) {\n\t\tif (!this._cLatLng) {\n\t\t\t// when clustering, take position of the first point as the cluster center\n\t\t\tthis._cLatLng = child._cLatLng || child._latlng;\n\t\t}\n\t},\n\n\t/**\n\t * Assigns impossible bounding values so that the next extend entirely determines the new bounds.\n\t * This method avoids having to trash the previous L.LatLngBounds object and to create a new one, which is much slower for this class.\n\t * As long as the bounds are not extended, most other methods would probably fail, as they would with bounds initialized but not extended.\n\t * @private\n\t */\n\t_resetBounds: function () {\n\t\tvar bounds = this._bounds;\n\n\t\tif (bounds._southWest) {\n\t\t\tbounds._southWest.lat = Infinity;\n\t\t\tbounds._southWest.lng = Infinity;\n\t\t}\n\t\tif (bounds._northEast) {\n\t\t\tbounds._northEast.lat = -Infinity;\n\t\t\tbounds._northEast.lng = -Infinity;\n\t\t}\n\t},\n\n\t_recalculateBounds: function () {\n\t\tvar markers = this._markers,\n\t\t childClusters = this._childClusters,\n\t\t latSum = 0,\n\t\t lngSum = 0,\n\t\t totalCount = this._childCount,\n\t\t i, child, childLatLng, childCount;\n\n\t\t// Case where all markers are removed from the map and we are left with just an empty _topClusterLevel.\n\t\tif (totalCount === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Reset rather than creating a new object, for performance.\n\t\tthis._resetBounds();\n\n\t\t// Child markers.\n\t\tfor (i = 0; i < markers.length; i++) {\n\t\t\tchildLatLng = markers[i]._latlng;\n\n\t\t\tthis._bounds.extend(childLatLng);\n\n\t\t\tlatSum += childLatLng.lat;\n\t\t\tlngSum += childLatLng.lng;\n\t\t}\n\n\t\t// Child clusters.\n\t\tfor (i = 0; i < childClusters.length; i++) {\n\t\t\tchild = childClusters[i];\n\n\t\t\t// Re-compute child bounds and weighted position first if necessary.\n\t\t\tif (child._boundsNeedUpdate) {\n\t\t\t\tchild._recalculateBounds();\n\t\t\t}\n\n\t\t\tthis._bounds.extend(child._bounds);\n\n\t\t\tchildLatLng = child._wLatLng;\n\t\t\tchildCount = child._childCount;\n\n\t\t\tlatSum += childLatLng.lat * childCount;\n\t\t\tlngSum += childLatLng.lng * childCount;\n\t\t}\n\n\t\tthis._latlng = this._wLatLng = new L.LatLng(latSum / totalCount, lngSum / totalCount);\n\n\t\t// Reset dirty flag.\n\t\tthis._boundsNeedUpdate = false;\n\t},\n\n\t//Set our markers position as given and add it to the map\n\t_addToMap: function (startPos) {\n\t\tif (startPos) {\n\t\t\tthis._backupLatlng = this._latlng;\n\t\t\tthis.setLatLng(startPos);\n\t\t}\n\t\tthis._group._featureGroup.addLayer(this);\n\t},\n\n\t_recursivelyAnimateChildrenIn: function (bounds, center, maxZoom) {\n\t\tthis._recursively(bounds, 0, maxZoom - 1,\n\t\t\tfunction (c) {\n\t\t\t\tvar markers = c._markers,\n\t\t\t\t\ti, m;\n\t\t\t\tfor (i = markers.length - 1; i >= 0; i--) {\n\t\t\t\t\tm = markers[i];\n\n\t\t\t\t\t//Only do it if the icon is still on the map\n\t\t\t\t\tif (m._icon) {\n\t\t\t\t\t\tm._setPos(center);\n\t\t\t\t\t\tm.clusterHide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tfunction (c) {\n\t\t\t\tvar childClusters = c._childClusters,\n\t\t\t\t\tj, cm;\n\t\t\t\tfor (j = childClusters.length - 1; j >= 0; j--) {\n\t\t\t\t\tcm = childClusters[j];\n\t\t\t\t\tif (cm._icon) {\n\t\t\t\t\t\tcm._setPos(center);\n\t\t\t\t\t\tcm.clusterHide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t},\n\n\t_recursivelyAnimateChildrenInAndAddSelfToMap: function (bounds, previousZoomLevel, newZoomLevel) {\n\t\tthis._recursively(bounds, newZoomLevel, 0,\n\t\t\tfunction (c) {\n\t\t\t\tc._recursivelyAnimateChildrenIn(bounds, c._group._map.latLngToLayerPoint(c.getLatLng()).round(), previousZoomLevel);\n\n\t\t\t\t//TODO: depthToAnimateIn affects _isSingleParent, if there is a multizoom we may/may not be.\n\t\t\t\t//As a hack we only do a animation free zoom on a single level zoom, if someone does multiple levels then we always animate\n\t\t\t\tif (c._isSingleParent() && previousZoomLevel - 1 === newZoomLevel) {\n\t\t\t\t\tc.clusterShow();\n\t\t\t\t\tc._recursivelyRemoveChildrenFromMap(bounds, previousZoomLevel); //Immediately remove our children as we are replacing them. TODO previousBounds not bounds\n\t\t\t\t} else {\n\t\t\t\t\tc.clusterHide();\n\t\t\t\t}\n\n\t\t\t\tc._addToMap();\n\t\t\t}\n\t\t);\n\t},\n\n\t_recursivelyBecomeVisible: function (bounds, zoomLevel) {\n\t\tthis._recursively(bounds, 0, zoomLevel, null, function (c) {\n\t\t\tc.clusterShow();\n\t\t});\n\t},\n\n\t_recursivelyAddChildrenToMap: function (startPos, zoomLevel, bounds) {\n\t\tthis._recursively(bounds, -1, zoomLevel,\n\t\t\tfunction (c) {\n\t\t\t\tif (zoomLevel === c._zoom) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t//Add our child markers at startPos (so they can be animated out)\n\t\t\t\tfor (var i = c._markers.length - 1; i >= 0; i--) {\n\t\t\t\t\tvar nm = c._markers[i];\n\n\t\t\t\t\tif (!bounds.contains(nm._latlng)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (startPos) {\n\t\t\t\t\t\tnm._backupLatlng = nm.getLatLng();\n\n\t\t\t\t\t\tnm.setLatLng(startPos);\n\t\t\t\t\t\tif (nm.clusterHide) {\n\t\t\t\t\t\t\tnm.clusterHide();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tc._group._featureGroup.addLayer(nm);\n\t\t\t\t}\n\t\t\t},\n\t\t\tfunction (c) {\n\t\t\t\tc._addToMap(startPos);\n\t\t\t}\n\t\t);\n\t},\n\n\t_recursivelyRestoreChildPositions: function (zoomLevel) {\n\t\t//Fix positions of child markers\n\t\tfor (var i = this._markers.length - 1; i >= 0; i--) {\n\t\t\tvar nm = this._markers[i];\n\t\t\tif (nm._backupLatlng) {\n\t\t\t\tnm.setLatLng(nm._backupLatlng);\n\t\t\t\tdelete nm._backupLatlng;\n\t\t\t}\n\t\t}\n\n\t\tif (zoomLevel - 1 === this._zoom) {\n\t\t\t//Reposition child clusters\n\t\t\tfor (var j = this._childClusters.length - 1; j >= 0; j--) {\n\t\t\t\tthis._childClusters[j]._restorePosition();\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var k = this._childClusters.length - 1; k >= 0; k--) {\n\t\t\t\tthis._childClusters[k]._recursivelyRestoreChildPositions(zoomLevel);\n\t\t\t}\n\t\t}\n\t},\n\n\t_restorePosition: function () {\n\t\tif (this._backupLatlng) {\n\t\t\tthis.setLatLng(this._backupLatlng);\n\t\t\tdelete this._backupLatlng;\n\t\t}\n\t},\n\n\t//exceptBounds: If set, don't remove any markers/clusters in it\n\t_recursivelyRemoveChildrenFromMap: function (previousBounds, zoomLevel, exceptBounds) {\n\t\tvar m, i;\n\t\tthis._recursively(previousBounds, -1, zoomLevel - 1,\n\t\t\tfunction (c) {\n\t\t\t\t//Remove markers at every level\n\t\t\t\tfor (i = c._markers.length - 1; i >= 0; i--) {\n\t\t\t\t\tm = c._markers[i];\n\t\t\t\t\tif (!exceptBounds || !exceptBounds.contains(m._latlng)) {\n\t\t\t\t\t\tc._group._featureGroup.removeLayer(m);\n\t\t\t\t\t\tif (m.clusterShow) {\n\t\t\t\t\t\t\tm.clusterShow();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tfunction (c) {\n\t\t\t\t//Remove child clusters at just the bottom level\n\t\t\t\tfor (i = c._childClusters.length - 1; i >= 0; i--) {\n\t\t\t\t\tm = c._childClusters[i];\n\t\t\t\t\tif (!exceptBounds || !exceptBounds.contains(m._latlng)) {\n\t\t\t\t\t\tc._group._featureGroup.removeLayer(m);\n\t\t\t\t\t\tif (m.clusterShow) {\n\t\t\t\t\t\t\tm.clusterShow();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t},\n\n\t//Run the given functions recursively to this and child clusters\n\t// boundsToApplyTo: a L.LatLngBounds representing the bounds of what clusters to recurse in to\n\t// zoomLevelToStart: zoom level to start running functions (inclusive)\n\t// zoomLevelToStop: zoom level to stop running functions (inclusive)\n\t// runAtEveryLevel: function that takes an L.MarkerCluster as an argument that should be applied on every level\n\t// runAtBottomLevel: function that takes an L.MarkerCluster as an argument that should be applied at only the bottom level\n\t_recursively: function (boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel) {\n\t\tvar childClusters = this._childClusters,\n\t\t zoom = this._zoom,\n\t\t i, c;\n\n\t\tif (zoomLevelToStart > zoom) { //Still going down to required depth, just recurse to child clusters\n\t\t\tfor (i = childClusters.length - 1; i >= 0; i--) {\n\t\t\t\tc = childClusters[i];\n\t\t\t\tif (boundsToApplyTo.intersects(c._bounds)) {\n\t\t\t\t\tc._recursively(boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel);\n\t\t\t\t}\n\t\t\t}\n\t\t} else { //In required depth\n\n\t\t\tif (runAtEveryLevel) {\n\t\t\t\trunAtEveryLevel(this);\n\t\t\t}\n\t\t\tif (runAtBottomLevel && this._zoom === zoomLevelToStop) {\n\t\t\t\trunAtBottomLevel(this);\n\t\t\t}\n\n\t\t\t//TODO: This loop is almost the same as above\n\t\t\tif (zoomLevelToStop > zoom) {\n\t\t\t\tfor (i = childClusters.length - 1; i >= 0; i--) {\n\t\t\t\t\tc = childClusters[i];\n\t\t\t\t\tif (boundsToApplyTo.intersects(c._bounds)) {\n\t\t\t\t\t\tc._recursively(boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t//Returns true if we are the parent of only one cluster and that cluster is the same as us\n\t_isSingleParent: function () {\n\t\t//Don't need to check this._markers as the rest won't work if there are any\n\t\treturn this._childClusters.length > 0 && this._childClusters[0]._childCount === this._childCount;\n\t}\n});\n\n\n\n/*\n* Extends L.Marker to include two extra methods: clusterHide and clusterShow.\n* \n* They work as setOpacity(0) and setOpacity(1) respectively, but\n* they will remember the marker's opacity when hiding and showing it again.\n* \n*/\n\n\nL.Marker.include({\n\t\n\tclusterHide: function () {\n\t\tthis.options.opacityWhenUnclustered = this.options.opacity || 1;\n\t\treturn this.setOpacity(0);\n\t},\n\t\n\tclusterShow: function () {\n\t\tvar ret = this.setOpacity(this.options.opacity || this.options.opacityWhenUnclustered);\n\t\tdelete this.options.opacityWhenUnclustered;\n\t\treturn ret;\n\t}\n\t\n});\n\n\n\n\n\nL.DistanceGrid = function (cellSize) {\n\tthis._cellSize = cellSize;\n\tthis._sqCellSize = cellSize * cellSize;\n\tthis._grid = {};\n\tthis._objectPoint = { };\n};\n\nL.DistanceGrid.prototype = {\n\n\taddObject: function (obj, point) {\n\t\tvar x = this._getCoord(point.x),\n\t\t y = this._getCoord(point.y),\n\t\t grid = this._grid,\n\t\t row = grid[y] = grid[y] || {},\n\t\t cell = row[x] = row[x] || [],\n\t\t stamp = L.Util.stamp(obj);\n\n\t\tthis._objectPoint[stamp] = point;\n\n\t\tcell.push(obj);\n\t},\n\n\tupdateObject: function (obj, point) {\n\t\tthis.removeObject(obj);\n\t\tthis.addObject(obj, point);\n\t},\n\n\t//Returns true if the object was found\n\tremoveObject: function (obj, point) {\n\t\tvar x = this._getCoord(point.x),\n\t\t y = this._getCoord(point.y),\n\t\t grid = this._grid,\n\t\t row = grid[y] = grid[y] || {},\n\t\t cell = row[x] = row[x] || [],\n\t\t i, len;\n\n\t\tdelete this._objectPoint[L.Util.stamp(obj)];\n\n\t\tfor (i = 0, len = cell.length; i < len; i++) {\n\t\t\tif (cell[i] === obj) {\n\n\t\t\t\tcell.splice(i, 1);\n\n\t\t\t\tif (len === 1) {\n\t\t\t\t\tdelete row[x];\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t},\n\n\teachObject: function (fn, context) {\n\t\tvar i, j, k, len, row, cell, removed,\n\t\t grid = this._grid;\n\n\t\tfor (i in grid) {\n\t\t\trow = grid[i];\n\n\t\t\tfor (j in row) {\n\t\t\t\tcell = row[j];\n\n\t\t\t\tfor (k = 0, len = cell.length; k < len; k++) {\n\t\t\t\t\tremoved = fn.call(context, cell[k]);\n\t\t\t\t\tif (removed) {\n\t\t\t\t\t\tk--;\n\t\t\t\t\t\tlen--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tgetNearObject: function (point) {\n\t\tvar x = this._getCoord(point.x),\n\t\t y = this._getCoord(point.y),\n\t\t i, j, k, row, cell, len, obj, dist,\n\t\t objectPoint = this._objectPoint,\n\t\t closestDistSq = this._sqCellSize,\n\t\t closest = null;\n\n\t\tfor (i = y - 1; i <= y + 1; i++) {\n\t\t\trow = this._grid[i];\n\t\t\tif (row) {\n\n\t\t\t\tfor (j = x - 1; j <= x + 1; j++) {\n\t\t\t\t\tcell = row[j];\n\t\t\t\t\tif (cell) {\n\n\t\t\t\t\t\tfor (k = 0, len = cell.length; k < len; k++) {\n\t\t\t\t\t\t\tobj = cell[k];\n\t\t\t\t\t\t\tdist = this._sqDist(objectPoint[L.Util.stamp(obj)], point);\n\t\t\t\t\t\t\tif (dist < closestDistSq) {\n\t\t\t\t\t\t\t\tclosestDistSq = dist;\n\t\t\t\t\t\t\t\tclosest = obj;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn closest;\n\t},\n\n\t_getCoord: function (x) {\n\t\treturn Math.floor(x / this._cellSize);\n\t},\n\n\t_sqDist: function (p, p2) {\n\t\tvar dx = p2.x - p.x,\n\t\t dy = p2.y - p.y;\n\t\treturn dx * dx + dy * dy;\n\t}\n};\n\n\n/* Copyright (c) 2012 the authors listed at the following URL, and/or\nthe authors of referenced articles or incorporated external code:\nhttp://en.literateprograms.org/Quickhull_(Javascript)?action=history&offset=20120410175256\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nRetrieved from: http://en.literateprograms.org/Quickhull_(Javascript)?oldid=18434\n*/\n\n(function () {\n\tL.QuickHull = {\n\n\t\t/*\n\t\t * @param {Object} cpt a point to be measured from the baseline\n\t\t * @param {Array} bl the baseline, as represented by a two-element\n\t\t * array of latlng objects.\n\t\t * @returns {Number} an approximate distance measure\n\t\t */\n\t\tgetDistant: function (cpt, bl) {\n\t\t\tvar vY = bl[1].lat - bl[0].lat,\n\t\t\t\tvX = bl[0].lng - bl[1].lng;\n\t\t\treturn (vX * (cpt.lat - bl[0].lat) + vY * (cpt.lng - bl[0].lng));\n\t\t},\n\n\t\t/*\n\t\t * @param {Array} baseLine a two-element array of latlng objects\n\t\t * representing the baseline to project from\n\t\t * @param {Array} latLngs an array of latlng objects\n\t\t * @returns {Object} the maximum point and all new points to stay\n\t\t * in consideration for the hull.\n\t\t */\n\t\tfindMostDistantPointFromBaseLine: function (baseLine, latLngs) {\n\t\t\tvar maxD = 0,\n\t\t\t\tmaxPt = null,\n\t\t\t\tnewPoints = [],\n\t\t\t\ti, pt, d;\n\n\t\t\tfor (i = latLngs.length - 1; i >= 0; i--) {\n\t\t\t\tpt = latLngs[i];\n\t\t\t\td = this.getDistant(pt, baseLine);\n\n\t\t\t\tif (d > 0) {\n\t\t\t\t\tnewPoints.push(pt);\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (d > maxD) {\n\t\t\t\t\tmaxD = d;\n\t\t\t\t\tmaxPt = pt;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { maxPoint: maxPt, newPoints: newPoints };\n\t\t},\n\n\n\t\t/*\n\t\t * Given a baseline, compute the convex hull of latLngs as an array\n\t\t * of latLngs.\n\t\t *\n\t\t * @param {Array} latLngs\n\t\t * @returns {Array}\n\t\t */\n\t\tbuildConvexHull: function (baseLine, latLngs) {\n\t\t\tvar convexHullBaseLines = [],\n\t\t\t\tt = this.findMostDistantPointFromBaseLine(baseLine, latLngs);\n\n\t\t\tif (t.maxPoint) { // if there is still a point \"outside\" the base line\n\t\t\t\tconvexHullBaseLines =\n\t\t\t\t\tconvexHullBaseLines.concat(\n\t\t\t\t\t\tthis.buildConvexHull([baseLine[0], t.maxPoint], t.newPoints)\n\t\t\t\t\t);\n\t\t\t\tconvexHullBaseLines =\n\t\t\t\t\tconvexHullBaseLines.concat(\n\t\t\t\t\t\tthis.buildConvexHull([t.maxPoint, baseLine[1]], t.newPoints)\n\t\t\t\t\t);\n\t\t\t\treturn convexHullBaseLines;\n\t\t\t} else { // if there is no more point \"outside\" the base line, the current base line is part of the convex hull\n\t\t\t\treturn [baseLine[0]];\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\t * Given an array of latlngs, compute a convex hull as an array\n\t\t * of latlngs\n\t\t *\n\t\t * @param {Array} latLngs\n\t\t * @returns {Array}\n\t\t */\n\t\tgetConvexHull: function (latLngs) {\n\t\t\t// find first baseline\n\t\t\tvar maxLat = false, minLat = false,\n\t\t\t\tmaxLng = false, minLng = false,\n\t\t\t\tmaxLatPt = null, minLatPt = null,\n\t\t\t\tmaxLngPt = null, minLngPt = null,\n\t\t\t\tmaxPt = null, minPt = null,\n\t\t\t\ti;\n\n\t\t\tfor (i = latLngs.length - 1; i >= 0; i--) {\n\t\t\t\tvar pt = latLngs[i];\n\t\t\t\tif (maxLat === false || pt.lat > maxLat) {\n\t\t\t\t\tmaxLatPt = pt;\n\t\t\t\t\tmaxLat = pt.lat;\n\t\t\t\t}\n\t\t\t\tif (minLat === false || pt.lat < minLat) {\n\t\t\t\t\tminLatPt = pt;\n\t\t\t\t\tminLat = pt.lat;\n\t\t\t\t}\n\t\t\t\tif (maxLng === false || pt.lng > maxLng) {\n\t\t\t\t\tmaxLngPt = pt;\n\t\t\t\t\tmaxLng = pt.lng;\n\t\t\t\t}\n\t\t\t\tif (minLng === false || pt.lng < minLng) {\n\t\t\t\t\tminLngPt = pt;\n\t\t\t\t\tminLng = pt.lng;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (minLat !== maxLat) {\n\t\t\t\tminPt = minLatPt;\n\t\t\t\tmaxPt = maxLatPt;\n\t\t\t} else {\n\t\t\t\tminPt = minLngPt;\n\t\t\t\tmaxPt = maxLngPt;\n\t\t\t}\n\n\t\t\tvar ch = [].concat(this.buildConvexHull([minPt, maxPt], latLngs),\n\t\t\t\t\t\t\t\tthis.buildConvexHull([maxPt, minPt], latLngs));\n\t\t\treturn ch;\n\t\t}\n\t};\n}());\n\nL.MarkerCluster.include({\n\tgetConvexHull: function () {\n\t\tvar childMarkers = this.getAllChildMarkers(),\n\t\t\tpoints = [],\n\t\t\tp, i;\n\n\t\tfor (i = childMarkers.length - 1; i >= 0; i--) {\n\t\t\tp = childMarkers[i].getLatLng();\n\t\t\tpoints.push(p);\n\t\t}\n\n\t\treturn L.QuickHull.getConvexHull(points);\n\t}\n});\n\n\n//This code is 100% based on https://github.com/jawj/OverlappingMarkerSpiderfier-Leaflet\n//Huge thanks to jawj for implementing it first to make my job easy :-)\n\nL.MarkerCluster.include({\n\n\t_2PI: Math.PI * 2,\n\t_circleFootSeparation: 25, //related to circumference of circle\n\t_circleStartAngle: Math.PI / 6,\n\n\t_spiralFootSeparation: 28, //related to size of spiral (experiment!)\n\t_spiralLengthStart: 11,\n\t_spiralLengthFactor: 5,\n\n\t_circleSpiralSwitchover: 9, //show spiral instead of circle from this marker count upwards.\n\t\t\t\t\t\t\t\t// 0 -> always spiral; Infinity -> always circle\n\n\tspiderfy: function () {\n\t\tif (this._group._spiderfied === this || this._group._inZoomAnimation) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar childMarkers = this.getAllChildMarkers(),\n\t\t\tgroup = this._group,\n\t\t\tmap = group._map,\n\t\t\tcenter = map.latLngToLayerPoint(this._latlng),\n\t\t\tpositions;\n\n\t\tthis._group._unspiderfy();\n\t\tthis._group._spiderfied = this;\n\n\t\t//TODO Maybe: childMarkers order by distance to center\n\n\t\tif (childMarkers.length >= this._circleSpiralSwitchover) {\n\t\t\tpositions = this._generatePointsSpiral(childMarkers.length, center);\n\t\t} else {\n\t\t\tcenter.y += 10; // Otherwise circles look wrong => hack for standard blue icon, renders differently for other icons.\n\t\t\tpositions = this._generatePointsCircle(childMarkers.length, center);\n\t\t}\n\n\t\tthis._animationSpiderfy(childMarkers, positions);\n\t},\n\n\tunspiderfy: function (zoomDetails) {\n\t\t/// Argument from zoomanim if being called in a zoom animation or null otherwise\n\t\tif (this._group._inZoomAnimation) {\n\t\t\treturn;\n\t\t}\n\t\tthis._animationUnspiderfy(zoomDetails);\n\n\t\tthis._group._spiderfied = null;\n\t},\n\n\t_generatePointsCircle: function (count, centerPt) {\n\t\tvar circumference = this._group.options.spiderfyDistanceMultiplier * this._circleFootSeparation * (2 + count),\n\t\t\tlegLength = circumference / this._2PI, //radius from circumference\n\t\t\tangleStep = this._2PI / count,\n\t\t\tres = [],\n\t\t\ti, angle;\n\n\t\tres.length = count;\n\n\t\tfor (i = count - 1; i >= 0; i--) {\n\t\t\tangle = this._circleStartAngle + i * angleStep;\n\t\t\tres[i] = new L.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))._round();\n\t\t}\n\n\t\treturn res;\n\t},\n\n\t_generatePointsSpiral: function (count, centerPt) {\n\t\tvar spiderfyDistanceMultiplier = this._group.options.spiderfyDistanceMultiplier,\n\t\t\tlegLength = spiderfyDistanceMultiplier * this._spiralLengthStart,\n\t\t\tseparation = spiderfyDistanceMultiplier * this._spiralFootSeparation,\n\t\t\tlengthFactor = spiderfyDistanceMultiplier * this._spiralLengthFactor * this._2PI,\n\t\t\tangle = 0,\n\t\t\tres = [],\n\t\t\ti;\n\n\t\tres.length = count;\n\n\t\t// Higher index, closer position to cluster center.\n\t\tfor (i = count - 1; i >= 0; i--) {\n\t\t\tangle += separation / legLength + i * 0.0005;\n\t\t\tres[i] = new L.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))._round();\n\t\t\tlegLength += lengthFactor / angle;\n\t\t}\n\t\treturn res;\n\t},\n\n\t_noanimationUnspiderfy: function () {\n\t\tvar group = this._group,\n\t\t\tmap = group._map,\n\t\t\tfg = group._featureGroup,\n\t\t\tchildMarkers = this.getAllChildMarkers(),\n\t\t\tm, i;\n\n\t\tthis.setOpacity(1);\n\t\tfor (i = childMarkers.length - 1; i >= 0; i--) {\n\t\t\tm = childMarkers[i];\n\n\t\t\tfg.removeLayer(m);\n\n\t\t\tif (m._preSpiderfyLatlng) {\n\t\t\t\tm.setLatLng(m._preSpiderfyLatlng);\n\t\t\t\tdelete m._preSpiderfyLatlng;\n\t\t\t}\n\t\t\tif (m.setZIndexOffset) {\n\t\t\t\tm.setZIndexOffset(0);\n\t\t\t}\n\n\t\t\tif (m._spiderLeg) {\n\t\t\t\tmap.removeLayer(m._spiderLeg);\n\t\t\t\tdelete m._spiderLeg;\n\t\t\t}\n\t\t}\n\t\t\n\t\tgroup.fire('unspiderfied', {\n\t\t\tcluster: this,\n\t\t\tmarkers: childMarkers\n\t\t});\n\t\tgroup._spiderfied = null;\n\t}\n});\n\n//Non Animated versions of everything\nL.MarkerClusterNonAnimated = L.MarkerCluster.extend({\n\t_animationSpiderfy: function (childMarkers, positions) {\n\t\tvar group = this._group,\n\t\t\tmap = group._map,\n\t\t\tfg = group._featureGroup,\n\t\t\tlegOptions = this._group.options.spiderLegPolylineOptions,\n\t\t\ti, m, leg, newPos;\n\n\t\t// Traverse in ascending order to make sure that inner circleMarkers are on top of further legs. Normal markers are re-ordered by newPosition.\n\t\t// The reverse order trick no longer improves performance on modern browsers.\n\t\tfor (i = 0; i < childMarkers.length; i++) {\n\t\t\tnewPos = map.layerPointToLatLng(positions[i]);\n\t\t\tm = childMarkers[i];\n\n\t\t\t// Add the leg before the marker, so that in case the latter is a circleMarker, the leg is behind it.\n\t\t\tleg = new L.Polyline([this._latlng, newPos], legOptions);\n\t\t\tmap.addLayer(leg);\n\t\t\tm._spiderLeg = leg;\n\n\t\t\t// Now add the marker.\n\t\t\tm._preSpiderfyLatlng = m._latlng;\n\t\t\tm.setLatLng(newPos);\n\t\t\tif (m.setZIndexOffset) {\n\t\t\t\tm.setZIndexOffset(1000000); //Make these appear on top of EVERYTHING\n\t\t\t}\n\n\t\t\tfg.addLayer(m);\n\t\t}\n\t\tthis.setOpacity(0.3);\n\t\tgroup.fire('spiderfied', {\n\t\t\tcluster: this,\n\t\t\tmarkers: childMarkers\n\t\t});\n\t},\n\n\t_animationUnspiderfy: function () {\n\t\tthis._noanimationUnspiderfy();\n\t}\n});\n\n//Animated versions here\nL.MarkerCluster.include({\n\n\t_animationSpiderfy: function (childMarkers, positions) {\n\t\tvar me = this,\n\t\t\tgroup = this._group,\n\t\t\tmap = group._map,\n\t\t\tfg = group._featureGroup,\n\t\t\tthisLayerLatLng = this._latlng,\n\t\t\tthisLayerPos = map.latLngToLayerPoint(thisLayerLatLng),\n\t\t\tsvg = L.Path.SVG,\n\t\t\tlegOptions = L.extend({}, this._group.options.spiderLegPolylineOptions), // Copy the options so that we can modify them for animation.\n\t\t\tfinalLegOpacity = legOptions.opacity,\n\t\t\ti, m, leg, legPath, legLength, newPos;\n\n\t\tif (finalLegOpacity === undefined) {\n\t\t\tfinalLegOpacity = L.MarkerClusterGroup.prototype.options.spiderLegPolylineOptions.opacity;\n\t\t}\n\n\t\tif (svg) {\n\t\t\t// If the initial opacity of the spider leg is not 0 then it appears before the animation starts.\n\t\t\tlegOptions.opacity = 0;\n\n\t\t\t// Add the class for CSS transitions.\n\t\t\tlegOptions.className = (legOptions.className || '') + ' leaflet-cluster-spider-leg';\n\t\t} else {\n\t\t\t// Make sure we have a defined opacity.\n\t\t\tlegOptions.opacity = finalLegOpacity;\n\t\t}\n\n\t\t// Add markers and spider legs to map, hidden at our center point.\n\t\t// Traverse in ascending order to make sure that inner circleMarkers are on top of further legs. Normal markers are re-ordered by newPosition.\n\t\t// The reverse order trick no longer improves performance on modern browsers.\n\t\tfor (i = 0; i < childMarkers.length; i++) {\n\t\t\tm = childMarkers[i];\n\n\t\t\tnewPos = map.layerPointToLatLng(positions[i]);\n\n\t\t\t// Add the leg before the marker, so that in case the latter is a circleMarker, the leg is behind it.\n\t\t\tleg = new L.Polyline([thisLayerLatLng, newPos], legOptions);\n\t\t\tmap.addLayer(leg);\n\t\t\tm._spiderLeg = leg;\n\n\t\t\t// Explanations: https://jakearchibald.com/2013/animated-line-drawing-svg/\n\t\t\t// In our case the transition property is declared in the CSS file.\n\t\t\tif (svg) {\n\t\t\t\tlegPath = leg._path;\n\t\t\t\tlegLength = legPath.getTotalLength() + 0.1; // Need a small extra length to avoid remaining dot in Firefox.\n\t\t\t\tlegPath.style.strokeDasharray = legLength; // Just 1 length is enough, it will be duplicated.\n\t\t\t\tlegPath.style.strokeDashoffset = legLength;\n\t\t\t}\n\n\t\t\t// If it is a marker, add it now and we'll animate it out\n\t\t\tif (m.setZIndexOffset) {\n\t\t\t\tm.setZIndexOffset(1000000); // Make normal markers appear on top of EVERYTHING\n\t\t\t}\n\t\t\tif (m.clusterHide) {\n\t\t\t\tm.clusterHide();\n\t\t\t}\n\n\t\t\t// Vectors just get immediately added\n\t\t\tfg.addLayer(m);\n\n\t\t\tif (m._setPos) {\n\t\t\t\tm._setPos(thisLayerPos);\n\t\t\t}\n\t\t}\n\n\t\tgroup._forceLayout();\n\t\tgroup._animationStart();\n\n\t\t// Reveal markers and spider legs.\n\t\tfor (i = childMarkers.length - 1; i >= 0; i--) {\n\t\t\tnewPos = map.layerPointToLatLng(positions[i]);\n\t\t\tm = childMarkers[i];\n\n\t\t\t//Move marker to new position\n\t\t\tm._preSpiderfyLatlng = m._latlng;\n\t\t\tm.setLatLng(newPos);\n\t\t\t\n\t\t\tif (m.clusterShow) {\n\t\t\t\tm.clusterShow();\n\t\t\t}\n\n\t\t\t// Animate leg (animation is actually delegated to CSS transition).\n\t\t\tif (svg) {\n\t\t\t\tleg = m._spiderLeg;\n\t\t\t\tlegPath = leg._path;\n\t\t\t\tlegPath.style.strokeDashoffset = 0;\n\t\t\t\t//legPath.style.strokeOpacity = finalLegOpacity;\n\t\t\t\tleg.setStyle({opacity: finalLegOpacity});\n\t\t\t}\n\t\t}\n\t\tthis.setOpacity(0.3);\n\n\t\tsetTimeout(function () {\n\t\t\tgroup._animationEnd();\n\t\t\tgroup.fire('spiderfied', {\n\t\t\t\tcluster: me,\n\t\t\t\tmarkers: childMarkers\n\t\t\t});\n\t\t}, 200);\n\t},\n\n\t_animationUnspiderfy: function (zoomDetails) {\n\t\tvar me = this,\n\t\t\tgroup = this._group,\n\t\t\tmap = group._map,\n\t\t\tfg = group._featureGroup,\n\t\t\tthisLayerPos = zoomDetails ? map._latLngToNewLayerPoint(this._latlng, zoomDetails.zoom, zoomDetails.center) : map.latLngToLayerPoint(this._latlng),\n\t\t\tchildMarkers = this.getAllChildMarkers(),\n\t\t\tsvg = L.Path.SVG,\n\t\t\tm, i, leg, legPath, legLength, nonAnimatable;\n\n\t\tgroup._animationStart();\n\n\t\t//Make us visible and bring the child markers back in\n\t\tthis.setOpacity(1);\n\t\tfor (i = childMarkers.length - 1; i >= 0; i--) {\n\t\t\tm = childMarkers[i];\n\n\t\t\t//Marker was added to us after we were spiderfied\n\t\t\tif (!m._preSpiderfyLatlng) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//Fix up the location to the real one\n\t\t\tm.setLatLng(m._preSpiderfyLatlng);\n\t\t\tdelete m._preSpiderfyLatlng;\n\n\t\t\t//Hack override the location to be our center\n\t\t\tnonAnimatable = true;\n\t\t\tif (m._setPos) {\n\t\t\t\tm._setPos(thisLayerPos);\n\t\t\t\tnonAnimatable = false;\n\t\t\t}\n\t\t\tif (m.clusterHide) {\n\t\t\t\tm.clusterHide();\n\t\t\t\tnonAnimatable = false;\n\t\t\t}\n\t\t\tif (nonAnimatable) {\n\t\t\t\tfg.removeLayer(m);\n\t\t\t}\n\n\t\t\t// Animate the spider leg back in (animation is actually delegated to CSS transition).\n\t\t\tif (svg) {\n\t\t\t\tleg = m._spiderLeg;\n\t\t\t\tlegPath = leg._path;\n\t\t\t\tlegLength = legPath.getTotalLength() + 0.1;\n\t\t\t\tlegPath.style.strokeDashoffset = legLength;\n\t\t\t\tleg.setStyle({opacity: 0});\n\t\t\t}\n\t\t}\n\n\t\tsetTimeout(function () {\n\t\t\t//If we have only <= one child left then that marker will be shown on the map so don't remove it!\n\t\t\tvar stillThereChildCount = 0;\n\t\t\tfor (i = childMarkers.length - 1; i >= 0; i--) {\n\t\t\t\tm = childMarkers[i];\n\t\t\t\tif (m._spiderLeg) {\n\t\t\t\t\tstillThereChildCount++;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tfor (i = childMarkers.length - 1; i >= 0; i--) {\n\t\t\t\tm = childMarkers[i];\n\n\t\t\t\tif (!m._spiderLeg) { //Has already been unspiderfied\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (m.clusterShow) {\n\t\t\t\t\tm.clusterShow();\n\t\t\t\t}\n\t\t\t\tif (m.setZIndexOffset) {\n\t\t\t\t\tm.setZIndexOffset(0);\n\t\t\t\t}\n\n\t\t\t\tif (stillThereChildCount > 1) {\n\t\t\t\t\tfg.removeLayer(m);\n\t\t\t\t}\n\n\t\t\t\tmap.removeLayer(m._spiderLeg);\n\t\t\t\tdelete m._spiderLeg;\n\t\t\t}\n\t\t\tgroup._animationEnd();\n\t\t\tgroup.fire('unspiderfied', {\n\t\t\t\tcluster: me,\n\t\t\t\tmarkers: childMarkers\n\t\t\t});\n\t\t}, 200);\n\t}\n});\n\n\nL.MarkerClusterGroup.include({\n\t//The MarkerCluster currently spiderfied (if any)\n\t_spiderfied: null,\n\n\t_spiderfierOnAdd: function () {\n\t\tthis._map.on('click', this._unspiderfyWrapper, this);\n\n\t\tif (this._map.options.zoomAnimation) {\n\t\t\tthis._map.on('zoomstart', this._unspiderfyZoomStart, this);\n\t\t}\n\t\t//Browsers without zoomAnimation or a big zoom don't fire zoomstart\n\t\tthis._map.on('zoomend', this._noanimationUnspiderfy, this);\n\t},\n\n\t_spiderfierOnRemove: function () {\n\t\tthis._map.off('click', this._unspiderfyWrapper, this);\n\t\tthis._map.off('zoomstart', this._unspiderfyZoomStart, this);\n\t\tthis._map.off('zoomanim', this._unspiderfyZoomAnim, this);\n\t\tthis._map.off('zoomend', this._noanimationUnspiderfy, this);\n\n\t\t//Ensure that markers are back where they should be\n\t\t// Use no animation to avoid a sticky leaflet-cluster-anim class on mapPane\n\t\tthis._noanimationUnspiderfy();\n\t},\n\n\t//On zoom start we add a zoomanim handler so that we are guaranteed to be last (after markers are animated)\n\t//This means we can define the animation they do rather than Markers doing an animation to their actual location\n\t_unspiderfyZoomStart: function () {\n\t\tif (!this._map) { //May have been removed from the map by a zoomEnd handler\n\t\t\treturn;\n\t\t}\n\n\t\tthis._map.on('zoomanim', this._unspiderfyZoomAnim, this);\n\t},\n\n\t_unspiderfyZoomAnim: function (zoomDetails) {\n\t\t//Wait until the first zoomanim after the user has finished touch-zooming before running the animation\n\t\tif (L.DomUtil.hasClass(this._map._mapPane, 'leaflet-touching')) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._map.off('zoomanim', this._unspiderfyZoomAnim, this);\n\t\tthis._unspiderfy(zoomDetails);\n\t},\n\n\t_unspiderfyWrapper: function () {\n\t\t/// _unspiderfy but passes no arguments\n\t\tthis._unspiderfy();\n\t},\n\n\t_unspiderfy: function (zoomDetails) {\n\t\tif (this._spiderfied) {\n\t\t\tthis._spiderfied.unspiderfy(zoomDetails);\n\t\t}\n\t},\n\n\t_noanimationUnspiderfy: function () {\n\t\tif (this._spiderfied) {\n\t\t\tthis._spiderfied._noanimationUnspiderfy();\n\t\t}\n\t},\n\n\t//If the given layer is currently being spiderfied then we unspiderfy it so it isn't on the map anymore etc\n\t_unspiderfyLayer: function (layer) {\n\t\tif (layer._spiderLeg) {\n\t\t\tthis._featureGroup.removeLayer(layer);\n\n\t\t\tif (layer.clusterShow) {\n\t\t\t\tlayer.clusterShow();\n\t\t\t}\n\t\t\t//Position will be fixed up immediately in _animationUnspiderfy\n\t\t\tif (layer.setZIndexOffset) {\n\t\t\t\tlayer.setZIndexOffset(0);\n\t\t\t}\n\n\t\t\tthis._map.removeLayer(layer._spiderLeg);\n\t\t\tdelete layer._spiderLeg;\n\t\t}\n\t}\n});\n\n\n/**\n * Adds 1 public method to MCG and 1 to L.Marker to facilitate changing\n * markers' icon options and refreshing their icon and their parent clusters\n * accordingly (case where their iconCreateFunction uses data of childMarkers\n * to make up the cluster icon).\n */\n\n\nL.MarkerClusterGroup.include({\n\t/**\n\t * Updates the icon of all clusters which are parents of the given marker(s).\n\t * In singleMarkerMode, also updates the given marker(s) icon.\n\t * @param layers L.MarkerClusterGroup|L.LayerGroup|Array(L.Marker)|Map(L.Marker)|\n\t * L.MarkerCluster|L.Marker (optional) list of markers (or single marker) whose parent\n\t * clusters need to be updated. If not provided, retrieves all child markers of this.\n\t * @returns {L.MarkerClusterGroup}\n\t */\n\trefreshClusters: function (layers) {\n\t\tif (!layers) {\n\t\t\tlayers = this._topClusterLevel.getAllChildMarkers();\n\t\t} else if (layers instanceof L.MarkerClusterGroup) {\n\t\t\tlayers = layers._topClusterLevel.getAllChildMarkers();\n\t\t} else if (layers instanceof L.LayerGroup) {\n\t\t\tlayers = layers._layers;\n\t\t} else if (layers instanceof L.MarkerCluster) {\n\t\t\tlayers = layers.getAllChildMarkers();\n\t\t} else if (layers instanceof L.Marker) {\n\t\t\tlayers = [layers];\n\t\t} // else: must be an Array(L.Marker)|Map(L.Marker)\n\t\tthis._flagParentsIconsNeedUpdate(layers);\n\t\tthis._refreshClustersIcons();\n\n\t\t// In case of singleMarkerMode, also re-draw the markers.\n\t\tif (this.options.singleMarkerMode) {\n\t\t\tthis._refreshSingleMarkerModeMarkers(layers);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t/**\n\t * Simply flags all parent clusters of the given markers as having a \"dirty\" icon.\n\t * @param layers Array(L.Marker)|Map(L.Marker) list of markers.\n\t * @private\n\t */\n\t_flagParentsIconsNeedUpdate: function (layers) {\n\t\tvar id, parent;\n\n\t\t// Assumes layers is an Array or an Object whose prototype is non-enumerable.\n\t\tfor (id in layers) {\n\t\t\t// Flag parent clusters' icon as \"dirty\", all the way up.\n\t\t\t// Dumb process that flags multiple times upper parents, but still\n\t\t\t// much more efficient than trying to be smart and make short lists,\n\t\t\t// at least in the case of a hierarchy following a power law:\n\t\t\t// http://jsperf.com/flag-nodes-in-power-hierarchy/2\n\t\t\tparent = layers[id].__parent;\n\t\t\twhile (parent) {\n\t\t\t\tparent._iconNeedsUpdate = true;\n\t\t\t\tparent = parent.__parent;\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Refreshes the icon of all \"dirty\" visible clusters.\n\t * Non-visible \"dirty\" clusters will be updated when they are added to the map.\n\t * @private\n\t */\n\t_refreshClustersIcons: function () {\n\t\tthis._featureGroup.eachLayer(function (c) {\n\t\t\tif (c instanceof L.MarkerCluster && c._iconNeedsUpdate) {\n\t\t\t\tc._updateIcon();\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Re-draws the icon of the supplied markers.\n\t * To be used in singleMarkerMode only.\n\t * @param layers Array(L.Marker)|Map(L.Marker) list of markers.\n\t * @private\n\t */\n\t_refreshSingleMarkerModeMarkers: function (layers) {\n\t\tvar id, layer;\n\n\t\tfor (id in layers) {\n\t\t\tlayer = layers[id];\n\n\t\t\t// Make sure we do not override markers that do not belong to THIS group.\n\t\t\tif (this.hasLayer(layer)) {\n\t\t\t\t// Need to re-create the icon first, then re-draw the marker.\n\t\t\t\tlayer.setIcon(this._overrideMarkerIcon(layer));\n\t\t\t}\n\t\t}\n\t}\n});\n\nL.Marker.include({\n\t/**\n\t * Updates the given options in the marker's icon and refreshes the marker.\n\t * @param options map object of icon options.\n\t * @param directlyRefreshClusters boolean (optional) true to trigger\n\t * MCG.refreshClustersOf() right away with this single marker.\n\t * @returns {L.Marker}\n\t */\n\trefreshIconOptions: function (options, directlyRefreshClusters) {\n\t\tvar icon = this.options.icon;\n\n\t\tL.setOptions(icon, options);\n\n\t\tthis.setIcon(icon);\n\n\t\t// Shortcut to refresh the associated MCG clusters right away.\n\t\t// To be used when refreshing a single marker.\n\t\t// Otherwise, better use MCG.refreshClusters() once at the end with\n\t\t// the list of modified markers.\n\t\tif (directlyRefreshClusters && this.__parent) {\n\t\t\tthis.__parent._group.refreshClusters(this);\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n\n}(window, document));\n\n }).apply(root, arguments);\n});\n}(this));\n\n","/**\n * The MarkersView allows to display search services results on a map. It is based on Lefleat's\n * [marker cluster plugin](https://github.com/Leaflet/Leaflet.markercluster). The default plugin functionality is\n * enhanced with handling TomTom services response or searchBox widget events.\n *\n * The tomtom.markersView() method creates a new instance of MarkersView.\n *\n * @example\n * ```javascript\n *\n * tomtom.key(\"\");\n * var map = tomtom.map(\"map\");\n * var searchBoxInstance = tomtom.searchBox().addTo(map);\n * var markersLayer = tomtom.markersView().addTo(map);\n *\n * searchBoxInstance.on(searchBoxInstance.Event.ResultsFound, function (results) {\n * markersLayer.clearLayers();\n * markersLayer.add(results);\n * });\n * ```\n *\n * @class markersView\n * @extends L.MarkerClusterGroup\n */\ndefine('widgets/views/markers',['display/map', 'markercluster'], function (L) {\n \"use strict\";\n\n function isArray(array) {\n return array && array.constructor.toString().indexOf(\"Array\") > -1;\n }\n\n function hasDataArray(points) {\n return typeof points === 'object' && isArray(points.data);\n }\n\n function convertPoints(points) {\n if (hasDataArray(points)) {\n return points.data;\n }\n if (isArray(points)) {\n return points;\n }\n return [points];\n }\n\n function getFreeFormAddress(object) {\n return object.address ? object.address.freeformAddress : null;\n }\n\n function getTextContent(object) {\n return object.element ? object.element.textContent : null;\n }\n\n function oneOf(first, second, third) {\n return first || second || third;\n }\n\n function getPoiName(object) {\n if (object.poi && object.poi.name) {\n return object.poi.name + \" \";\n }\n return \"\";\n }\n\n function getText(object) {\n var freeformAddress = getFreeFormAddress(object),\n textContent = getTextContent(object),\n text = oneOf(object.text, freeformAddress, textContent),\n poiName = getPoiName(object);\n return poiName + text;\n }\n\n function hadDataPosition(object) {\n return object.data && object.data.position;\n }\n\n function getObjectType(object) {\n return object.data ? object.data.type : object.type || 'unknown';\n }\n\n function getPoiCategories(object) {\n return object.poi ? object.poi.categories : null;\n }\n\n function getPointGeometry(object) {\n var result = {};\n if (isArray(object.point)) {\n result.position = {lat: object.point[0], lng: object.point[1]};\n } else if (object.position) {\n result.position = {lat: object.position.lat, lng: object.position.lon};\n } else if (hadDataPosition(object)) {\n result.position = {lat: object.data.position.lat, lng: object.data.position.lon};\n }\n result.type = getObjectType(object.data || object);\n var categories = getPoiCategories(object.data || object);\n if (categories) {\n result.poiCategories = categories;\n }\n return result;\n }\n\n function convertPoint(object) {\n if (!object) {\n return {};\n }\n var result = getPointGeometry(object),\n text = getText(object);\n\n if (text) {\n result.text = text;\n }\n return result;\n }\n\n function isEachIconAFunction(options) {\n return options && options.eachIcon && typeof options.eachIcon === 'function';\n }\n\n function createMarker(object, options) {\n var point = convertPoint(object);\n if (!point || !point.position) {\n return null;\n }\n if (isEachIconAFunction(options)) {\n options.icon = options.eachIcon(point);\n }\n var marker = L.marker(point.position, options);\n if (point.text) {\n marker.bindPopup(point.text);\n }\n return marker;\n }\n\n var MarkersLayer = L.MarkerClusterGroup.extend({\n /**\n * Method used to clear all the markers. It is equivalent of clearLayers method.\n *\n * @method remove\n *\n * @return {markersView} The control instance.\n */\n remove: function () {\n this.clearLayers();\n return this;\n },\n /**\n * Method used to add new markers based on the TomTom search service response.\n * [Further reference](http://leafletjs.com/reference.html#marker-options).\n *\n * @method add\n * @param {Object} points The response from search service or event from searchBox widget.\n * @param {Object} [options] The options to be used when creating a marker.\n * @param {Function} [options.eachIcon] The function called to create each icon. It has one argument which is\n * the point - object containing text, position, type and poiCategories if type is _poi_.\n * @return {markersView} The control instance.\n */\n add: function (points, options) {\n var data = convertPoints(points),\n i;\n for (i = 0; i < data.length; i += 1) {\n var marker = createMarker(data[i], options);\n if (marker) {\n this.addLayer(marker);\n }\n }\n return this;\n }\n });\n\n /**\n * The method to instantiates the markersView control.\n * The options are described [here](https://github.com/Leaflet/Leaflet.markercluster/tree/leaflet-0.7#all-options).\n * @method markersView\n * @param {Object} [options] Options to be passed to the markers view control.\n *\n * @example\n * ```javascript\n *\n * // SearchBox with location button\n * var options = {\n * location: true\n * };\n * var searchBoxInstance = searchBox(options).addTo(map);\n * ```\n */\n return function (options) {\n return new MarkersLayer(options);\n };\n})\n;\n","/**\n * The RouteOnMap view allows to display a route on map.\n *\n * The tomtom.routeOnMap() method creates a new instance of RouteOnMap view.\n *\n * @class routeOnMap\n */\ndefine('widgets/views/routeOnMap',[\"display/map\", \"services/routing\", \"services/reverseGeocode/reverseGeocode\", \"services/converters\", \"services/utils\"],\n function (L, routingService, reverseGeocodeService, converters, utils) {\n \"use strict\";\n\n var EVENTS = {\n MarkerDragEnd: \"markerDragEnd\",\n Draw: \"draw\",\n RouteChanged: \"routeChanged\"\n };\n\n function createMarkerIcon(type) {\n var generalMarkerIcon = {\n background: {\n iconSize: L.Browser.retina ? [34, 34] : [20, 20],\n iconAnchor: L.Browser.retina ? [17, 17] : [10, 10],\n icon: 'icon-shield'\n },\n icon: {\n iconSize: L.Browser.retina ? [30, 30] : [18, 18],\n iconAnchor: L.Browser.retina ? [-2, -2] : [-1, -1],\n icon: \"icon-flag-white\"\n }\n };\n if (type === \"start\") {\n generalMarkerIcon.icon.icon = \"icon-start-white\";\n } else if (type === \"end\") {\n generalMarkerIcon.icon.icon = \"icon-end-white\";\n }\n return generalMarkerIcon;\n }\n\n function getRouteStyle(style) {\n var styleIndex = 0;\n return function () {\n styleIndex += 1;\n return style[styleIndex % style.length] || style;\n };\n }\n\n function convertPoints(points) {\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n points[i] = point ? L.latLng(converters.point(point).split(\",\")) : undefined;\n }\n return points;\n }\n\n function getIconOptions(points, index, options) {\n var iconOptions = utils.clone(options.generalMarker);\n if (index === 0) {\n utils.addFields(options.startMarker, iconOptions);\n iconOptions.icon = options.startMarker.icon;\n } else if (index === points.length - 1) {\n utils.addFields(options.endMarker, iconOptions);\n iconOptions.icon = options.endMarker.icon;\n } else {\n utils.addFields(options.waypointMarker, iconOptions);\n iconOptions.icon = options.waypointMarker.icon;\n }\n if (options.generalMarker.zIndexOffset) {\n iconOptions.zIndexOffset = options.generalMarker.zIndexOffset;\n }\n return iconOptions;\n }\n\n function onDragListener(points, e, markers, callback) {\n var index = markers.indexOf(e.target);\n points[index] = e.target.getLatLng();\n callback.call(this, points, index);\n }\n\n function getAllFilledLocations(points) {\n var filledLocations = [];\n for (var i = 0; i < points.length; i++) {\n if (points[i] !== undefined) {\n filledLocations.push(points[i]);\n }\n }\n return filledLocations;\n }\n\n var RouteOnMap = L.LayerGroup.extend({\n\n includes: L.Mixin.Events,\n\n options: {\n generalMarker: {icon: L.svgIcon(createMarkerIcon()), draggable: false},\n startMarker: {icon: L.svgIcon(createMarkerIcon(\"start\")), draggable: false},\n waypointMarker: {icon: L.svgIcon(createMarkerIcon(\"waypoint\")), draggable: false},\n endMarker: {icon: L.svgIcon(createMarkerIcon(\"end\")), draggable: false},\n position: 'topleft',\n routeStyle: {color: \"#00d7ff\", opacity: 0.8},\n alternativeStyles: [\n {color: \"#ff00d2\", opacity: 0.8},\n {color: \"#b922ff\", opacity: 0.8}\n ],\n routingDelay: 1000,\n serviceOptions: {}\n },\n\n initialize: function (options) {\n L.Util.setOptions(this, options);\n },\n\n /**\n * Method used to create markers on a map, basing on given points.\n *\n * @method createMarkers\n * @param {Array} points List of points to create markers onto.\n */\n createMarkers: function (points) {\n var that = this,\n markers = [];\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n if (point !== undefined) {\n var iconOptions = getIconOptions(points, i, this.options);\n var marker = L.marker(point, iconOptions);\n markers.push(marker);\n\n if (iconOptions.draggable) {\n marker.on(\"dragend\", function (event) {\n onDragListener.call(that, points, event, markers, that.onDragEnd);\n });\n marker.on(\"drag\", function (event) {\n onDragListener.call(that, points, event, markers, that.onDrag);\n });\n }\n }\n }\n delete this.markers;\n if (markers.length > 0) {\n this.markers = new L.featureGroup(markers);\n this.markers.addTo(this._map);\n }\n },\n\n /**\n * Method used to create a route on a map between given points.\n * This method executes TomTom Routing Service to get a route.\n * If route is found, this method draws it on a map. If not - shows proper notification.\n *\n * @method createRoute\n * @param {Array} points List of points to create a route between.\n */\n createRoute: function (points) {\n var that = this;\n this.options.serviceOptions.locations = points;\n routingService(this.options.serviceOptions).go().then(function (routeGeoJson) {\n if (routeGeoJson.features.length > 0) {\n that.drawRouteWithGeoJson(routeGeoJson);\n } else {\n that.clearRoute();\n L.messageBox({closeAfter: 1500}).openOn(that._map)\n .setContent(\"Could not find a route.
You might trying to route between continents.\");\n }\n });\n },\n\n /**\n * Method fired when user drags a marker. Allows to look for routes while dragging a marker and within delay\n * equal to the value passed in options [options.routingDelay].\n *\n * @method onDrag\n * @param {Number} points List of points to create a route within.\n * @param {Number} index Index of the marker that is currently dragging.\n */\n onDrag: function (points, index) {\n var that = this;\n if (this.recalculateRoute === true) {\n setTimeout(function () {\n that.clearRoute();\n that.createRoute(points);\n that.recalculateRoute = true;\n }, this.options.routingDelay);\n this.recalculateRoute = false;\n }\n },\n\n /**\n * Method fired when user drops a marker (equal to dragEnd event). Redraws route according to given points\n * and executes TomTom Reverse Geocode Service to get human-readable location when marker was dropped. That\n * fires Event.MarkerDragEnd event with service's call result and index\n * of a marker.\n *\n * @method onDragEnd\n * @param {Array} points List of points.\n * @param {Number} index Index of the marker that was dropped.\n */\n onDragEnd: function (points, index) {\n this.clearRoute();\n this.createRoute(points);\n this.once(EVENTS.RouteChanged, this.fitMapBoundsToRoute, this);\n var that = this;\n reverseGeocodeService().position(points[index]).go().then(function (result) {\n that.fire(EVENTS.MarkerDragEnd, {object: result, markerIndex: index});\n });\n },\n\n /**\n * Method that removes all markers.\n *\n * @method clearMarkers\n */\n clearMarkers: function () {\n if (this.markers) {\n this.markers.clearLayers();\n }\n this.markers = undefined;\n },\n\n /**\n * Method that clears shown route.\n *\n * @method clearMarkers\n */\n clearRoute: function () {\n if (this.routeOnMapLayer) {\n this._map.removeLayer(this.routeOnMapLayer);\n }\n this.routeOnMapLayer = undefined;\n },\n\n /**\n * Method that fits map to the drawn route.\n *\n * @method fitMapBoundsToRoute\n */\n fitMapBoundsToRoute: function () {\n var areaToBoundTo = this.routeOnMapLayer || this.markers;\n if (areaToBoundTo) {\n this._map.fitBounds(areaToBoundTo.getBounds(), {padding: [5, 5]});\n }\n },\n\n /**\n * Method that draws a route basing on a passed geoJson. Fires\n * Event.RouteChanged event.\n *\n * @method drawRouteWithGeoJson\n * @param {Object} geoJson Represents geoJson data of a route.\n */\n drawRouteWithGeoJson: function (geoJson) {\n this.clearRoute();\n this.routeOnMapLayer = L.geoJson(geoJson, {\n onEachFeature: this.options.onEachFeature,\n style: getRouteStyle(this.options.serviceOptions.maxAlternatives > 0 ?\n this.options.alternativeStyles.concat([this.options.routeStyle]) : this.options.routeStyle)\n });\n this._map.addLayer(this.routeOnMapLayer);\n this.fire(EVENTS.RouteChanged, {\n object: geoJson.features[0].properties.summary,\n instructions: geoJson.features[0].properties.guidance\n });\n },\n\n /**\n * Method that takes care of redrawing markers and a route.\n *\n * @method drawRoute\n * @param {Array} points List of points to draw a route between.\n */\n drawRoute: function (points) {\n this.clear();\n this.recalculateRoute = true;\n this.createMarkers(points);\n\n if (points.length >= 2) {\n this.createRoute(points);\n }\n },\n\n /**\n * The method to draw a route between two or more points.\n *\n * @method draw\n * @param {Array} points Array of geographical locations that between route will be drawn. There are\n * multiple formats supported (see more at e.g. _Search_ page in _center_ method). This method also\n * fires Event.Draw event that announces that route is drawn.\n * @example\n * ```javascript\n *\n * var startPoint = {lat: 49.29917, lon: 19.94902};\n * var waypoint = {lat: 42.25917, lon: 19.98902};\n * var endPoint = {lat: 52.23498, lon: 21.00849};\n * var points = [startPoint, waypoint, endPoint];\n * var routeOnMapView = routeOnMap().addTo(map);\n * routeOnMapView.draw(points);\n *\n * ```\n */\n draw: function (points) {\n points = convertPoints(points);\n points = getAllFilledLocations(points);\n this.drawRoute(points);\n this.fitMapBoundsToRoute();\n this.once(EVENTS.RouteChanged, this.fitMapBoundsToRoute, this);\n this.fire(EVENTS.Draw, {});\n },\n\n /**\n * The method to clear a route and markers.\n *\n * @method clear\n *\n * @example\n * ```javascript\n *\n * var routeOnMapView = routeOnMap(optionsForRouteOnMapView).addTo(map);\n * routeOnMapView.clear();\n * ```\n */\n clear: function () {\n this.clearMarkers();\n this.clearRoute();\n },\n\n /**\n * Event that is fired after dropping the marker. Contains information about marker's position.\n *\n * @event MarkerDragEnd\n * @param {Object} object Information of dropped marker's position (got from reverse geocode service).\n * @param {Number} markerIndex Index of the marker on a map.\n * @param {String} type Event's name, equal to \"markerDragEnd\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeOnMapView = routeOnMap().addTo(map);\n * routeOnMapView.on(routeOnMapView.Event.MarkerDragEnd, function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n /**\n * Event that is fired after drawing a route on a map.\n *\n * @event Draw\n * @param {String} type Event's name, equal to \"draw\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeOnMapView = routeOnMap().addTo(map);\n * routeOnMapView.on(routeOnMapView.Event.Draw, function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n /**\n * Event that is fired when route was changed.\n *\n * @event RouteChanged\n * @param {Object} object Route summary that contains arrival time, departure time, route length, traffic\n * and travel time.\n * @param {String} type Event's name, equal to \"routeChanged\".\n * @param {Element} target Event's target.\n *\n * @example\n * ```javascript\n *\n * var routeOnMapView = routeOnMap().addTo(map);\n * routeOnMapView.on(routeOnMapView.Event.RouteChanged, function (eventObject) {\n * console.log(eventObject);\n * });\n * ```\n */\n Event: EVENTS\n });\n\n /**\n * The method to instantiates the view. The options can be passed on creation.\n *\n * @method routeOnMap\n * @param {Object} [options] Options to be passed to the routing view.\n * @param {Object} [options.markerGeneral] General marker options that applies on all markers.\n * @param {Object} [options.markerGeneral.icon] Default icon for every marker. Icon should extend L.icon.\n * @param {Boolean} [options.markerGeneral.draggable=false] Determines default drag behaviour for every marker.\n * @param {Object} [options.startMarker] Marker options for starting marker.\n * @param {Object} [options.startMarker.icon] Icon for start marker. This field should extend L.icon.\n * @param {Boolean} [options.startMarker.draggable] Determines whether start marker should be draggable.\n * @param {Object} [options.waypointMarker] Marker options for markers between start and end points.\n * @param {Object} [options.waypointMarker.icon] Icon for markers between start and end points. This field\n * should extend L.icon.\n * @param {Boolean} [options.waypointMarker.draggable] Determines whether start marker should be draggable.\n * @param {Object} [options.endMarker] Marker options for end marker.\n * @param {Object} [options.endMarker.icon] Icon for end marker. This field should extend L.icon.\n * @param {Boolean} [options.endMarker.draggable] Determines whether end marker should be draggable.\n * @param {Object} [options.routeStyle] A style object for the polyline to be used.\n * @param {Array} [options.alternativeStyles] If option to display alternatives is passed to the service\n * options then there is a need to pass array of style's options for each alternative route.\n * @param {Integer} [options.routingDelay] Determines the time that within routing service will be called. Used\n * when user is dragging a marker.\n * @param {Function} [options.onEachFeature] A function that will be called for each feature, it takes feature\n * and layer as the attributes. Can be used in example to bind popup to the route.\n * @param {Object} [options.serviceOptions] Options to be passed to the routing service. For details check\n * routingService documentation.\n *\n * @example\n * ```javascript\n *\n * var optionsForRouteOnMapView = {\n * generalMarker: {\n * draggable: true\n * },\n * startMarker: {\n * background: {\n * iconSize: L.Browser.retina ? [50, 50] : [30, 36],\n * iconAnchor: L.Browser.retina ? [25, 50] : [15, 36],\n * icon: 'marker'\n * },\n * icon: {\n * iconSize: L.Browser.retina ? [50, 50] : [30, 30],\n * iconAnchor: [0, 0],\n * icon: 'flag-white'\n * },\n * },\n * waypointMarker: {\n * L.icon({\n * iconUrl: 'waypoint.png',\n * iconSize: L.Browser.retina ? [50, 50] : [30, 30],\n * iconAnchor: L.Browser.retina ? [25, 25] : [15, 15]\n * })\n * },\n * endMarker: {\n * L.icon({\n * iconUrl: 'end.png',\n * iconSize: L.Browser.retina ? [50, 50] : [30, 30],\n * iconAnchor: L.Browser.retina ? [25, 25] : [15, 15]\n * })\n * },\n * routeStyle: {color: \"#00d7ff\", opacity: 0.8}\n * };\n *\n * var routeOnMapView = routeOnMap(optionsForRouteOnMapView).addTo(map);\n * ```\n */\n return function (options) {\n return new RouteOnMap(options);\n };\n });\n","/**\n * The RouteSummary view allow to display a additional route information.\n *\n * The tomtom.routeSummary() method creates a new instance of RouteSummary view.\n *\n * @class routeSummary\n */\ndefine('widgets/views/routeSummary',[\"display/map\", \"unitFormatConverter/unitFormatConverter\"], function (L, unitFormatConverter) {\n \"use strict\";\n\n function initPanelDeparture(className, parent) {\n }\n\n function initPanelResult(className, control) {\n control.divPanelRouteResult = L.DomUtil.create(\"div\", className + \"-route-result\", control._container);\n control.divPanelRouteDeparture = L.DomUtil.create(\"div\", className + \"-leave\", control.divPanelRouteResult);\n control.divPanelRouteDeparture.innerHTML = \"Leave: now\";\n var divPanelRouteResultWrapper = L.DomUtil.create(\"div\", className + \"-route-result-wrapper\", control.divPanelRouteResult);\n control.divPanelRouteCostModel = L.DomUtil.create(\"div\", className + \"-route-cost-model\", divPanelRouteResultWrapper);\n control.divPanelRouteTime = L.DomUtil.create(\"div\", className + \"-route-time\", divPanelRouteResultWrapper);\n control.divPanelRouteTrafficDelay = L.DomUtil.create(\"div\", className + \"-route-traffic-delay\", divPanelRouteResultWrapper);\n }\n\n function createPanelArriveDistance(className, control, parent) {\n var divPanelRouteArriveDistance = L.DomUtil.create(\"div\", className + \"-route-arrive-row\", parent);\n var divPanelRouteArriveDistanceLabel = L.DomUtil.create(\"div\", className + \"-route-arrive-cell-left\", divPanelRouteArriveDistance);\n divPanelRouteArriveDistanceLabel.innerHTML = \"Distance:\";\n control.divPanelRouteArriveDistanceValue = L.DomUtil.create(\"div\", className + \"-route-arrive-cell-right\", divPanelRouteArriveDistance);\n }\n\n function createPanelArriveTime(className, control, parent) {\n var divPanelRouteArriveTime = L.DomUtil.create(\"div\", className + \"-route-arrive-row\", parent);\n var divPanelRouteArriveTimeLabel = L.DomUtil.create(\"div\", className + \"-route-arrive-cell-left\", divPanelRouteArriveTime);\n divPanelRouteArriveTimeLabel.innerHTML = \"Arrive:\";\n control.divPanelRouteArriveTimeValue = L.DomUtil.create(\"div\", className + \"-route-arrive-cell-right\", divPanelRouteArriveTime);\n }\n\n function initPanelArrive(className, control) {\n var divPanelRouteArrive = L.DomUtil.create(\"div\", className + \"-arrive\", control._container);\n createPanelArriveDistance(className, control, divPanelRouteArrive);\n createPanelArriveTime(className, control, divPanelRouteArrive);\n }\n\n function createDOMElements(control) {\n var className = \"leaflet-control-route-summary\",\n container = L.DomUtil.create(\"div\", className + \" leaflet-control\");\n container.style.width = control.options.size[0] + \"px\";\n container.style.height = control.options.size[1] + \"px\";\n var divHeading = L.DomUtil.create(\"div\", className + \"-heading\", container);\n divHeading.innerHTML = \"Route summary\";\n L.DomEvent.disableClickPropagation(container);\n L.DomEvent.disableScrollPropagation(container);\n control._container = container;\n initPanelDeparture(className, container);\n initPanelResult(className, control);\n initPanelArrive(className, control);\n container.style.visibility = \"hidden\";\n\n return container;\n }\n\n\n /**\n * The method to instantiates the view. The options can be passed on creation.\n *\n * @method routeSummary\n * @param {Object} [options] Options to setup control.\n * @param {String} [options.size] Size of panel.\n * @param {String} [options.position] Where to add view.\n * @param {Boolean} [options.imperialDistance] Should the distance be displayed in imperial units.\n *\n * @example\n * ```javascript\n *\n * var options = {\n * size: [270, 268],\n * position: \"topleft\"\n * };\n * var routeSummaryInstance = routeSummary(options).addTo(map);\n *\n * ```\n */\n return function (options) {\n\n var RouteSummary = L.Control.extend({\n\n options: {\n size: [320, 320],\n position: \"topleft\",\n imperialDistance: false\n },\n\n /**\n * Leaflet init method executed when adding control to map.\n * Options will be stored inside control.\n *\n * @method initialize\n * @param {Object} [options] Options to setup control.\n *\n */\n initialize: function (options) {\n L.setOptions(this, options);\n this._attributions = {};\n },\n\n /**\n * Leaflet method executed when adding control to map.\n * Map will be stored inside control.\n *\n * @method onAdd\n * @param {Object} [map] The map instance to which control is added.\n *\n */\n onAdd: function (map) {\n this._map = map;\n return createDOMElements(this);\n },\n\n /**\n * Method to hide route summary.\n * By default summary will be hidden.\n *\n * @method hide\n *\n */\n hide: function () {\n this._container.style.visibility = \"hidden\";\n },\n\n /**\n * Method to show route summary.\n * By default summary will be hidden.\n * Use this method to show control after data is ready.\n *\n * @method show\n *\n */\n show: function () {\n this._container.style.visibility = \"\";\n },\n\n /**\n * Method to update data after route is recalculated.\n * Use this method to update data after each route calculation.\n *\n * @method updateSummaryData\n * @param {Object} data The routing properties object containing fields: _travelTimeInSeconds,\n * trafficDelayInSeconds, lengthInMeters, arrivalTime_.\n * @param {Boolean} [imperial] Display distance in imperial units.\n *\n */\n updateSummaryData: function (data, imperial) {\n this.divPanelRouteTime.innerHTML = unitFormatConverter.formatTime(data.travelTimeInSeconds);\n this.divPanelRouteTrafficDelay.innerHTML = unitFormatConverter.formatTime(data.trafficDelayInSeconds) + \" traffic\";\n this.divPanelRouteArriveDistanceValue.innerHTML = unitFormatConverter.formatDistance(data.lengthInMeters, imperial || this.options.imperialDistance);\n this.divPanelRouteArriveTimeValue.innerHTML = unitFormatConverter.formatHourAndMinute(data.arrivalTime);\n this.show();\n }\n\n });\n\n return new RouteSummary(options);\n };\n});\n","/**\n * The main namespace of the TomTom Maps JavaScript SDK. This is a place where you get access to all the services,\n * Leaflet main object (L) and configuration.\n *\n * @class tomtom\n */\ndefine('main',['require','polyfills','requester/requester','display/map','services/trafficIncidents','services/copyright','services/copyrightCaption','services/geocode','services/structuredGeocode','services/reverseGeocode/reverseGeocode','services/reverseGeocode/crossStreetLookup','services/search/fuzzySearch','services/search/poiSearch','services/search/categorySearch','services/search/geometrySearch','services/search/nearbySearch','services/search/lowBandwidthSearch','services/routing','widgets/controls/searchBox','widgets/controls/location','widgets/controls/routeInputs','widgets/controls/routeInstructions','unitFormatConverter/unitFormatConverter','widgets/views/markers','widgets/views/routeOnMap','widgets/views/routeSummary','security'],function (require) {\n \"use strict\";\n require(\"polyfills\");\n\n var tomtom = {};\n\n var requester = require(\"requester/requester\");\n /**\n * Makes the SDK to use JSONP calls instead of JSON.\n *\n * @example\n * ```javascript\n *\n * tomtom.useJsonp(true); // all requests will be JSONP now\n * ```\n *\n * @method useJsonp\n * @param {Boolean} [useJsonp] Should the SDK use JSONP calls instead of default JSON.\n */\n tomtom.useJsonp = requester.useJsonp;\n /**\n * Makes the SDK to use HTTP calls instead of HTTPS. This can be modified on per service call basis with the\n * _protocol_ functions.\n *\n * @example\n * ```javascript\n *\n * tomtom.useHttp(true); // all requests will be HTTP now\n * ````\n *\n * @method useHttp\n * @param {Boolean} [useHttp] Should the SDK use HTTP calls instead of default HTTPS.\n */\n tomtom.useHttp = requester.useHttp;\n\n var L = require(\"display/map\");\n /**\n * The Leaflet object...\n *\n * @property L\n * @type {Object}\n */\n tomtom.L = L;\n /**\n * The Leaflet object...\n *\n * @property display\n * @type {Object}\n */\n tomtom.display = L;\n\n //just to be backward compatible (we build car with thill)\n tomtom.Map = L.Map;\n /**\n * The Leaflet map constructor...\n *\n * @method map\n */\n tomtom.map = L.map;\n\n /**\n * The traffic incidents service...\n *\n * @method traffic\n */\n tomtom.traffic = require(\"services/trafficIncidents\");\n\n /**\n * The copyright service...\n *\n * @method copyright\n */\n tomtom.copyright = require(\"services/copyright\");\n\n /**\n * The copyright caption service...\n *\n * @method copyrightCaption\n */\n tomtom.copyrightCaption = require(\"services/copyrightCaption\");\n\n /**\n * The geocode service...\n *\n * @method geocode\n */\n tomtom.geocode = require(\"services/geocode\");\n\n /**\n * The structured geocode service...\n *\n * @method structuredGeocode\n */\n tomtom.structuredGeocode = require(\"services/structuredGeocode\");\n\n /**\n * The reverse geocode service...\n *\n * @method reverseGeocode\n */\n tomtom.reverseGeocode = require(\"services/reverseGeocode/reverseGeocode\");\n /**\n * The cross street lookup service...\n *\n * @method crossStreetLookup\n */\n tomtom.crossStreetLookup = require(\"services/reverseGeocode/crossStreetLookup\");\n\n /**\n * The fuzzy search service...\n *\n * @method fuzzySearch\n */\n tomtom.fuzzySearch = require(\"services/search/fuzzySearch\");\n /**\n * The poi search service...\n *\n * @method poiSearch\n */\n tomtom.poiSearch = require(\"services/search/poiSearch\");\n /**\n * The category search service...\n *\n * @method categorySearch\n */\n tomtom.categorySearch = require(\"services/search/categorySearch\");\n /**\n * The geometry search service...\n *\n * @method geometrySearch\n */\n tomtom.geometrySearch = require(\"services/search/geometrySearch\");\n /**\n * The nearby search service...\n *\n * @method nearbySearch\n */\n tomtom.nearbySearch = require(\"services/search/nearbySearch\");\n /**\n * The low bandwidth search service...\n *\n * @method lowBandwidthSearch\n */\n tomtom.lowBandwidthSearch = require(\"services/search/lowBandwidthSearch\");\n\n /**\n * The routing service...\n *\n * @method routing\n */\n tomtom.routing = require(\"services/routing\");\n\n /**\n * The search box widget...\n *\n * @method searchBox\n */\n tomtom.searchBox = require(\"widgets/controls/searchBox\");\n /**\n * The location widget...\n *\n * @method location\n */\n tomtom.location = require(\"widgets/controls/location\");\n /**\n * The route inputs widget...\n *\n * @method routeInputs\n */\n tomtom.routeInputs = require(\"widgets/controls/routeInputs\");\n /**\n * The route instructions widget...\n *\n * @method routeInstructions\n */\n tomtom.routeInstructions = require(\"widgets/controls/routeInstructions\");\n /**\n * The messageBox widget...\n *\n * @method messageBox\n */\n tomtom.messageBox = L.messageBox;\n /**\n * The unitFormatConverter util...\n *\n * @method unitFormatConverter\n */\n tomtom.unitFormatConverter = require(\"unitFormatConverter/unitFormatConverter\");\n\n tomtom.markersView = require(\"widgets/views/markers\");\n tomtom.routeOnMap = require(\"widgets/views/routeOnMap\");\n tomtom.routeSummary = require(\"widgets/views/routeSummary\");\n\n var security = require(\"security\");\n /**\n * Sets a key 'config' object in the security configuration file. When the key's name is omitted, then the default key is set.\n *\n * @example\n * ```javascript\n *\n * tomtom.key('keyValue'); // sets global key\n * tomtom.key('service/traffic', 'keyValue'); // sets key for traffic service\n * ```\n *\n * @method key\n * @param {String} [name] Name of the key to be set.\n * @param {String} value Value of the key.\n */\n tomtom.key = security.setKey;\n /**\n * Sets a key for the services: map tiles and copyrights. Can also be passed on the map object's initialization with\n * _key_ parameter.\n *\n * @example\n * ```javascript\n *\n * tomtom.mapsKey('keyValue'); // sets maps key\n * ```\n *\n * @method mapsKey\n * @param {String} value Value of the maps key.\n */\n tomtom.mapsKey = security.setKeyForName(\"services/display\");\n /**\n * Sets a key for the traffic incidents tiles and services. Can also be passed on the map object's\n * initialization as an option of the traffic incidents layer.\n *\n * @example\n * ```javascript\n *\n * tomtom.trafficKey('keyValue'); // sets traffic key\n * ```\n *\n * @method trafficKey\n * @param {String} value Value of the traffic key.\n */\n tomtom.trafficKey = security.setKeyForName(\"services/traffic\");\n /**\n * Sets a key for traffic flow tiles service. Can also be passed on the map object's initialization as an option of the traffic\n * flow layer.\n *\n * @example\n * ```javascript\n *\n * tomtom.trafficFlowKey('keyValue'); // sets traffic flow key\n * ```\n *\n * @method trafficFlowKey\n * @param {String} value Value of the traffic flow key.\n */\n tomtom.trafficFlowKey = security.setKeyForName(\"services/trafficFlow\");\n /**\n * Sets a key for search, geocode and reverse geocode services.\n *\n * @example\n * ```javascript\n *\n * tomtom.searchKey('keyValue'); // sets search key\n * ```\n *\n * @method searchKey\n * @param {String} value Value of the search key.\n */\n tomtom.searchKey = security.setKeyForName(\"services/search\");\n /**\n * Sets a key for the routing service.\n *\n * @example\n * ```javascript\n *\n * tomtom.routingKey('keyValue'); // sets routing key\n * ```\n *\n * @method routingKey\n * @param {String} value Value of the routing key.\n */\n tomtom.routingKey = security.setKeyForName(\"services/routing\");\n return tomtom;\n});\n\n","require.config({\n baseUrl: \"js\",\n paths: {\n aja: \"lib/aja/src/aja\",\n \"es6-promise-polyfill\": \"lib/es6-promise-polyfill/promise\",\n leaflet: \"lib/leaflet/dist/leaflet-src\",\n markercluster: \"lib/markercluster/dist/leaflet.markercluster-src\",\n requirejs: \"lib/requirejs/require\",\n t: \"lib/t.js/t\"\n },\n shim: {\n \"display/map\": {\n exports: \"L\"\n },\n markercluster: {\n deps: [\n \"display/map\"\n ]\n }\n },\n map: {\n \"*\": {\n http: \"requester/requester\",\n security: \"security/apiKeySecurity\"\n }\n },\n packages: [\n\n ]\n});\n\ndefine(\"config\", function(){});\n\n"," return require(\"main\");\n}));\n"]}