@raruto/leaflet-elevation 1.6.9 → 1.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -3
- package/dist/leaflet-elevation.css +1 -0
- package/dist/leaflet-elevation.js +76 -31
- package/dist/leaflet-elevation.js.map +1 -1
- package/dist/leaflet-elevation.min.css +1 -1
- package/dist/leaflet-elevation.min.js +1 -1
- package/dist/leaflet-elevation.min.js.map +1 -1
- package/libs/leaflet-gpxgroup.js +45 -35
- package/libs/leaflet-gpxgroup.min.js +14 -13
- package/package.json +1 -1
- package/src/chart.js +4 -0
- package/src/components.js +6 -0
- package/src/control.js +38 -6
- package/src/index.css +1 -0
- package/src/options.js +9 -16
- package/src/utils.js +10 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leaflet-elevation.min.js","sources":["../src/utils.js","../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/components.js","../src/chart.js","../src/marker.js","../src/summary.js","../src/options.js","../src/control.js","../src/distance.js","../src/altitude.js","../src/time.js","../src/slope.js","../src/speed.js","../src/acceleration.js","../src/index.js"],"sourcesContent":["/**\n * Recursive deep merge objects.\n * Alternative to L.Util.setOptions(this, options).\n */\nexport function deepMerge(target, ...sources) {\n\tif (!sources.length) return target;\n\tconst source = sources.shift();\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) Object.assign(target, {\n\t\t\t\t\t[key]: {}\n\t\t\t\t});\n\t\t\t\tdeepMerge(target[key], source[key]);\n\t\t\t} else {\n\t\t\t\tObject.assign(target, {\n\t\t\t\t\t[key]: source[key]\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn deepMerge(target, ...sources);\n}\n\n/**\n * Wait for document load before execute function.\n */\nexport function deferFunc(f) {\n\tif (document.readyState !== 'complete') window.addEventListener(\"load\", f, { once: true });\n\telse f();\n}\n/**\n * Debounce function to limit events are being fired.\n */\nexport function debounce(func, wait, context, immediate) {\n\tvar timeout;\n\treturn function() {\n\t\tvar args = arguments;\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\tif (!immediate) func.apply(context, args);\n\t\t}, wait);\n\t\tif (immediate && !timeout) func.apply(context, args);\n\t};\n}\n\nconst SEC = 1000;\nconst MIN = SEC * 60;\nconst HOUR = MIN * 60;\nconst DAY = HOUR * 24;\n\n/**\n * Convert a duration time (millis) to a human readable string (%Dd %H:%M'%S\")\n */\nexport function formatTime(t) {\n\tlet d = Math.floor(t / DAY);\n\tlet h = Math.floor( (t - d * DAY) / HOUR);\n\tlet m = Math.floor( (t - d * DAY - h * HOUR) / MIN);\n\tlet s = Math.round( (t - d * DAY - h * HOUR - m * MIN) / SEC);\n\tif ( s === 60 ) { m++; s = 0; }\n\tif ( m === 60 ) { h++; m = 0; }\n\tif ( h === 24 ) { d++; h = 0; }\n\treturn (d ? d + \"d \" : '') + h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0) + \"'\" + s.toString().padStart(2, 0) + '\"';\n}\n\n/**\n * Simple GeoJSON data loader.\n */\nexport function GeoJSONLoader(data, control) {\n\tif (typeof data === \"string\") {\n\t\tdata = JSON.parse(data);\n\t}\n\tcontrol = control || this;\n\n let distanceMarkers = (\n\t\t\tcontrol.options.distanceMarkers === true\n\t\t\t\t? { lazy: true }\n\t\t\t\t: L.extend({ lazy: true }, control.options.distanceMarkers)\n\t);\n\n let wptIcons = control.options.gpxOptions.marker_options.wptIcons;\n\n\tlet layer = L.geoJson(data, {\n\t\tdistanceMarkers: distanceMarkers,\n\t\tstyle: (feature) => {\n\t\t\tlet style = L.extend({}, control.options.polyline);\n\t\t\tif (control.options.theme) {\n\t\t\t\tstyle.className += ' ' + control.options.theme;\n\t\t\t}\n\t\t\treturn style;\n\t\t},\n\t\tpointToLayer: (feature, latlng) => {\n\t\t\tlet prop = feature.properties;\n\t\t\tlet desc = prop.desc ? prop.desc : '';\n\t\t\tlet name = prop.name ? prop.name : '';\n\t\t\tlet sym = (prop.sym ? prop.sym : name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase();\n\n\t\t\t// generate appropriate icon symbol or retrieve it from cache\n\t\t\twptIcons[sym] = (wptIcons[sym] ? wptIcons[sym] : L.divIcon({\n\t\t\t\tclassName: 'elevation-waypoint-marker',\n\t\t\t\thtml: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>',\n\t\t\t\ticonSize: [30, 30],\n\t\t\t\ticonAnchor: [8, 30],\n\t\t\t}));\n\t\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\n\t\t\tif (name || desc) {\n\t\t\t\tmarker.bindPopup(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : '')).openPopup();\n\t\t\t}\n\t\t\tcontrol._registerCheckPoint({latlng: latlng, label: name}, true);\n\t\t\tcontrol.fire('waypoint_added', { point: marker, element: latlng, properties: prop });\n\t\t\treturn marker;\n\t\t},\n\t\tonEachFeature: (feature, layer) => {\n\t\t\tif (feature.geometry && feature.geometry.type == 'Point') return;\n\n\t\t\t// Standard GeoJSON\n\t\t\t// control.addData(feature, layer); // NB uses \"_addGeoJSONData\"\n\n\t\t\t// Extended GeoJSON\n\t\t\tlayer._latlngs.forEach((point, i, data) => {\n\t\t\t\t// same properties as L.GPX layer\n\t\t\t\tpoint.meta = { time: null, ele: null, hr: null, cad: null, atemp: null };\n\t\t\t\tif(\"alt\" in point) point.meta.ele = point.alt;\n\t\t\t\tif(feature.properties) {\n\t\t\t\t\tlet prop = feature.properties;\n\t\t\t\t\tif(\"coordTimes\" in prop) point.meta.time = new Date(Date.parse(prop.coordTimes[i]));\n\t\t\t\t\telse if(\"times\" in prop) point.meta.time = new Date(Date.parse(prop.times[i]));\n\t\t\t\t\telse if(\"time\" in prop) point.meta.time = new Date(Date.parse((typeof prop.time === 'object' ? prop.time[i] : prop.time)));\n\t\t\t\t\tif(\"heartRates\" in prop) point.meta.hr = parseInt(prop.heartRates[i]);\n\t\t\t\t\telse if(\"heartRate\" in prop) point.meta.hr = parseInt((typeof prop.heartRate === 'object' ? prop.heartRate[i] : prop.heartRate));\n\t\t\t\t\t// TODO: cadence, temperature\n\t\t\t\t}\n\t\t\t});\n\t\t\tcontrol.addData(layer); // NB uses \"_addGPXData\"\n\n\t\t\t// Postpone adding the distance markers (lazy: true)\n\t\t\tif(control.options.distanceMarkers && distanceMarkers.lazy) {\n\t\t\t layer.on('add remove', (e) => {\n\t\t\t let path = e.target;\n\t\t\t if (L.DistanceMarkers && path instanceof L.Polyline) {\n\t\t\t\t\t\tpath[e.type + 'DistanceMarkers']();\n\t\t\t }\n\t\t\t });\n\t\t\t}\n\n\t\t\tcontrol.track_info = L.extend({}, control.track_info, { type: \"geojson\", name: data.name });\n\t\t},\n\t});\n\n\tL.Control.Elevation._d3LazyLoader.then(() => {\n\t\tcontrol._fireEvt(\"eledata_loaded\", { data: data, layer: layer, name: control.track_info.name, track_info: control.track_info })\n\t});\n\n\treturn layer;\n}\n\n/**\n * Check DOM element visibility.\n */\nexport function isDomVisible(elem) {\n\treturn !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\n}\n\n/**\n * Check object type.\n */\nexport function isObject(item) {\n\treturn (item && typeof item === 'object' && !Array.isArray(item));\n}\n\n/**\n * Check DOM element viewport visibility.\n */\nexport function isVisible(elem) {\n\tif (!elem) return false;\n\n\tlet styles = window.getComputedStyle(elem);\n\n\tfunction isVisibleByStyles(elem, styles) {\n\t\treturn styles.visibility !== 'hidden' && styles.display !== 'none';\n\t}\n\n\tfunction isAboveOtherElements(elem, styles) {\n\t\tlet boundingRect = elem.getBoundingClientRect();\n\t\tlet left = boundingRect.left + 1;\n\t\tlet right = boundingRect.right - 1;\n\t\tlet top = boundingRect.top + 1;\n\t\tlet bottom = boundingRect.bottom - 1;\n\t\tlet above = true;\n\n\t\tlet pointerEvents = elem.style.pointerEvents;\n\n\t\tif (styles['pointer-events'] == 'none') elem.style.pointerEvents = 'auto';\n\n\t\tif (document.elementFromPoint(left, top) !== elem) above = false;\n\t\tif (document.elementFromPoint(right, top) !== elem) above = false;\n\n\t\t// Only for completely visible elements\n\t\t// if (document.elementFromPoint(left, bottom) !== elem) above = false;\n\t\t// if (document.elementFromPoint(right, bottom) !== elem) above = false;\n\n\t\telem.style.pointerEvents = pointerEvents;\n\n\t\treturn above;\n\t}\n\n\tif (!isVisibleByStyles(elem, styles)) return false;\n\tif (!isAboveOtherElements(elem, styles)) return false;\n\treturn true;\n}\n\n/**\n * Check JSON object type.\n */\nexport function isJSONDoc(doc, lazy) {\n\tlazy = typeof lazy === \"undefined\" ? true : lazy;\n\tif (typeof doc === \"string\" && lazy) {\n\t\tdoc = doc.trim();\n\t\treturn doc.indexOf(\"{\") == 0 || doc.indexOf(\"[\") == 0;\n\t} else {\n\t\ttry {\n\t\t\tJSON.parse(doc.toString());\n\t\t} catch (e) {\n\t\t\tif (typeof doc === \"object\" && lazy) return true;\n\t\t\tconsole.warn(e);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\n/**\n * Check XML object type.\n */\nexport function isXMLDoc(doc, lazy) {\n\tlazy = typeof lazy === \"undefined\" ? true : lazy;\n\tif (typeof doc === \"string\" && lazy) {\n\t\tdoc = doc.trim();\n\t\treturn doc.indexOf(\"<\") == 0;\n\t} else {\n\t\tlet documentElement = (doc ? doc.ownerDocument || doc : 0).documentElement;\n\t\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n\t}\n}\n\n/**\n * Async JS script download.\n */\nexport function lazyLoader(url, skip, loader) {\n\tif (skip === false) {\n\t\treturn Promise.resolve();\n\t}\n\tif (loader instanceof Promise) {\n\t\treturn loader;\n\t}\n\treturn new Promise((resolve, reject) => {\n\t\tlet tag = document.createElement(\"script\");\n\t\ttag.addEventListener('load', resolve, { once: true });\n\t\ttag.src = url;\n\t\tdocument.head.appendChild(tag);\n\t});\n}\n\n/**\n * Generate download data event.\n */\nexport function saveFile(dataURI, fileName) {\n\tlet a = create('a', '', { href: dataURI, target: '_new', download: fileName || \"\", style: \"display:none;\" });\n\tlet b = document.body;\n\tb.appendChild(a);\n\ta.click();\n\tb.removeChild(a);\n}\n\n/**\n * Wait for element visible before execute function.\n */\nexport function waitHolder(elem) {\n\treturn new Promise((resolve, reject) => {\n\t\tlet ticking = false;\n\t\tlet scrollFn = () => {\n\t\t\tif (!ticking) {\n\t\t\t\tL.Util.requestAnimFrame(() => {\n\t\t\t\t\tif (isVisible(elem)) {\n\t\t\t\t\t\twindow.removeEventListener('scroll', scrollFn);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t\tticking = false;\n\t\t\t\t});\n\t\t\t\tticking = true;\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener('scroll', scrollFn);\n\t\tif (elem) elem.addEventListener('mouseenter', scrollFn, { once: true });\n\t\tscrollFn();\n\t});\n}\n\n/**\n * A little bit safier than L.DomUtil.addClass\n */\nexport function addClass(targetNode, className) {\n\tif (targetNode) className.split(\" \").every(s => s && L.DomUtil.addClass(targetNode, s));\n}\n\n/**\n * A little bit safier than L.DomUtil.removeClass()\n */\nexport function removeClass(targetNode, className) {\n\tif (targetNode) className.split(\" \").every(s => s && L.DomUtil.removeClass(targetNode, s));\n}\n\nexport function toggleClass(targetNode, className, conditional) {\n\treturn (conditional ? addClass : removeClass).call(null, targetNode, className)\n}\n\nexport function replaceClass(targetNode, removeClassName, addClassName) {\n if (removeClassName) removeClass(targetNode, removeClassName);\n if (addClassName) addClass(targetNode, addClassName);\n}\n\nexport function style(targetNode, name, value) {\n\tif (typeof value === \"undefined\") return L.DomUtil.getStyle(targetNode, name);\n\telse return targetNode.style.setProperty(name, value);\n}\n\nexport function toggleStyle(targetNode, name, value, conditional) {\n return style(targetNode, name, conditional ? value : '');\n}\n\nexport function toggleEvent(leafletElement, eventName, handler, conditional) {\n\treturn leafletElement[conditional ? 'on' : 'off'](eventName, handler);\n}\n\n/**\n * A little bit shorter than L.DomUtil.create()\n */\nexport function create(tagName, className, attributes, parent) {\n\tlet elem = L.DomUtil.create(tagName, className || \"\");\n\tif (attributes) setAttributes(elem, attributes);\n\tif (parent) append(parent, elem);\n\treturn elem;\n}\n\n/**\n * Same as node.appendChild()\n */\nexport function append(parent, child) {\n\treturn parent.appendChild(child);\n}\n\n/**\n * Same as node.insertAdjacentElement()\n */\nexport function insert(parent, child, position) {\n\treturn parent.insertAdjacentElement(position, child);\n}\n\n/**\n * Loop for node.setAttribute()\n */\nexport function setAttributes(elem, attrs) {\n\tfor (let k in attrs) { elem.setAttribute(k, attrs[k]); }\n}\n\n/**\n * Same as node.querySelector().\n */\nexport function select(selector, context) {\n\treturn (context || document).querySelector(selector);\n}\n\n/**\n * Alias for L.DomEvent.on.\n */\nexport const on = L.DomEvent.on;\n\n/**\n * Alias for L.DomEvent.off.\n */\nexport const off = L.DomEvent.off;\n\n/**\n * Alias for L.DomUtil.hasClass.\n */\nexport const hasClass = L.DomUtil.hasClass;\n\n\nexport function randomId() {\n\treturn Math.random().toString(36).substr(2, 9);\n}\n\nexport function each(obj, fn) {\n\tfor (let i in obj) fn(obj[i], i);\n}\n","// Following https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md\n(function (factory, window) {\n\n // define an AMD module that relies on 'leaflet'\n if (typeof define === 'function' && define.amd) {\n define(['leaflet'], factory);\n\n // define a Common JS module that relies on 'leaflet'\n } else if (typeof exports === 'object') {\n module.exports = factory(require('leaflet'));\n }\n\n // attach your plugin to the global 'L' variable\n if (typeof window !== 'undefined' && window.L) {\n factory(window.L);\n\n }\n}(function (L) {\n L.locales = {};\n L.locale = null;\n L.registerLocale = function registerLocale(code, locale) {\n L.locales[code] = L.Util.extend({}, L.locales[code], locale);\n };\n L.setLocale = function setLocale(code) {\n L.locale = code;\n };\n return L.i18n = L._ = function translate(string, data) {\n if (L.locale && L.locales[L.locale] && L.locales[L.locale][string]) {\n string = L.locales[L.locale][string];\n }\n try {\n // Do not fail if some data is missing\n // a bad translation should not break the app\n string = L.Util.template(string, data);\n }\n catch (err) {/*pass*/\n }\n\n return string;\n };\n}, window));\n","export const Colors = {\n\t'lightblue': { area: '#3366CC', alpha: 0.45, stroke: '#3366CC' },\n\t'magenta' : { area: '#FF005E' },\n\t'yellow' : { area: '#FF0' },\n\t'purple' : { area: '#732C7B' },\n\t'steelblue': { area: '#4682B4' },\n\t'red' : { area: '#F00' },\n\t'lime' : { area: '#9CC222', line: '#566B13' }\n};\n\nexport const Area = ({\n\twidth,\n\theight,\n\txAttr,\n\tyAttr,\n\tscaleX,\n\tscaleY,\n\tinterpolation = \"curveLinear\"\n}) => {\n\treturn d3.area()\n\t\t.curve(typeof interpolation === 'string' ? d3[interpolation] : interpolation)\n\t\t.x(d => (d.xDiagCoord = scaleX(d[xAttr])))\n\t\t.y0(height)\n\t\t.y1(d => scaleY(d[yAttr]));\n};\n\nexport const Path = ({\n\tname,\n\tcolor,\n\tstrokeColor,\n\tstrokeOpacity,\n\tfillOpacity,\n}) => {\n\tlet path = d3.create('svg:path')\n\n\tif (name) path.classed(name, true);\n\n\tpath.style(\"pointer-events\", \"none\");\n\n\tpath\n\t.attr(\"fill\", color || '#3366CC')\n\t.attr(\"stroke\", strokeColor || '#000')\n\t.attr(\"stroke-opacity\", strokeOpacity || '1')\n\t.attr(\"fill-opacity\", fillOpacity || '0.8');\n\n\treturn path;\n};\n\nexport const Axis = ({\n\ttype = \"axis\",\n\ttickSize = 6,\n\ttickPadding = 3,\n\tposition,\n\theight,\n\twidth,\n\taxis,\n\tscale,\n\tticks,\n\ttickFormat,\n\tlabel,\n\tlabelX,\n\tlabelY,\n\tname = \"\",\n\tonAxisMount,\n}) => {\n\treturn g => {\n\t\tlet [w, h] = [0, 0];\n\t\tif (position == \"bottom\") h = height;\n\t\tif (position == \"right\") w = width;\n\n\t\tif (axis == \"x\" && type == \"grid\") {\n\t\t\ttickSize = -height;\n\t\t} else if (axis == \"y\" && type == \"grid\") {\n\t\t\ttickSize = -width;\n\t\t}\n\n\t\tlet axisScale = d3[\"axis\" + position.replace(/\\b\\w/g, l => l.toUpperCase())]()\n\t\t\t.scale(scale)\n\t\t\t.ticks(ticks)\n\t\t\t.tickPadding(tickPadding)\n\t\t\t.tickSize(tickSize)\n\t\t\t.tickFormat(tickFormat);\n\n\t\tlet axisGroup = g.append(\"g\")\n\t\t\t.attr(\"class\", [axis, type, position, name].join(\" \"))\n\t\t\t.attr(\"transform\", \"translate(\" + w + \",\" + h + \")\")\n\t\t\t.call(axisScale);\n\n\t\tif (label) {\n\t\t\taxisGroup.append(\"svg:text\")\n\t\t\t\t.attr(\"x\", labelX)\n\t\t\t\t.attr(\"y\", labelY)\n\t\t\t\t.text(label);\n\t\t}\n\n\t\tif (onAxisMount) {\n\t\t\taxisGroup.call(onAxisMount);\n\t\t}\n\n\t\treturn axisGroup;\n\t};\n};\n\nexport const Grid = (props) => {\n\tprops.type = \"grid\";\n\treturn Axis(props);\n};\n\nexport const HeightFocusLine = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n\tlength = 0,\n}) => {\n\treturn line => line\n\t\t.attr(\"class\", theme + \" height-focus line\")\n\t\t.attr(\"x1\", xCoord)\n\t\t.attr(\"x2\", xCoord)\n\t\t.attr(\"y1\", yCoord)\n\t\t.attr(\"y2\", length);\n};\n\nexport const HeightFocusLabel = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n\tlabel,\n}) => {\n\treturn text => {\n\t\ttext\n\t\t\t.attr(\"class\", theme + \" height-focus-label\")\n\t\t\t.style(\"pointer-events\", \"none\")\n\t\t\t.attr(\"x\", xCoord + 5)\n\t\t\t.attr(\"y\", yCoord);\n\n\t\tlet y = text.select(\".height-focus-y\");\n\t\tif (!y.node()) y = text.append(\"svg:tspan\");\n\n\t\ty\n\t\t\t.attr(\"class\", \"height-focus-y\")\n\t\t\t.text(label);\n\n\t\ttext.selectAll('tspan').attr(\"x\", xCoord + 5);\n\n\t\treturn text;\n\t};\n};\n\nexport const HeightFocusMarker = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n}) => {\n\treturn circle => circle\n\t\t.attr(\"class\", theme + \" height-focus circle-lower\")\n\t\t.attr(\"transform\", \"translate(\" + xCoord + \",\" + yCoord + \")\")\n\t\t.attr(\"r\", 6)\n\t\t.attr(\"cx\", 0)\n\t\t.attr(\"cy\", 0);\n};\n\nexport const LegendItem = ({\n\tname,\n label,\n\twidth,\n\theight,\n\tmargins = {},\n\tcolor,\n\tpath\n}) => {\n\treturn g => {\n\t\tg\n\t\t\t.attr(\"class\", \"legend-item legend-\" + name.toLowerCase())\n\t\t\t.attr(\"data-name\", name);\n\n\t\tconst svg = d3.select(g.node().ownerSVGElement || g);\n\n\t\tg.on('click.legend', () => svg.dispatch(\"legend_clicked\", {\n\t\t\tdetail: {\n\t\t\t\tpath: path.node(),\n\t\t\t\tname: name,\n\t\t\t\tlegend: g.node(),\n\t\t\t\tenabled: !path.classed('leaflet-hidden'),\n\t\t\t}\n\t\t}));\n\n\t\tg.append(\"svg:rect\")\n\t\t\t.attr(\"x\", (width / 2) - 50)\n\t\t\t.attr(\"y\", height + margins.bottom / 2)\n\t\t\t.attr(\"width\", 50)\n\t\t\t.attr(\"height\", 10)\n\t\t\t.attr(\"fill\", color)\n\t\t\t.attr(\"stroke\", \"#000\")\n\t\t\t.attr(\"stroke-opacity\", \"0.5\")\n\t\t\t.attr(\"fill-opacity\", \"0.25\");\n\n\t\tg.append('svg:text')\n\t\t\t.text(L._(label || name))\n\t\t\t.attr(\"x\", (width / 2) + 5)\n\t\t\t.attr(\"font-size\", 10)\n\t\t\t.style(\"text-decoration-thickness\", \"2px\")\n\t\t\t.style(\"font-weight\", \"700\")\n\t\t\t.attr('y', height + margins.bottom / 2)\n\t\t\t.attr('dy', \"0.75em\");\n\n\t\treturn g;\n\t}\n};\n\nexport const MouseFocusLine = ({\n\txCoord = 0,\n\theight,\n}) => {\n\treturn line => line\n\t\t.attr('class', 'mouse-focus-line')\n\t\t.attr('x2', xCoord)\n\t\t.attr('y2', 0)\n\t\t.attr('x1', xCoord)\n\t\t.attr('y1', height);\n};\n\nexport const MouseFocusLabel = ({\n\txCoord,\n\tyCoord,\n\tlabelX = \"\",\n\tlabelY = \"\",\n\twidth,\n}) => {\n\treturn g => {\n\n\t\tg.attr('class', 'mouse-focus-label');\n\n\t\tlet rect = g.select(\".mouse-focus-label-rect\");\n\t\tlet text = g.select(\".mouse-focus-label-text\");\n\t\tlet y = text.select(\".mouse-focus-label-y\");\n\t\tlet x = text.select(\".mouse-focus-label-x\");\n\n\t\tif (!rect.node()) rect = g.append(\"svg:rect\");\n\t\tif (!text.node()) text = g.append(\"svg:text\");\n\t\tif (!y.node()) y = text.append(\"svg:tspan\");\n\t\tif (!x.node()) x = text.append(\"svg:tspan\");\n\n\t\ty.text(labelY);\n\t\tx.text(labelX);\n\n\t\t// Sets focus-label-text position to the left / right of the mouse-focus-line\n\t\tlet xAlign = 0;\n\t\tlet yAlign = 0;\n\t\tlet bbox = { width: 0, height: 0 };\n\t\ttry { bbox = text.node().getBBox(); } catch (e) { return g; }\n\n\t\tif (xCoord) xAlign = xCoord + (xCoord < width / 2 ? 10 : -bbox.width - 10);\n\t\tif (yCoord) yAlign = Math.max(yCoord - bbox.height, L.Browser.webkit ? 0 : -Infinity);\n\n\t\trect\n\t\t\t.attr(\"class\", \"mouse-focus-label-rect\")\n\t\t\t.attr(\"x\", xAlign - 5)\n\t\t\t.attr(\"y\", yAlign - 5)\n\t\t\t.attr(\"width\", bbox.width + 10)\n\t\t\t.attr(\"height\", bbox.height + 10)\n\t\t\t.attr(\"rx\", 3)\n\t\t\t.attr(\"ry\", 3);\n\t\ttext\n\t\t\t.attr(\"class\", \"mouse-focus-label-text\")\n\t\t\t.style(\"font-weight\", \"700\")\n\t\t\t.attr(\"y\", yAlign);\n\t\ty\n\t\t\t.attr(\"class\", \"mouse-focus-label-y\")\n\t\t\t.attr(\"dy\", \"1em\");\n\t\tx\n\t\t\t.attr(\"class\", \"mouse-focus-label-x\")\n\t\t\t.attr(\"dy\", \"2em\");\n\n\t\ttext.selectAll('tspan').attr(\"x\", xAlign);\n\n\t\treturn g;\n\t};\n};\n\nexport const Ruler = ({\n\theight,\n\twidth,\n}) => {\n\treturn g => {\n\n\t\tg.data([{\n\t\t\t\t\"x\": 0,\n\t\t\t\t\"y\": height,\n\t\t\t}])\n\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\");\n\n\t\tlet rect = g.selectAll('.horizontal-drag-rect')\n\t\t\t.data([{ w: width }]);\n\n\t\tlet line = g.selectAll('.horizontal-drag-line')\n\t\t\t.data([{ w: width }]);\n\n\t\tlet label = g.selectAll('.horizontal-drag-label')\n\t\t\t.data([{ w: width - 8 }]);\n\n\t\tlet symbol = g.selectAll('.horizontal-drag-symbol')\n\t\t\t.data([{\n\t\t\t\t\"type\": d3.symbolTriangle,\n\t\t\t\t\"x\": width + 7,\n\t\t\t\t\"y\": 0,\n\t\t\t\t\"angle\": -90,\n\t\t\t\t\"size\": 50\n\t\t\t}]);\n\n\t\trect.exit().remove();\n\t\tline.exit().remove();\n\t\tlabel.exit().remove();\n\t\tsymbol.exit().remove();\n\n\t\trect.enter()\n\t\t\t.append(\"svg:rect\")\n\t\t\t.attr(\"class\", \"horizontal-drag-rect\")\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", -8)\n\t\t\t.attr(\"height\", 8)\n\t\t\t.attr('fill', 'none')\n\t\t\t.attr('pointer-events', 'all')\n\t\t\t.merge(rect)\n\t\t\t.attr(\"width\", d => d.w);\n\n\t\tline.enter()\n\t\t\t.append(\"svg:line\")\n\t\t\t.attr(\"class\", \"horizontal-drag-line\")\n\t\t\t.attr(\"x1\", 0)\n\t\t\t.merge(line)\n\t\t\t.attr(\"x2\", d => d.w);\n\n\t\tlabel.enter()\n\t\t\t.append(\"svg:text\")\n\t\t\t.attr(\"class\", \"horizontal-drag-label\")\n\t\t\t.attr(\"text-anchor\", \"end\")\n\t\t\t.attr(\"y\", -8)\n\t\t\t.merge(label)\n\t\t\t.attr(\"x\", d => d.w)\n\n\t\tsymbol\n\t\t\t.enter()\n\t\t\t.append(\"svg:path\")\n\t\t\t.attr(\"class\", \"horizontal-drag-symbol\")\n\t\t\t.merge(symbol)\n\t\t\t.attr(\"d\",\n\t\t\t\td3.symbol()\n\t\t\t\t.type(d => d.type)\n\t\t\t\t.size(d => d.size)\n\t\t\t)\n\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \") rotate(\" + d.angle + \")\");\n\n\t\treturn g;\n\t}\n};\n\nexport const Domain = ({\n\tmin,\n\tmax,\n\tattr,\n\tname,\n\tforceBounds,\n\tscale\n}) => function(data) {\n\tattr = attr || name;\n\tif (scale && scale.attr) attr = scale.attr;\n\tlet domain = data && data.length ? d3.extent(data, d => d[attr]) : [0, 1];\n\tif (typeof min !== \"undefined\" && (min < domain[0] || forceBounds)) {\n\t\tdomain[0] = min;\n\t}\n\tif (typeof max !== \"undefined\" && (max > domain[1] || forceBounds)) {\n\t\tdomain[1] = max;\n\t}\n\treturn domain;\n};\n\nexport const Range = ({\n\taxis\n}) => function(width, height) {\n\tif (axis == 'x') return [0, width];\n\telse if (axis == 'y') return [height, 0];\n};\n\nexport const Scale = ({\n\tdata,\n\tattr,\n\tmin,\n\tmax,\n\tforceBounds,\n\trange,\n}) => {\n\treturn d3.scaleLinear()\n\t\t.range(range)\n\t\t.domain(Domain({min, max, attr, forceBounds})(data));\n};\n\nexport const Bisect = ({\n\tdata = [0, 1],\n\tscale,\n\tx,\n\tattr\n}) => {\n\treturn d3\n\t\t.bisector(d => d[attr])\n\t\t.left(data, scale.invert(x));\n};\n\nexport const Chart = ({\n\twidth,\n\theight,\n\tmargins = {},\n\truler,\n}) => {\n\n\tconst _width = width - margins.left - margins.right;\n\tconst _height = height - margins.top - margins.bottom;\n\n\t// SVG Container\n\tconst svg = d3.create(\"svg:svg\").attr(\"class\", \"background\");\n\n\t// SVG Groups\n\tconst g = svg.append(\"g\");\n\tconst panes = {\n\t\tgrid : g.append(\"g\").attr(\"class\", \"grid\"),\n\t\tarea : g.append('g').attr(\"class\", \"area\"),\n\t\tpoint : g.append('g').attr(\"class\", \"point\"),\n\t\taxis : g.append('g').attr(\"class\", \"axis\"),\n\t\tbrush : g.append(\"g\").attr(\"class\", \"brush\"),\n\t\ttooltip: g.append(\"g\").attr(\"class\", \"tooltip\").attr('display', 'none'),\n\t\truler : g.append('g').attr('class', 'ruler'),\n\t\tlegend : g.append('g').attr(\"class\", \"legend\"),\n\t};\n\n\t// SVG Paths\n\tconst clipPath = panes.area.append(\"svg:clipPath\").attr(\"id\", 'elevation-clipper');\n\tconst clipRect = clipPath.append(\"svg:rect\");\n\n\t// Canvas Paths\n\tconst foreignObject = panes.area.append('svg:foreignObject');\n\tconst canvas = foreignObject.append('xhtml:canvas').attr('class', 'canvas-plot');\n\tconst context = canvas.node().getContext('2d');\n\n\t// Mouse Focus\n\tconst dragG = panes.ruler;\n\tconst focusG = panes.tooltip;\n\tconst brushG = panes.brush;\n\n\tfocusG.append('svg:line')\n\t\t.call(\n\t\t\tMouseFocusLine({\n\t\t\t\txCoord: 0,\n\t\t\t\theight: _height\n\t\t\t})\n\t\t);\n\n\tfocusG.append(\"g\")\n\t\t.call(\n\t\t\tMouseFocusLabel({\n\t\t\t\txCoord: 0,\n\t\t\t\tyCoord: 0,\n\t\t\t\theight: _height,\n\t\t\t\twidth : _width,\n\t\t\t\tlabelX: \"\",\n\t\t\t\tlabelY: \"\",\n\t\t\t})\n\t\t);\n\n\n\t// Add the brushing\n\tlet brush = d3.brushX().on('start.cursor end.cursor brush.cursor', () => brushG.select(\".overlay\").attr('cursor', null));\n\n\t// Scales\n\tconst scale = (opts) => ({ x: Scale(opts.x), y: Scale(opts.y)});\n\n\tlet utils = {\n\t\tclipPath,\n\t\tcanvas,\n\t\tcontext,\n\t\tdragG,\n\t\tfocusG,\n\t\tbrush,\n\t};\n\n\tlet chart = {\n\t\tsvg,\n\t\tg,\n\t\tpanes,\n\t\tutils,\n\t\tscale,\n\t};\n\n\t// Resize\n\tchart._resize = ({\n\t\twidth,\n\t\theight,\n\t\tmargins = {},\n\t\truler,\n\t}) => {\n\n\t\tconst _width = width - margins.left - margins.right;\n\t\tconst _height = height - margins.top - margins.bottom;\n\n\t\tsvg.attr(\"viewBox\", `0 0 ${width} ${height}`)\n\t\t\t.attr(\"width\", width)\n\t\t\t.attr(\"height\", height);\n\n\t\tg.attr(\"transform\", \"translate(\" + margins.left + \",\" + margins.top + \")\");\n\n\t\tclipRect\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"width\", _width)\n\t\t\t.attr(\"height\", _height);\n\n\t\tforeignObject\n\t\t\t.attr('width', _width)\n\t\t\t.attr('height', _height);\n\n\t\tcanvas\n\t\t\t.attr('width', _width)\n\t\t\t.attr('height', _height);\n\n\t\tif (ruler) {\n\t\t\tdragG .call(Ruler({ height: _height, width: _width }));\n\t\t}\n\n\t\tbrushG.call(brush.extent( [ [0,0], [_width, _height] ] ));\n\t\tbrushG.select(\".overlay\").attr('cursor', null);\n\n\t\tchart._width = _width;\n\t\tchart._height = _height;\n\n\t\tchart.svg.dispatch('resize', { detail: { width: _width, height: _height } } );\n\n\t};\n\n\tchart.pane = (name) => {\n\t\tif (!panes[name]) {\n\t\t\tpanes[name] = g.append('g').attr(\"class\", name);\n\t\t}\n\t\treturn panes[name];\n\t}\n\n\tchart.get = (name) => utils[name];\n\n\tchart._resize({ width, height, margins});\n\n\treturn chart;\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Chart = L.Class.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\tinitialize: function(opts, control) {\n\t\tthis.options = opts;\n\t\tthis.control = control;\n\n\t\tthis._data = [];\n\n\t\t// cache registered components\n\t\tthis._props = {\n\t\t\tscales : {},\n\t\t\tpaths : {},\n\t\t\tareas : {},\n\t\t\tgrids : {},\n\t\t\taxes : {},\n\t\t\tlegendItems: {},\n\t\t\tfocusLabels: {},\n\t\t};\n\n\t\tthis._scales = {};\n\t\tthis._domains = {};\n\t\tthis._ranges = {};\n\t\tthis._paths = {};\n\n\t\tthis._brushEnabled = opts.dragging;\n\t\tthis._zoomEnabled = opts.zooming;\n\n\t\tif (opts.imperial) {\n\t\t\tthis._xLabel = \"mi\";\n\t\t\tthis._yLabel = \"ft\";\n\t\t} else {\n\t\t\tthis._xLabel = opts.xLabel;\n\t\t\tthis._yLabel = opts.yLabel;\n\t\t}\n\n\t\tlet chart = this._chart = D3.Chart(opts);\n\n\t\t// SVG Container\n\t\tlet svg = this._container = chart.svg;\n\n\t\t// Panes\n\t\tthis._grid = chart.pane('grid');\n\t\tthis._area = chart.pane('area');\n\t\tthis._point = chart.pane('point');\n\t\tthis._axis = chart.pane('axis');\n\t\tthis._legend = chart.pane('legend');\n\n\t\t// Scales\n\t\tthis._initScale();\n\n\t\t// Helpers\n\t\tthis._clipPath = chart.get('clipPath');\n\t\tthis._canvas = chart.get('canvas');\n\t\tthis._context = chart.get('context');\n\t\tthis._dragG = chart.get('dragG');\n\t\tthis._focusG = chart.get('focusG');\n\t\tthis._brush = chart.get('brush');\n\n\t\t// Tooltip\n\t\tthis._focusline = this._focusG.select('.mouse-focus-line');\n\t\tthis._focuslabel = this._focusG.select('.mouse-focus-label');\n\n\t\tthis._zoom = d3.zoom();\n\t\tthis._drag = d3.drag();\n\n\t\t// Interactions\n\t\tthis._initInteractions();\n\n\t\t// svg.on('resize', (e)=>console.log(e.detail));\n\n\t},\n\n\tupdate: function(props) {\n\t\tif (props) {\n\t\t\tif (props.data) this._data = props.data;\n\t\t\tif (props.options) this.options = props.options;\n\t\t}\n\n\t\tthis._updateScale();\n\t\tthis._updateArea();\n\t\tthis._updateAxis();\n\t\tthis._updateLegend();\n\t\tthis._updateClipper();\n\n\t\treturn this;\n\t},\n\n\trender: function() {\n\t\treturn container => container.append(() => this._container.node());\n\t},\n\n\tclear: function() {\n\t\tthis._resetDrag();\n\t\tthis._area.selectAll('path').attr(\"d\", \"M0 0\");\n\t\tthis._context.clearRect(0, 0, this._width(), this._height());\n\t\tif (this._path) {\n\t\t\t// this._x.domain([0, 1]);\n\t\t\t// this._y.domain([0, 1]);\n\t\t}\n\t},\n\n\t_drawPath: function(name) {\n\t\tlet opts = this.options;\n\t\tlet ctx = this._context;\n\n\t\tlet path = this._paths[name];\n\t\tlet area = this._props.areas[name];\n\t\tlet node = path.node();\n\t\tlet scaleX = this._scales[area.scaleX];\n\t\tlet scaleY = this._scales[area.scaleY];\n\n\t\tarea = L.extend({}, area, {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t\tscaleX : scaleX,\n\t\t\tscaleY : scaleY\n\t\t});\n\n\t\tif (!scaleY || !scaleY) {\n\t\t\treturn console.warn('Unable to render path:' + name);\n\t\t}\n\n\t\tpath.datum(this._data).attr(\"d\", D3.Area(area));\n\n\t\tif (path.classed('leaflet-hidden')) return;\n\n\t\tif (opts.preferCanvas) {\n\t\t\tpath.classed('canvas-path', true);\n\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(0, 0);\n\t\t\tlet p = new Path2D(path.attr('d'));\n\n\t\t\tctx.strokeStyle = path.attr('stroke');\n\t\t\tctx.fillStyle = path.attr('fill');\n\t\t\tctx.lineWidth = 1.25;\n\t\t\tctx.globalCompositeOperation = 'source-over';\n\n\t\t\t// stroke opacity\n\t\t\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\n\t\t\tctx.stroke(p);\n\n\t\t\t// fill opacity\n\t\t\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\n\t\t\tctx.fill(p);\n\n\t\t\tctx.globalAlpha = 1;\n\n\t\t\tctx.closePath();\n\t\t} else {\n\t\t\tthis._area.append(() => node);\n\t\t}\n\t},\n\n\t_hasActiveLayers: function() {\n\t\tconst paths = this._paths;\n\t\tfor (var i in paths) {\n\t\t\tif (!paths[i].classed('leaflet-hidden')) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/**\n\t * Initialize \"d3-brush\".\n\t */\n\t_initBrush: function(e) {\n\t\tconst brush = (e) => {\n\t\t\tlet extent = e.selection;\n\t\t\tif (extent) {\n\t\t\t\tlet start = this._findIndexForXCoord(extent[0]);\n\t\t\t\tlet end = this._findIndexForXCoord(extent[1]);\n\t\t\t\tthis.fire('dragged', { dragstart: this._data[start], dragend: this._data[end] });\n\t\t\t}\n\t\t}\n\n\t\tconst focus = (e) => {\n\t\t\tif (e.type == 'brush' && !e.sourceEvent) return;\n\t\t\tlet rect = this._chart.panes.brush.select('.overlay').node();\n\t\t\tlet coords = d3.pointers(e, rect)[0];\n\t\t\tlet xCoord = coords[0];\n\t\t\tlet item = this._data[this._findIndexForXCoord(xCoord)];\n\n\t\t\tthis.fire(\"mouse_move\", { item: item, xCoord: xCoord });\n\t\t};\n\n\t\tthis._brush\n\t\t\t.filter((e) => this._brushEnabled && !e.shiftKey && !e.button)\n\t\t\t.on(\"end.update\", brush)\n\t\t\t.on(\"brush.update\", focus);\n\n\t\tthis._chart.panes.brush\n\t\t\t.on(\"mouseenter.focus touchstart.focus\", this.fire.bind(this, \"mouse_enter\"))\n\t\t\t.on(\"mouseout.focus touchend.focus\", this.fire.bind(this, \"mouse_out\") )\n\t\t\t.on(\"mousemove.focus touchmove.focus\", focus );\n\n\t},\n\n\t/**\n\t * Initialize \"d3-zoom\"\n\t */\n\t_initClipper: function() {\n\t\tlet svg = this._container;\n\t\tlet margin = this.options.margins;\n\n\t\tconst zoom = this._zoom;\n\n\t\tconst onStart = (e) => {\n\t\t\tif (e.sourceEvent && e.sourceEvent.type == \"mousedown\") svg.style('cursor', 'grabbing');\n\t\t\tif (e.transform.k == 1 && e.transform.x == 0) {\n\t\t\t\tthis._container.classed('zoomed', true);\n\t\t\t}\n\t\t\tthis.zooming = true;\n\t\t};\n\n\t\tconst onEnd = (e) => {\n\t\t\tif (e.transform.k ==1 && e.transform.x == 0){\n\t\t\t\tthis._container.classed('zoomed', false);\n\t\t\t}\n\t\t\tthis.zooming = false;\n\t\t\tsvg.style('cursor', '');\n\t\t};\n\n\t\tconst onZoom = (e) => {\n\t\t\t// TODO: find a faster way to redraw the chart.\n\t\t\tthis.zooming = false;\n\t\t\tthis._updateScale(); // hacky way for restoring x scale when zooming out\n\t\t\tthis.zooming = true;\n\t\t\tthis._scales.distance = this._x = e.transform.rescaleX(this._x); // calculate x scale at zoom level\n\t\t\tthis._resetDrag();\n\t\t\tif (e.sourceEvent && e.sourceEvent.type == \"mousemove\") {\n\t\t\t\tthis._hideDiagramIndicator();\n\t\t\t}\n\t\t\tthis.fire('zoom');\n\t\t};\n\n\t\tzoom\n\t\t\t.scaleExtent([1, 10])\n\t\t\t.extent([\n\t\t\t\t[margin.left, 0],\n\t\t\t\t[this._width() - margin.right, this._height()]\n\t\t\t])\n\t\t\t.translateExtent([\n\t\t\t\t[margin.left, -Infinity],\n\t\t\t\t[this._width() - margin.right, Infinity]\n\t\t\t])\n\t\t\t.filter((e) => this._zoomEnabled && (e.shiftKey || e.buttons == 4))\n\t\t\t.on(\"start\", onStart)\n\t\t\t.on(\"end\", onEnd)\n\t\t\t.on(\"zoom\", onZoom);\n\n\t\tsvg.call(zoom); // add zoom functionality to \"svg\" group\n\n\t\t// d3.select(\"body\").on(\"keydown.grabzoom keyup.grabzoom\", (e) => svg.style('cursor', e.shiftKey ? 'move' : ''));\n\n\t},\n\n\t_initInteractions: function() {\n\t\tthis._initBrush();\n\t\tthis._initRuler();\n\t\tthis._initClipper();\n\t\tthis._initLegend();\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_initLegend: function() {\n\t\tthis._container.on('legend_clicked', (e) => {\n\t\t\tlet { path, legend, name, enabled } = e.detail;\n\n\t\t\tif (!path) return;\n\n\t\t\tlet label = _.select('text', legend);\n\t\t\tlet rect = _.select('rect', legend);\n\n\t\t\t_.toggleStyle(label, 'text-decoration-line', 'line-through', enabled);\n\t\t\t_.toggleStyle(rect, 'fill-opacity', '0', enabled);\n\t\t\t_.toggleClass(path, 'leaflet-hidden', enabled);\n\n\t\t\tthis._updateArea();\n\n\t\t\tthis.fire(\"elepath_toggle\", { path, name, legend, enabled })\n\t\t});\n\t},\n\n\t/**\n\t * Initialize \"ruler\".\n\t */\n\t_initRuler: function() {\n\t\tif (!this.options.ruler) return;\n\n\t\t// const yMax = this._height();\n\t\tconst formatNum = d3.format(\".0f\");\n\t\tconst drag = this._drag;\n\n\t\tconst label = (e, d) => {\n\t\t\tlet yMax = this._height();\n\t\t\tlet y = this._dragG.data()[0].y;\n\t\t\tif (y >= yMax || y <= 0) this._dragG.select(\".horizontal-drag-label\").text('');\n\t\t\tthis._hideDiagramIndicator();\n\t\t};\n\n\t\tconst position = (e, d) => {\n\t\t\tlet yMax = this._height();\n\t\t\tlet yCoord = d3.pointers(e, this._area.node())[0][1];\n\t\t\tlet y = yCoord > 0 ? (yCoord < yMax ? yCoord : yMax) : 0;\n\t\t\tlet z = this._y.invert(y);\n\t\t\tlet data = L.extend(this._dragG.data()[0], { y: y });\n\n\t\t\tthis._dragG\n\t\t\t\t.data([data])\n\t\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\")\n\t\t\t\t.classed('active', y < yMax);\n\n\t\t\tthis._container.select(\".horizontal-drag-label\")\n\t\t\t\t.text(formatNum(z) + \" \" + this._yLabel);\n\n\t\t\tthis.fire('ruler_filter', { coords: yCoord < yMax && yCoord > 0 ? this._findCoordsForY(yCoord) : [] });\n\t\t}\n\n\t\tdrag\n\t\t.on(\"start end\", label)\n\t\t.on(\"drag\", position);\n\n\t\tthis._dragG.call(drag);\n\n\t},\n\n\t/**\n\t * Initialize x and y scales\n\t */\n\t_initScale: function() {\n\t\tlet opts = this.options;\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : 'x',\n\t\t\tposition: 'bottom',\n\t\t\tattr : opts.xAttr,\n\t\t\tmin : opts.xAxisMin,\n\t\t\tmax : opts.xAxisMax,\n\t\t\tname : 'distance'\n\t\t});\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : 'y',\n\t\t\tposition : 'left',\n\t\t\tattr : opts.yAttr,\n\t\t\tmin : opts.yAxisMin,\n\t\t\tmax : opts.yAxisMax,\n\t\t\tname : 'altitude'\n\t\t});\n\n\t\tthis._x = this._scales.distance;\n\t\tthis._y = this._scales.altitude;\n\t},\n\n\t_registerAreaPath: function(props) {\n\t\tlet opts = this.options;\n\n\t\tif (!props.xAttr) props.xAttr = opts.xAttr;\n\t\tif (!props.yAttr) props.yAttr = opts.yAttr;\n\t\tif (typeof props.preferCanvas === \"undefined\") props.preferCanvas = opts.preferCanvas;\n\n\t\tlet path = D3.Path(props);\n\n\t\t// Save paths in memory for latter usage\n\t\tthis._paths[props.name] = path;\n\t\tthis._props.areas[props.name] = props;\n\n\t\tif (opts.legend) {\n\t\t\tthis._props.legendItems[props.name] = {\n\t\t\t\tname : props.name,\n\t\t\t\tlabel : props.label,\n\t\t\t\tcolor : props.color,\n\t\t\t\tpath : path\n\t\t\t};\n\t\t}\n\n\t},\n\n\t_registerAxisGrid: function(props) {\n\t\tthis._props.grids[props.name || props.axis] = props;\n\t},\n\n\t_registerAxisScale: function(props) {\n\t\tlet opts = this.options;\n\t\tlet scale = props.scale;\n\n\t\tif (typeof scale !== 'function') {\n\t\t\tscale = L.extend({\n\t\t\t\tdata : this._data,\n\t\t\t\tforceBounds: opts.forceAxisBounds\n\t\t\t}, scale);\n\n\t\t\tscale.attr = scale.attr || props.name;\n\n\t\t\tlet domain = this._domains[props.name] = D3.Domain(props);\n\t\t\tlet range = this._ranges[props.name] = D3.Range(props);\n\t\t\tscale.range = scale.range || range(this._width(),this._height());\n\t\t\tscale.domain = scale.domain || domain(this._data);\n\n\t\t\tthis._props.scales[props.name] = scale;\n\n\t\t\tprops.scale = this._scales[props.name] = D3.Scale(scale);\n\t\t}\n\n\t\tif (!props.ticks) {\n\t\t\tif (props.axis == 'x') props.ticks = opts.xTicks;\n\t\t\telse if (props.axis == 'y') props.ticks = opts.yTicks;\n\t\t}\n\n\t\tthis._props.axes[props.name] = props;\n\n\t\treturn scale;\n\t},\n\n\t/**\n\t * Add a waypoint of interest over the chart\n\t */\n\t_registerCheckPoint: function(point) {\n\t\tif (!this._data.length) return;\n\n\t\tlet item, x, y;\n\n\t\tif (point.latlng) {\n\t\t\titem = this._data[this._findIndexForLatLng(point.latlng)];\n\t\t\tx = this._x(item.dist);\n\t\t\ty = this._y(item.z);\n\t\t} else if (!isNaN(point.dist)) {\n\t\t\tx = this._x(point.dist);\n\t\t\titem = this._data[this._findIndexForXCoord(x)]\n\t\t\ty = this._y(item.z);\n\t\t} else\n\n\t\tif (isNaN(x) || isNaN(y)) return;\n\n\t\tif (!point.item || !point.item.property('isConnected')) {\n\t\t\tpoint.position = point.position || \"bottom\";\n\n\t\t\tpoint.item = this._point.append('g');\n\n\t\t\tpoint.item.append(\"svg:line\")\n\t\t\t\t.attr(\"y1\", 0)\n\t\t\t\t.attr(\"x1\", 0)\n\t\t\t\t.attr(\"style\",\"stroke: rgb(51, 51, 51); stroke-width: 0.5; stroke-dasharray: 2, 2;\");\n\n\t\t\tpoint.item\n\t\t\t\t.append(\"svg:circle\")\n\t\t\t\t.attr(\"class\", \" height-focus circle-lower\")\n\t\t\t\t.attr(\"r\", 3);\n\n\t\t\tif (point.label) {\n\t\t\t\tpoint.item.append(\"svg:text\")\n\t\t\t\t\t.attr(\"dx\", \"4px\")\n\t\t\t\t\t.attr(\"dy\", \"-4px\");\n\t\t\t}\n\t\t}\n\n\t\tpoint.item\n\t\t\t.datum({\n\t\t\t\tpos: point.position,\n\t\t\t\tx: x,\n\t\t\t\ty: y\n\t\t\t})\n\t\t\t.attr(\"class\", d => \"point \" + d.pos)\n\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\");\n\n\t\tpoint.item.select('line')\n\t\t\t.datum({\n\t\t\t\ty2: ({'top': -y, 'bottom': this._height() - y})[point.position],\n\t\t\t\tx2: ({'left': -x, 'right': this._width() - x})[point.position] || 0\n\t\t\t})\n\t\t\t.attr(\"y2\", d => d.y2)\n\t\t\t.attr(\"x2\", d => d.x2)\n\n\t\tif (point.label) {\n\t\t\tpoint.item.select('text')\n\t\t\t\t.text(point.label);\n\t\t}\n\n\t},\n\n\t_registerFocusLabel: function(props) {\n\t\tthis._props.focusLabels[props.name] = props;\n\t},\n\n\t_updateArea: function() {\n\t\tlet paths = this._paths;\n\t\t// Reset and update chart profiles\n\t\tthis._context.clearRect(0, 0, this._width(), this._height());\n\t\tfor (var i in paths) {\n\t\t\tif (!paths[i].classed('leaflet-hidden')) {\n\t\t\t\tthis._drawPath(i);\n\t\t\t}\n\t\t}\n\t},\n\n\t_updateAxis: function() {\n\n\t\tlet opts = this.options;\n\n\t\t// Reset chart axis.\n\t\tthis._grid.selectAll('g').remove();\n\t\tthis._axis.selectAll('g').remove();\n\n\t\tlet grids = this._props.grids;\n\t\tlet axes = this._props.axes;\n\t\tlet props, axis, grid;\n\n\t\tlet gridOpts = {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t\ttickFormat: \"\",\n\t\t};\n\t\tlet axesOpts = {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t};\n\n\t\t// Render grids\n\t\tfor (let i in grids) {\n\t\t\tprops = L.extend({}, gridOpts, grids[i]);\n\t\t\tgrid = D3.Grid(props);\n\t\t\tthis._grid.call(grid);\n\t\t}\n\n\t\t// Render axis\n\t\tfor (let i in axes) {\n\t\t\tif (opts[i] === false || opts[i] === 'summary') continue;\n\t\t\tprops = L.extend({}, axesOpts, axes[i]);\n\t\t\taxis = D3.Axis(props);\n\t\t\tthis._axis.call(axis);\n\t\t}\n\n\t\t// Adjust axis scale positions\n\t\tthis._axis\n\t\t\t.selectAll('.y.axis.right')\n\t\t\t.each((d, i, n) => {\n\n\t\t\t\tlet axis = d3.select(n[i]);\n\t\t\t\tlet transform = axis.attr('transform');\n\t\t\t\tlet translate = transform.substring(transform.indexOf(\"(\") + 1, transform.indexOf(\")\")).split(\",\");\n\n\t\t\t\taxis.attr('transform', 'translate(' + (+translate[0] + (i * 40)) + ',' + translate[1] + ')')\n\n\t\t\t\tif (i > 0) {\n\t\t\t\t\taxis.select(':scope > path') .attr('opacity', 0.25);\n\t\t\t\t\taxis.selectAll(':scope > .tick line').attr('opacity', 0.75);\n\t\t\t\t}\n\n\t\t\t});\n\n\t},\n\n\t_updateClipper: function() {\n\t\tlet margin = this.options.margins;\n\n\t\tthis._zoom\n\t\t\t.scaleExtent([1, 10])\n\t\t\t.extent([\n\t\t\t\t[margin.left, 0],\n\t\t\t\t[this._width() - margin.right, this._height()]\n\t\t\t])\n\t\t\t.translateExtent([\n\t\t\t\t[margin.left, -Infinity],\n\t\t\t\t[this._width() - margin.right, Infinity]\n\t\t\t]);\n\n\t},\n\n\t_updateLegend: function () {\n\n\t\tif (this.options.legend == false) return;\n\n\t\tlet legends = this._props.legendItems;\n\t\tlet legend;\n\n\t\t// Reset legend items\n\t\tthis._legend.selectAll('g').remove();\n\t\tfor (var i in legends) {\n\t\t\tlegend = D3.LegendItem(\n\t\t\t\tL.extend({\n\t\t\t\t\twidth : this._width(),\n\t\t\t\t\theight : this._height(),\n\t\t\t\t\tmargins: this.options.margins,\n\t\t\t\t}, legends[i])\n\t\t\t)\n\t\t\tthis._legend.append(\"g\").call(legend);\n\t\t}\n\n\t\t// Get legend items\n\t\tlet items = this._legend.selectAll('.legend-item');\n\n\t\t// Calculate legend item positions\n\t\tlet n = items.nodes().length;\n\t\tlet v = Array(Math.floor(n / 2)).fill(null).map((d, i) => (i + 1) * 2 - (1 - Math.sign(n % 2)));\n\t\tlet rev = v.slice().reverse().map((d) => -(d));\n\n\t\tif (n % 2 !== 0) {\n\t\t\trev.push(0);\n\t\t}\n\t\tv = rev.concat(v);\n\n\t\t// Get chart margins\n\t\tlet xAxesB = this._axis.selectAll('.x.axis.bottom').nodes().length;\n\t\tlet marginB = 30 + (xAxesB * 2);\n\t\tlet marginR = n * 30;\n\n\t\t// Adjust chart right margins\n\t\tif (n && this.options.margins.right < marginR) {\n\t\t\tthis.options.margins.right = marginR;\n\t\t\tthis.fire('margins_updated');\n\t\t}\n\n\t\t// Adjust chart bottom margins\n\t\tif(xAxesB && this.options.margins.bottom < marginB) {\n\t\t\tthis.options.margins.bottom = marginB;\n\t\t\tthis.fire('margins_updated');\n\t\t}\n\n\t\titems\n\t\t\t.each((d, i, n) => {\n\n\t\t\t\tlet legend = d3.select(n[i]);\n\t\t\t\tlet rect = legend.select('rect');\n\t\t\t\tlet name = legend.attr('data-name');\n\t\t\t\tlet path = this._paths[name];\n\n\t\t\t\tlet tx = v[i] * 55;\n\t\t\t\tlet ty = xAxesB * 2;\n\n\t\t\t\tlegend\n\n\t\t\t\t// Adjust legend item positions\n\t\t\t\t.attr(\"transform\", \"translate(\" + tx + \", \" + ty + \")\");\n\n\t\t\t\t// Set initial state (disabled controls)\n\t\t\t\tif (name in this.options && this.options[name] == 'disabled') {\n\t\t\t\t\tpath.classed('leaflet-hidden', true);\n\t\t\t\t\tlegend.select('text').style('text-decoration-line', 'line-through');\n\t\t\t\t\tlegend.select('rect').style('fill-opacity', '0');\n\t\t\t\t}\n\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._clipPath) {\n\t\t\t\t\tpath.attr('clip-path', 'url(#' + this._clipPath.attr('id') + ')');\n\t\t\t\t}\n\n\t\t\t});\n\t},\n\n\t_updateScale: function() {\n\t\tif (this.zooming) return { x: this._x, y: this._y };\n\n\t\tlet opts = this.options;\n\n\t\tlet scales = this._scales;\n\t\tlet d = this._domains;\n\t\tlet r = this._ranges;\n\n\t\tfor (let i in scales) {\n\t\t\tscales[i]\n\t\t\t.domain(d[i](this._data))\n\t\t\t.range(r[i](this._width(), this._height()))\n\t\t}\n\n\t\treturn { x: this._x, y: this._y };\n\t},\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\treturn this._chart._width;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\treturn this._chart._height;\n\t},\n\n\t/*\n\t * Finds data entries above a given y-elevation value and returns geo-coordinates\n\t */\n\t_findCoordsForY: function(y) {\n\t\tlet data = this._data;\n\t\tlet z = this._y.invert(y);\n\n\t\t// save indexes of elevation values above the horizontal line\n\t\tconst list = data.reduce((array, item, index) => {\n\t\t\tif (item.z >= z) array.push(index);\n\t\t\treturn array;\n\t\t}, []);\n\n\t\tlet start = 0;\n\t\tlet next;\n\n\t\t// split index list into blocks of coordinates\n\t\tconst coords = list.reduce((array, _, curr) => {\n\t\t\tnext = curr + 1;\n\t\t\tif (list[next] !== list[curr] + 1 || next === list.length) {\n\t\t\t\tarray.push(\n\t\t\t\t\tlist\n\t\t\t\t\t.slice(start, next)\n\t\t\t\t\t.map(i => data[i].latlng)\n\t\t\t\t);\n\t\t\t\tstart = next;\n\t\t\t}\n\t\t\treturn array;\n\t\t}, []);\n\n\t\treturn coords;\n\t},\n\n\t/*\n\t * Finds a data entry for a given x-coordinate of the diagram\n\t */\n\t_findIndexForXCoord: function(x) {\n\t\treturn d3\n\t\t\t.bisector(d => d[this.options.xAttr])\n\t\t\t.left(this._data || [0, 1], this._x.invert(x));\n\t},\n\n\t/*\n\t * Finds a data entry for a given latlng of the map\n\t */\n\t_findIndexForLatLng: function(latlng) {\n\t\tlet result = null;\n\t\tlet d = Infinity;\n\t\tthis._data.forEach((item, index) => {\n\t\t\tlet dist = latlng.distanceTo(item.latlng);\n\t\t\tif (dist < d) {\n\t\t\t\td = dist;\n\t\t\t\tresult = index;\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t},\n\n\t/*\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\n\t */\n\t_resetDrag: function() {\n\t\tif (this._chart.panes.brush.select(\".selection\").attr('width')) {\n\t\t\tthis._chart.panes.brush.call(this._brush.clear);\n\t\t\tthis._hideDiagramIndicator();\n\t\t\tthis.fire('reset_drag');\n\t\t}\n\t},\n\n\t_resetZoom: function() {\n\t\tif (this._zoom) {\n\t\t\tthis._zoom.transform(this._chart.svg, d3.zoomIdentity);\n\t\t}\n\t},\n\n\t/**\n\t * Display distance and altitude level (\"focus-rect\").\n\t */\n\t_showDiagramIndicator: function(item, xCoordinate) {\n\t\tlet opts = this.options;\n\t\tlet yCoordinate = this._y(item[opts.yAttr]);\n\n\t\tthis._focusG.attr(\"display\", null);\n\n\t\tthis._focusline.call(\n\t\t\tD3.MouseFocusLine({\n\t\t\t\txCoord: xCoordinate,\n\t\t\t\theight: this._height()\n\t\t\t})\n\t\t);\n\t\tthis._focuslabel.call(\n\t\t\tD3.MouseFocusLabel({\n\t\t\t\txCoord: xCoordinate,\n\t\t\t\tyCoord: yCoordinate,\n\t\t\t\theight: this._height(),\n\t\t\t\twidth : this._width(),\n\t\t\t\tlabelX: d3.format(\".\"+ opts.decimalsX +\"f\")(item[opts.xAttr]) + \" \" + this._xLabel,\n\t\t\t\tlabelY: d3.format(\".\"+ opts.decimalsY +\"f\")(item[opts.yAttr]) + \" \" + this._yLabel\n\t\t\t})\n\t\t);\n\n\t\t// this._focuslabel.selectAll('tspan').data(Object.values(this._focuslabels));\n\n\t\tlet labels = this._props.focusLabels;\n\t\tlet tooltip = this._focuslabel.select('text');\n\t\tlet label;\n\n\t\tfor (var i in labels) {\n\t\t\tlabel = tooltip.select(\".mouse-focus-label-\" + labels[i].name);\n\n\t\t\tif (!label.size()) {\n\t\t\t\tlabel = tooltip.append(\"svg:tspan\", \".mouse-focus-label-x\")\n\t\t\t\t\t.attr(\"class\", \"mouse-focus-label-\" + labels[i].name)\n\t\t\t\t\t.attr(\"dy\", \"1.5em\");\n\t\t\t}\n\n\t\t\tlabel.text(typeof labels[i].value !== \"function\" ? labels[i].value : labels[i].value(item) );\n\n\t\t\tthis._focuslabel.select('.mouse-focus-label-x')\n\t\t\t\t.attr(\"dy\", \"1.5em\");\n\t\t}\n\n\t},\n\n\t_hideDiagramIndicator: function() {\n\t\tthis._focusG.attr(\"display\", 'none');\n\t},\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Marker = L.Class.extend({\n\n\tinitialize: function(options) {\n\t\tthis.options = options;\n\n\t\tif (this.options.imperial) {\n\t\t\tthis._xLabel = \"mi\";\n\t\t\tthis._yLabel = \"ft\";\n\t\t} else {\n\t\t\tthis._xLabel = this.options.xLabel;\n\t\t\tthis._yLabel = this.options.yLabel;\n\t\t}\n\n\t\tif (this.options.marker == 'elevation-line') {\n\t\t\t// this._container = d3.create(\"g\").attr(\"class\", \"height-focus-group\");\n\t\t\tthis._focusline = d3.create('svg:line');\n\t\t\tthis._focusmarker = d3.create(\"svg:circle\");\n\t\t\tthis._focuslabel = d3.create(\"svg:text\");\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\t// this._marker = L.circleMarker([0, 0], { pane: 'overlayPane', radius: 6, fillColor: '#fff', fillOpacity:1, color: '#000', weight:1, interactive: false });\n\t\t\tthis._marker = L.marker([0, 0], { icon: this.options.markerIcon, zIndexOffset: 1000000, interactive: false });\n\t\t}\n\n\t\tthis._focuslabels = {};\n\n\t\treturn this;\n\t},\n\n\taddTo: function(map) {\n\t\tthis._map = map;\n\t\tif (this.options.marker == 'elevation-line') {\n\t\t\tlet g = this._container = d3.select(map.getPane('elevationPane')).select(\"svg > g\")\n\t\t\t\t.attr(\"class\", \"height-focus-group\");\n\t\t\tg.append(() => this._focusline.node());\n\t\t\tg.append(() => this._focusmarker.node());\n\t\t\tg.append(() => this._focuslabel.node());\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\tthis._marker.addTo(map, { pane: 'overlayPane' });\n\t\t}\n\t\treturn this;\n\t},\n\n\t/**\n\t * Update position marker (\"leaflet-marker\").\n\t */\n\tupdate: function(props) {\n\t\tif (props) this._props = props;\n\t\telse props = this._props;\n\n\t\tif(!props) return;\n\n\t\tif (props.options) this.options = props.options;\n\t\tif (!this._map) this.addTo(props.map);\n\n\t\tlet opts = this.options;\n\t\tlet map = this._map;\n\n\t\tthis._latlng = props.item.latlng;\n\n\t\tlet pos = map.latLngToLayerPoint(this._latlng);\n\n\t\tif (map._rotate) {\n\t\t\tpos = map.rotatedPointToMapPanePoint(pos);\n\t\t}\n\n\t\tlet point = L.extend({}, props.item, pos);\n\n\t\tif (this.options.marker == 'elevation-line') {\n\n\t\t\tlet normalizedAlt = this._height() / props.maxElevation * point.z;\n\t\t\tlet normalizedY = point.y - normalizedAlt;\n\n\t\t\tthis._container.classed(\"leaflet-hidden\", false);\n\n\t\t\tthis._focusmarker\n\t\t\t\t.call(\n\t\t\t\t\tD3.HeightFocusMarker({\n\t\t\t\t\t\ttheme : opts.theme,\n\t\t\t\t\t\txCoord: point.x,\n\t\t\t\t\t\tyCoord: point.y,\n\t\t\t\t\t}));\n\n\t\t\tthis._focusline\n\t\t\t\t.call(\n\t\t\t\t\tD3.HeightFocusLine({\n\t\t\t\t\t\ttheme : opts.theme,\n\t\t\t\t\t\txCoord: point.x,\n\t\t\t\t\t\tyCoord: point.y,\n\t\t\t\t\t\tlength: normalizedY\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\tthis._focuslabel\n\t\t\t\t.call(\n\t\t\t\t\tD3.HeightFocusLabel({\n\t\t\t\t\t\ttheme : opts.theme,\n\t\t\t\t\t\txCoord: point.x,\n\t\t\t\t\t\tyCoord: normalizedY,\n\t\t\t\t\t\tlabel : d3.format(\".\" + opts.decimalsY + \"f\")(point[opts.yAttr]) + \" \" + this._yLabel\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\tlet labels = this._focuslabels;\n\t\t\tlet tooltip = this._focuslabel;\n\t\t\tlet label;\n\n\t\t\tfor (var i in labels) {\n\t\t\t\tlabel = tooltip.select(\".height-focus-\" + labels[i].name);\n\n\t\t\t\tif (!label.size()) {\n\t\t\t\t\tlabel = tooltip.append(\"svg:tspan\")\n\t\t\t\t\t\t.attr(\"class\", \"height-focus-\" + labels[i].name)\n\t\t\t\t\t\t.attr(\"dy\", \"1.5em\");\n\t\t\t\t}\n\n\t\t\t\tlabel.text(typeof labels[i].value !== \"function\" ? labels[i].value : labels[i].value(props.item) );\n\n\t\t\t\tthis._focuslabel.select('.height-focus-y')\n\t\t\t\t\t.attr(\"dy\", \"-1.5em\");\n\t\t\t}\n\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\t_.removeClass(this._marker.getElement(), 'leaflet-hidden');\n\t\t\tthis._marker.setLatLng(this._latlng);\n\t\t}\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\tremove: function() {\n\t\tthis._props = null;\n\t\tif (this.options.marker == 'elevation-line') {\n\t\t\tif (this._container) this._container.classed(\"leaflet-hidden\", true);\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\t_.addClass(this._marker.getElement(), 'leaflet-hidden');\n\t\t}\n\t},\n\n\tgetLatLng: function() {\n\t\treturn this._latlng;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\tlet opts = this.options;\n\t\treturn opts.height - opts.margins.top - opts.margins.bottom;\n\t},\n\n\t_registerFocusLabel: function(props) {\n\t\tthis._focuslabels[props.name] = props;\n\t}\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Summary = L.Class.extend({\n\tinitialize: function(opts, control) {\n\t\tthis.options = opts;\n\t\tthis.control = control;\n\n\t\tlet summary = this._container = _.create(\"div\", \"elevation-summary \" + (opts.summary ? opts.summary + \"-summary\" : ''));\n\t\t_.style(summary, 'max-width', opts.width ? opts.width + 'px' : '');\n\t},\n\n\trender: function() {\n\t\treturn container => container.append(() => this._container);\n\t},\n\n\treset: function() {\n\t\tthis._container.innerHTML = '';\n\t},\n\n\tappend: function(className, label, value) {\n\t\tthis._container.innerHTML += `<span class=\"${className}\"><span class=\"summarylabel\">${label}</span><span class=\"summaryvalue\">${value}</span></span>`;\n\t\treturn this;\n\t},\n\n\t_registerSummary: function(data) {\n\t\tfor (let i in data) {\n\t\t\tthis.append(i, L._(data[i].label), typeof data[i].value !== \"function\" ? data[i].value : data[i].value(this.control.track_info));\n\t\t}\n\t}\n\n});\n","import * as _ from './utils';\n\nexport var Options = {\n\tautofitBounds: true,\n\tautohide: !L.Browser.mobile,\n\tautohideMarker: true,\n\talmostover: true,\n\taltitude: true,\n\tcollapsed: false,\n\tdetached: true,\n\tdistance: true,\n\tdistanceFactor: 1,\n\tdistanceMarkers: false,\n\tdecimalsX: 2,\n\tdecimalsY: 0,\n\tdragging: !L.Browser.mobile,\n\tdownloadLink: 'link',\n\televationDiv: \"#elevation-div\",\n\tfollowMarker: true,\n\tforceAxisBounds: false,\n\tgpxOptions: {\n\t\tasync: true,\n\t\tmarker_options: {\n\t\t\tstartIconUrl: null,\n\t\t\tendIconUrl: null,\n\t\t\tshadowUrl: null,\n\t\t\twptIcons: {\n\t\t\t\t'': L.divIcon({\n\t\t\t\t\tclassName: 'elevation-waypoint-marker',\n\t\t\t\t\thtml: '<i class=\"elevation-waypoint-icon\"></i>',\n\t\t\t\t\ticonSize: [30, 30],\n\t\t\t\t\ticonAnchor: [8, 30],\n\t\t\t\t})\n\t\t\t},\n\t\t},\n\t},\n\theight: 200,\n\theightFactor: 1,\n\timperial: false,\n\tinterpolation: \"curveLinear\",\n\tlazyLoadJS: true,\n\tlegend: true,\n\tloadData: {\n\t\tdefer: false,\n\t\tlazy: false,\n\t},\n\tmargins: {\n\t\ttop: 30,\n\t\tright: 30,\n\t\tbottom: 30,\n\t\tleft: 40\n\t},\n\tmarker: 'elevation-line',\n\tmarkerIcon: L.divIcon({\n\t\tclassName: 'elevation-position-marker',\n\t\thtml: '<i class=\"elevation-position-icon\"></i>',\n\t\ticonSize: [32, 32],\n\t\ticonAnchor: [16, 16],\n\t}),\n\tplaceholder: false,\n\tposition: \"topright\",\n\tpolyline: {\n\t\tclassName: 'elevation-polyline',\n\t\tcolor: '#000',\n\t\topacity: 0.75,\n\t\tweight: 5,\n\t\tlineCap: 'round'\n\t},\n\tpolylineSegments: {\n\t\tclassName: 'elevation-polyline-segments',\n\t\tcolor: '#F00',\n\t\tinteractive: false,\n\t},\n\tpreferCanvas: false,\n\treverseCoords: false,\n\truler: true,\n\tskipNullZCoords: false,\n\ttheme: \"lightblue-theme\",\n\tresponsive: true,\n\tsummary: 'inline',\n\tslope: false,\n\tspeed: false,\n\tsLimit: undefined,\n\ttime: false,\n\ttimeFactor: 3600,\n\ttimeFormat: false,\n\tsDeltaMax: undefined,\n\tsInterpolation: \"curveStepAfter\",\n\tsRange: undefined,\n\twidth: 600,\n\txAttr: \"dist\",\n\txLabel: \"km\",\n\txTicks: undefined,\n\tyAttr: \"z\",\n\tyAxisMax: undefined,\n\tyAxisMin: undefined,\n\tyLabel: \"m\",\n\tyTicks: undefined,\n\tzFollow: false,\n\tzooming: !L.Browser.Mobile,\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Chart } from './chart';\nimport { Marker } from './marker';\nimport { Summary } from './summary';\nimport { Options } from './options';\n\nexport const Elevation = L.Control.Elevation = L.Control.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\toptions: Options,\n\t__mileFactor: 0.621371,\n\t__footFactor: 3.28084,\n\t__D3: 'https://unpkg.com/d3@6.5.0/dist/d3.min.js',\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@4.3.0/dist/togeojson.umd.js',\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\n\t__LDISTANCEM: 'https://unpkg.com/@raruto/leaflet-elevation@1.6.8/libs/leaflet-distance-marker.min.js',\n\n\t/*\n\t * Add data to the diagram either from GPX or GeoJSON and update the axis domain and data\n\t */\n\taddData: function(d, layer) {\n\t\tif ((typeof layer === \"undefined\" || layer === null) && d.on) {\n\t\t\tlayer = d;\n\t\t}\n\t\tElevation._d3LazyLoader = _.lazyLoader(\n\t\t\tthis.__D3,\n\t\t\ttypeof d3 !== 'object' || !this.options.lazyLoadJS,\n\t\t\tElevation._d3LazyLoader\n\t\t).then(() => {\n\t\t\tthis._addData(d);\n\t\t\tthis._addLayer(layer);\n\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\n\t\t});\n\t},\n\n\t/**\n\t * Adds the control to the given map.\n\t */\n\taddTo: function(map) {\n\t\tif (this.options.detached) {\n\t\t\tlet eleDiv = this._initElevationDiv();\n\t\t\tif (!eleDiv.isConnected) _.insert(map.getContainer(), eleDiv, 'afterend');\n\t\t\t_.append(eleDiv, this.onAdd(map));\n\t\t} else {\n\t\t\tL.Control.prototype.addTo.call(this, map);\n\t\t}\n\t\treturn this;\n\t},\n\n\t/*\n\t * Reset data and display\n\t */\n\tclear: function() {\n\t\tif (this._marker) this._marker.remove();\n\t\tif (this._chart) this._chart.clear();\n\t\tif (this._layers) this._layers.clearLayers();\n\n\t\tthis._data = [];\n\t\tthis.track_info = {};\n\n\t\tthis._fireEvt(\"eledata_clear\");\n\t},\n\n\t/**\n\t * Disable chart brushing.\n\t */\n\tdisableBrush: function() {\n\t\tthis._chart._brushEnabled = false;\n\t\tthis._resetDrag();\n\t},\n\n\t/**\n\t * Enable chart brushing.\n\t */\n\tenableBrush: function() {\n\t\tthis._chart._brushEnabled = true;\n\t},\n\n\t/**\n\t * Alias for enableBrush\n\t */\n\tenableDragging: function() {\n\t\tthis.enableBrushing();\n\t},\n\n\t/**\n\t * Alias for disableBrush\n\t */\n\tdisableDragging: function() {\n\t\tthis.disableBrushing();\n\t},\n\n\t/**\n\t * Disable chart zooming.\n\t */\n\tdisableZoom: function() {\n\t\tthis._chart._zoomEnabled = false;\n\t\tthis._chart._resetZoom();\n\t},\n\n\t/**\n\t * Enable chart zooming.\n\t */\n\tenableZoom: function() {\n\t\tthis._chart._zoomEnabled = true;\n\t},\n\n\t/**\n\t * Sets a map view that contains the given geographical bounds.\n\t */\n\tfitBounds: function(bounds) {\n\t\tbounds = bounds || this.getBounds();\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\n\t},\n\n\tgetBounds: function(data) {\n\t\tdata = data || this._data;\n\t\treturn L.latLngBounds(data.map((d) => d.latlng));\n\t},\n\n\t/**\n\t * Get default zoom level when \"followMarker\" is true.\n\t */\n\tgetZFollow: function() {\n\t\treturn this._zFollow;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\thide: function() {\n\t\t_.style(this._container, \"display\", \"none\");\n\t},\n\n\t/**\n\t * Initialize chart control \"options\" and \"container\".\n\t */\n\tinitialize: function(options) {\n\t\tthis._data = [];\n\t\tthis._layers = L.featureGroup();\n\t\tthis._markedSegments = L.polyline([]);\n\t\tthis._chartEnabled = true,\n\n\t\tthis.track_info = {};\n\n\t\tthis.options = _.deepMerge({}, this.options, options);\n\n\t\tthis._zFollow = this.options.zFollow;\n\n\t\tif (this.options.followMarker) this._setMapView = L.Util.throttle(this._setMapView, 300, this);\n\t\tif (this.options.placeholder) this.options.loadData.lazy = this.options.loadData.defer = true;\n\n\t\tif (this.options.legend) this.options.margins.bottom += 30;\n\n\t\tif (this.options.theme) this.options.polylineSegments.className += ' ' + this.options.theme;\n\n\t\tthis._markedSegments.setStyle(this.options.polylineSegments);\n\n\t\t// this._resizeChart = _.debounce(this._resizeChart, 300, this);\n\t\t// this._resizeChart = L.Util.throttle(this._resizeChart, 300, this);\n\n\t\t// if (L.Browser.mobile) {\n\t\t// \tthis._updateChart = _.debounce(this._updateChart, 300, this);\n\t\t// \tthis._updateSummary = _.debounce(this._updateSummary, 300, this);\n\t\t// }\n\n\t\t// Leaflet canvas renderer colors\n\t\tL.extend(D3.Colors, this.options.colors || {});\n\t},\n\n\t/**\n\t * Alias for loadData\n\t */\n\tload: function(data, opts) {\n\t\tthis.loadData(data, opts);\n\t},\n\n\t/**\n\t * Alias for addTo\n\t */\n\tloadChart: function(map) {\n\t\tthis.addTo(map);\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON or KML).\n\t */\n\tloadData: function(data, opts) {\n\t\topts = L.extend({}, this.options.loadData, opts);\n\t\tif (opts.defer) {\n\t\t\tthis.loadDefer(data, opts);\n\t\t} else if (opts.lazy) {\n\t\t\tthis.loadLazy(data, opts);\n\t\t} else if (_.isXMLDoc(data)) {\n\t\t\tthis.loadXML(data);\n\t\t} else if (_.isJSONDoc(data)) {\n\t\t\tthis.loadGeoJSON(data);\n\t\t} else {\n\t\t\tthis.loadFile(data);\n\t\t}\n\t},\n\n\t/**\n\t * Wait for document load before download data.\n\t */\n\tloadDefer: function(data, opts) {\n\t\topts = L.extend({}, this.options.loadData, opts);\n\t\topts.defer = false;\n\t\t_.deferFunc(L.bind(this.loadData, this, data, opts));\n\t},\n\n\t/**\n\t * Load data from a remote url.\n\t */\n\tloadFile: function(url) {\n\t\tfetch(url)\n\t\t\t.then((response) => response.text())\n\t\t\t.then((data) => {\n\t\t\t\tthis._downloadURL = url; // TODO: handle multiple urls?\n\t\t\t\tthis.loadData(data, { lazy: false, defer: false });\n\t\t\t})\n\t\t\t.catch((err) => console.warn(err));\n\t},\n\n\t/**\n\t * Load raw GeoJSON data.\n\t */\n\tloadGeoJSON: function(data) {\n\t\t_.GeoJSONLoader(data, this);\n\t},\n\n\t/**\n\t * Alias for loadXML\n\t */\n\tloadGPX: function(data){\n\t\tthis.loadXML(data);\n\t},\n\n\t/**\n\t * Load raw XML data.\n\t */\n\tloadXML: function(data) {\n\t\tElevation._togeojsonLazyLoader = _.lazyLoader(\n\t\t\tthis.__TOGEOJSON,\n\t\t\ttypeof toGeoJSON !== 'function' || !this.options.lazyLoadJS,\n\t\t\tElevation._togeojsonLazyLoader\n\t\t).then(\n\t\t\t() => {\n\t\t\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\n\t\t\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\n\t\t\t\tif (!(type in toGeoJSON)) {\n\t\t\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\n\t\t\t\t}\n\t\t\t\tlet geojson = toGeoJSON[type](xml);\n\t\t\t\tlet name = xml.getElementsByTagName('name');\n\t\t\t\tif(name[0]) { geojson.name = name[0].innerHTML; }\n\t\t\t\telse if(this._downloadURL) { geojson.name = this._downloadURL.split('/').pop().split('#')[0].split('?')[0]; }\n\n\t\t\t\treturn this.loadGeoJSON(geojson, this);\n\t\t\t}\n\t\t);\n\t},\n\n\t/**\n\t * Wait for chart container visible before download data.\n\t */\n\tloadLazy: function(data, opts) {\n\t\topts = L.extend({}, this.options.loadData, opts);\n\t\tlet elem = opts.lazy.parentNode ? opts.lazy : this.placeholder;\n\t\t_.waitHolder(elem)\n\t\t\t.then(() => {\n\t\t\t\topts.lazy = false;\n\t\t\t\tthis.loadData(data, opts)\n\t\t\t\tthis.once('eledata_loaded', () => this.placeholder.parentNode.removeChild(elem));\n\t\t\t});\n\t},\n\n\t/**\n\t * Create container DOM element and related event listeners.\n\t * Called on control.addTo(map).\n\t */\n\tonAdd: function(map) {\n\t\tthis._map = map;\n\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control elevation \" + this.options.theme);\n\n\t\tif (!this.options.detached) {\n\t\t\t_.addClass(container, 'leaflet-control');\n\t\t}\n\n\t\tif (this.options.placeholder && !this._data.length) {\n\t\t\tthis.placeholder = _.create('img', 'elevation-placeholder', typeof this.options.placeholder === 'string' ? { src: this.options.placeholder, alt: '' } : this.options.placeholder);\n\t\t\t_.insert(container, this.placeholder, 'afterbegin');\n\t\t}\n\n\t\tElevation._d3LazyLoader = _.lazyLoader(\n\t\t\tthis.__D3,\n\t\t\ttypeof d3 !== 'object' || !this.options.lazyLoadJS,\n\t\t\tElevation._d3LazyLoader\n\t\t).then(() => {\n\t\t\tthis._initButton(container);\n\t\t\tthis._initChart(container);\n\t\t\tthis._initSummary(container);\n\t\t\tthis._initMarker(map);\n\t\t\tthis._initLayer(map);\n\n\t\t\tmap\n\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t\t.on('resize', this._resetView, this)\n\t\t\t\t.on('resize', this._resizeChart, this)\n\t\t\t\t.on('rotate', this._rotateMarker, this)\n\t\t\t\t.on('mousedown', this._resetDrag, this);\n\n\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\n\n\t\t\tthis\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\n\n\t\t\tthis._updateChart();\n\t\t\tthis._updateSummary();\n\t\t});\n\n\t\treturn container;\n\t},\n\n\t/**\n\t * Clean up control code and related event listeners.\n\t * Called on control.remove().\n\t */\n\tonRemove: function(map) {\n\t\tthis._container = null;\n\n\t\tmap\n\t\t\t.off('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t.off('resize', this._resetView, this)\n\t\t\t.off('resize', this._resizeChart, this)\n\t\t\t.off('mousedown', this._resetDrag, this);\n\n\t\t_.off(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t_.off(map.getContainer(), 'touchstart', this._resetDrag, this);\n\n\t\tthis\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\n\t},\n\n\t/**\n\t * Redraws the chart control. Sometimes useful after screen resize.\n\t */\n\tredraw: function() {\n\t\tthis._resizeChart();\n\t},\n\n\t/**\n\t * Set default zoom level when \"followMarker\" is true.\n\t */\n\tsetZFollow: function(zoom) {\n\t\tthis._zFollow = zoom;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\tshow: function() {\n\t\t_.style(this._container, \"display\", \"block\");\n\t},\n\n\t/*\n\t * Parsing data either from GPX or GeoJSON and update the diagram data\n\t */\n\t_addData: function(d) {\n\t\tif (!d) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet geom = d.geometry;\n\t\tif (geom) {\n\t\t\tswitch (geom.type) {\n\t\t\t\tcase 'LineString':\n\t\t\t\t\tthis._addGeoJSONData(geom.coordinates);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'MultiLineString':\n\t\t\t\t\t_.each(geom.coordinates, coords => this._addGeoJSONData(coords));\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn('Unsopperted GeoJSON feature geometry type:' + geom.type);\n\t\t\t}\n\t\t}\n\n\t\tif (d.type === \"FeatureCollection\") {\n\t\t\t_.each(d.features, feature => this._addData(feature));\n\t\t}\n\n\t\tif (d._latlngs) {\n\t\t\tthis._addGPXData(d._latlngs);\n\t\t}\n\t},\n\n\t/*\n\t * Parsing of GeoJSON data lines and their elevation in z-coordinate\n\t */\n\t_addGeoJSONData: function(coords) {\n\t\t_.each(coords, point => {\n\t\t\tthis._addPoint(point[1], point[0], point[2]);\n\t\t\tthis._fireEvt(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\t\t});\n\t\tthis._fireEvt(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\n\t},\n\n\t/*\n\t * Parsing function for GPX data and their elevation in z-coordinate\n\t */\n\t_addGPXData: function(coords) {\n\t\t_.each(coords, point => {\n\t\t\tthis._addPoint(point.lat, point.lng, point.meta.ele);\n\t\t\tthis._fireEvt(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\t\t});\n\t\tthis._fireEvt(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\n\t},\n\n\t/*\n\t * Parse and push a single (x, y, z) point to current elevation profile.\n\t */\n\t_addPoint: function(x, y, z) {\n\t\tif (this.options.reverseCoords) {\n\t\t\t[x, y] = [y, x];\n\t\t}\n\n\t\tthis._data.push({\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t\tz: z,\n\t\t\tlatlng: L.latLng(x, y, z)\n\t\t});\n\n\t\tthis._fireEvt(\"eledata_updated\", { index: this._data.length - 1 });\n\t},\n\n\t_addLayer: function(layer) {\n\t\tif (layer) this._layers.addLayer(layer)\n\t},\n\n\t/**\n\t * Adds the control to the given \"detached\" div.\n\t */\n\t_initElevationDiv: function() {\n\t\tlet eleDiv = _.select(this.options.elevationDiv);\n\t\tif (!eleDiv) {\n\t\t\tthis.options.elevationDiv = '#elevation-div_' + _.randomId();\n\t\t\teleDiv = _.create('div', 'leaflet-control elevation elevation-div', { id: this.options.elevationDiv.substr(1) });\n\t\t}\n\t\tif (this.options.detached) {\n\t\t\t_.replaceClass(eleDiv, 'leaflet-control', 'elevation-detached');\n\t\t}\n\t\tthis.eleDiv = eleDiv;\n\t\treturn this.eleDiv;\n\t},\n\n\t/*\n\t * Collapse current chart control.\n\t */\n\t_collapse: function() {\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\n\t},\n\n\t/*\n\t * Expand current chart control.\n\t */\n\t_expand: function() {\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\n\t},\n\n\t/*\n\t * Finds a data entry for the given LatLng\n\t */\n\t_findItemForLatLng: function(latlng) {\n\t\treturn this._data[this._chart._findIndexForLatLng(latlng)];\n\t},\n\n\t/*\n\t * Finds a data entry for the given xDiagCoord\n\t */\n\t_findItemForX: function(x) {\n\t\treturn this._data[this._chart._findIndexForXCoord(x)];\n\t},\n\n\t/**\n\t * Fires an event of the specified type.\n\t */\n\t_fireEvt: function(type, data, propagate) {\n\t\tif (this.fire) this.fire(type, data, propagate);\n\t\tif (this._map) this._map.fire(type, data, propagate);\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\tif (this._chart) return this._chart._height();\n\t\tlet opts = this.options;\n\t\treturn opts.height - opts.margins.top - opts.margins.bottom;\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\t_hideMarker: function() {\n\t\tif (this.options.autohideMarker) {\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Generate \"svg\" chart DOM element.\n\t */\n\t_initChart: function(container) {\n\t\tlet opts = this.options;\n\n\t\topts.xTicks = this._xTicks();\n\t\topts.yTicks = this._yTicks();\n\n\t\tif (opts.responsive) {\n\t\t\tif (opts.detached) {\n\t\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\n\t\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\n\t\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\n\t\t\t} else {\n\t\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\n\t\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\n\t\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\n\t\t\t}\n\t\t}\n\n\t\tlet chart = this._chart = new Chart(opts, this);\n\n\t\tthis._x = this._chart._x;\n\t\tthis._y = this._chart._y;\n\n\t\td3\n\t\t\t.select(container)\n\t\t\t.call(chart.render())\n\n\t\tchart\n\t\t\t.on('reset_drag', this._hideMarker, this)\n\t\t\t.on('mouse_enter', this._fireEvt.bind('elechart_enter'), this)\n\t\t\t.on('dragged', this._dragendHandler, this)\n\t\t\t.on('mouse_move', this._mousemoveHandler, this)\n\t\t\t.on('mouse_out', this._mouseoutHandler, this)\n\t\t\t.on('ruler_filter', this._rulerFilterHandler, this)\n\t\t\t.on('zoom', this._updateChart, this)\n\t\t\t.on('elepath_toggle', this._toggleChartHandler, this)\n\t\t\t.on('margins_updated',this._resizeChart, this);\n\n\n\t\tthis._fireEvt(\"elechart_axis\");\n\t\tif (this.options.legend) this._fireEvt(\"elechart_legend\");\n\n\t\tthis._fireEvt(\"elechart_init\");\n\t},\n\n\t_initLayer: function() {\n\t\tthis._layers\n\t\t\t.on('layeradd layerremove', (e) => {\n\t\t\t\tlet layer = e.layer\n\t\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, e.type == 'layeradd');\n\t\t\t\t_.toggleEvent(layer, \"mousemove\", this._mousemoveLayerHandler.bind(this), e.type == 'layeradd')\n\t\t\t\t_.toggleEvent(layer, \"mouseout\", this._mouseoutHandler.bind(this), e.type == 'layeradd');\n\t\t\t});\n\t},\n\n\t_initMarker: function(map) {\n\t\tlet pane = map.getPane('elevationPane');\n\t\tif (!pane) {\n\t\t\tpane = this._pane = map.createPane('elevationPane', map.getPane('norotatePane') || map.getPane('mapPane'));\n\t\t\tpane.style.zIndex = 625; // This pane is above markers but below popups.\n\t\t\tpane.style.pointerEvents = 'none';\n\t\t}\n\n\t\tif (this._renderer) this._renderer.remove()\n\t\tthis._renderer = L.svg({ pane: \"elevationPane\" }).addTo(this._map); // default leaflet svg renderer\n\t\tthis._marker = new Marker(this.options);\n\n\t\tthis._fireEvt(\"elechart_marker\");\n\t},\n\n\t/**\n\t * Inspired by L.Control.Layers\n\t */\n\t_initButton: function(container) {\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 (!this.options.detached) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container);\n\t\t\t//.disableScrollPropagation(container);\n\t\t}\n\n\t\tif (L.Browser.mobile) {\n\t\t\t_.on(container, 'click', L.DomEvent.stopPropagation);\n\t\t}\n\n\t\t_.on(container, 'mousewheel', this._mousewheelHandler, this);\n\n\t\tif (!this.options.detached) {\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle elevation-toggle-icon\" + (this.options.autohide ? \"\" : \" close-button\"), { href: '#', title: L._('Elevation') }, container);\n\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tthis._collapse();\n\t\t\t\tif (this.options.autohide) {\n\t\t\t\t\t_.on(container, 'mouseover', this._expand, this);\n\t\t\t\t\t_.on(container, 'mouseout', this._collapse, this);\n\t\t\t\t} else {\n\t\t\t\t\t_.on(link, 'click', L.DomEvent.stop);\n\t\t\t\t\t_.on(link, 'click', this._toggle, this);\n\t\t\t\t}\n\n\t\t\t\t_.on(link, 'focus', this._toggle, this);\n\n\t\t\t\tthis._map.on('click', this._collapse, this);\n\t\t\t\t// TODO: keyboard accessibility\n\t\t\t}\n\t\t} else {\n\t\t\t// TODO: handle autohide when detached=true\n\t\t}\n\t},\n\n\t_initSummary: function(container) {\n\t\tlet summary = this._summary = new Summary({ summary: this.options.summary }, this);\n\n\t\td3\n\t\t\t.select(container)\n\t\t\t.call(summary.render());\n\n\t\tthis.summaryDiv = this._summary._container;\n\t},\n\n\t_dragendHandler: function(e) {\n\t\tthis._hideMarker();\n\t\tthis.fitBounds(L.latLngBounds([e.dragstart.latlng, e.dragend.latlng]));\n\n\t\tthis._fireEvt(\"elechart_dragged\");\n\t},\n\n\t/*\n\t * Handles the moueseover the chart and displays distance and altitude level.\n\t */\n\t_mousemoveHandler: function(e) {\n\t\tif (!this._data.length || !this._chartEnabled) {\n\t\t\treturn;\n\t\t}\n\t\tlet item = this._findItemForX(e.xCoord);\n\n\t\tif (item) {\n\t\t\tlet xCoord = e.xCoord;\n\n\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\n\t\t\tthis._updateMarker(item);\n\t\t\tthis._setMapView(item);\n\n\t\t\tif (this._map) {\n\t\t\t\t_.addClass(this._map.getContainer(), 'elechart-hover');\n\t\t\t}\n\n\t\t\tthis._fireEvt(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\tthis._fireEvt(\"elechart_hover\", { data: item, xCoord: xCoord });\n\t\t}\n\t},\n\n\t/*\n\t * Handles mouseover events of the data layers on the map.\n\t */\n\t_mousemoveLayerHandler: function(e) {\n\t\tif (!this._data.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet item = this._findItemForLatLng(e.latlng);\n\t\tif (item) {\n\t\t\tlet xCoord = item.xDiagCoord;\n\n\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\n\t\t\tthis._updateMarker(item);\n\n\t\t\tthis._fireEvt(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t}\n\t},\n\n\t/*\n\t * Handles the moueseout over the chart.\n\t */\n\t_mouseoutHandler: function() {\n\t\tif (!this.options.detached) {\n\t\t\tthis._hideMarker();\n\t\t\tthis._chart._hideDiagramIndicator();\n\t\t}\n\n\t\tif (this._map) {\n\t\t\t_.removeClass(this._map.getContainer(), 'elechart-hover');\n\t\t}\n\n\t\tthis._fireEvt(\"elechart_leave\");\n\t},\n\n\t/*\n\t * Handles the mouesewheel over the chart.\n\t */\n\t_mousewheelHandler: function(e) {\n\t\tif (this._map.gestureHandling && this._map.gestureHandling._enabled) return;\n\t\tlet ll = this._marker.getLatLng() || this._map.getCenter();\n\t\tlet z = this._map.getZoom() + Math.sign(e.deltaY);\n\t\tthis._resetDrag();\n\t\tthis._map.flyTo(ll, z);\n\t},\n\n\t/**\n\t * Add a waypoint marker to the diagram\n\t */\n\t_registerCheckPoint: function(props) {\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\n\t},\n\n\t/**\n\t * Add chart profile to diagram\n\t */\n\t_registerAreaPath: function(props) {\n\t\tthis.on(\"elechart_init\", () => this._chart._registerAreaPath(props));\n\t},\n\n\t/**\n\t * Add chart grid to diagram\n\t */\n\t_registerAxisGrid: function(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisGrid(props));\n\t},\n\n\t/**\n\t * Add chart axis to diagram\n\t */\n\t_registerAxisScale: function(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisScale(props));\n\t},\n\n\t/**\n\t * Add chart or marker tooltip info\n\t */\n\t_registerFocusLabel: function(props) {\n\t\tif (props.chart) {\n\t\t\tlet label = L.extend({}, props, { value: props.chart });\n\t\t\tthis.on(\"elechart_init\", () => this._chart._registerFocusLabel(label));\n\t\t}\n\t\tif (props.marker) {\n\t\t\tlet label = L.extend({}, props, { value: props.marker });\n\t\t\tthis.on(\"elechart_marker\", () => this._marker._registerFocusLabel(label));\n\t\t}\n\t},\n\n\t/**\n\t * Add summary info to diagram\n\t */\n\t_registerSummary: function(props) {\n\t\tthis.on('elechart_summary', () => this._summary._registerSummary(props));\n\t},\n\n\t/*\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\n\t */\n\t_resetDrag: function() {\n\t\tthis._chart._resetDrag();\n\t\tthis._hideMarker();\n\t},\n\n\t/**\n\t * Resets drag, marker and bounds.\n\t */\n\t_resetView: function() {\n\t\tif (this._map && this._map._isFullscreen) return;\n\t\tthis._resetDrag();\n\t\tthis._hideMarker();\n\t\tif (this.options.autofitBounds) {\n\t\t\tthis.fitBounds();\n\t\t}\n\t},\n\n\t/**\n\t * Hacky way for handling chart resize. Deletes it and redraw chart.\n\t */\n\t_resizeChart: function() {\n\t\t// prevent displaying chart on resize if hidden\n\t\tif (_.style(this._container, \"display\") == \"none\") return;\n\n\t\tlet opts = this.options;\n\n\t\tif (opts.responsive) {\n\t\t\tlet newWidth;\n\t\t\tif (opts.detached) {\n\t\t\t\tnewWidth = (this.eleDiv || this._container).offsetWidth;\n\t\t\t} else {\n\t\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\t\tnewWidth = opts._maxWidth > clientWidth ? clientWidth - 30 : opts._maxWidth;\n\t\t\t}\n\t\t\tif (newWidth) {\n\t\t\t\tlet chart = this._chart;\n\t\t\t\topts.width = newWidth;\n\t\t\t\tif (chart && chart._chart) {\n\t\t\t\t\tchart._chart._resize(opts);\n\t\t\t\t\topts.xTicks = this._xTicks();\n\t\t\t\t\topts.yTicks = this._yTicks();\n\t\t\t\t\tthis._updateChart();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._updateMapSegments();\n\t},\n\n\t/**\n\t * Handles the drag event over the ruler filter.\n\t */\n\t_rulerFilterHandler: function(e) {\n\t\tthis._updateMapSegments(e.coords);\n\t},\n\n\t/**\n\t * Collapse or Expand current chart control.\n\t */\n\t_toggle: function() {\n\t\tif (_.hasClass(this._container, \"elevation-expanded\"))\n\t\t\tthis._collapse();\n\t\telse\n\t\t\tthis._expand();\n\t},\n\n\t/**\n\t * Sets the view of the map (center and zoom). Useful when \"followMarker\" is true.\n\t */\n\t_setMapView: function(item) {\n\t\tif (!this.options.followMarker || !this._map) return;\n\t\tlet zoom = this._map.getZoom();\n\t\tif (\"number\" === typeof this._zFollow) {\n\t\t\tif (zoom < this._zFollow) zoom = this._zFollow;\n\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\n\t\t} else if (!this._map.getBounds().contains(item.latlng)) {\n\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\n\t\t}\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_toggleChartHandler: function(e) {\n\t\tlet { path, name, enabled } = e;\n\n\t\tthis._chartEnabled = this._chart._hasActiveLayers();\n\n\t\t// toggle layer visibility on empty chart\n\t\tthis._layers.eachLayer(layer => {\n\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, this._chartEnabled);\n\t\t\t}\n\t\t);\n\n\t\t// toggle option value (eg. altitude = { 'disabled' || 'disabled' })\n\t\tthis.options[name] = !enabled && this.options[name] == 'disabled' ? 'enabled' : 'disabled';\n\n\t\t// remove marker on empty chart\n\t\tif (!this._chartEnabled) {\n\t\t\tthis._chart._hideDiagramIndicator();\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Calculates [x, y] domain and then update chart.\n\t */\n\t_updateChart: function() {\n\t\tif (!this._data.length || !this._container) return;\n\n\t\tthis._fireEvt(\"elechart_axis\");\n\t\tthis._fireEvt(\"elechart_area\");\n\n\t\tthis._chart.update({ data: this._data, options: this.options });\n\n\t\tthis._x = this._chart._x;\n\t\tthis._y = this._chart._y;\n\n\t\tthis._fireEvt('elechart_updated');\n\t},\n\n\t/*\n\t * Update the position/height indicator marker drawn onto the map\n\t */\n\t_updateMarker: function(item) {\n\t\tif (!this._marker) return;\n\t\tthis._marker.update({\n\t\t\tmap : this._map,\n\t\t\titem : item,\n\t\t\tmaxElevation: this.track_info.elevation_max || 0,\n\t\t\toptions : this.options\n\t\t});\n\t},\n\n\t/**\n\t * Fix marker rotation on rotated maps\n\t */\n\t_rotateMarker: function() {\n\t\tif (!this._marker) return;\n\t\tthis._marker.update();\n\t},\n\n\t/**\n\t * Highlight track segments on the map.\n\t */\n\t_updateMapSegments: function(coords) {\n\t\tthis._markedSegments.setLatLngs(coords || []);\n\t\tif (coords && this._map && !this._map.hasLayer(this._markedSegments)) {\n\t\t\tthis._markedSegments.addTo(this._map);\n\t\t}\n\t},\n\n\t/**\n\t * Update chart summary.\n\t */\n\t_updateSummary: function() {\n\t\tthis._summary.reset();\n\n\t\tif (this.options.summary) {\n\t\t\tthis._fireEvt(\"elechart_summary\");\n\t\t}\n\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\n\t\t\tthis.summaryDiv.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t_.select('.download a', this.summaryDiv).onclick = (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis._fireEvt('eletrack_download', { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) });\n\t\t\t};\n\t\t};\n\t},\n\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\tif (this._chart) return this._chart._width();\n\t\tlet opts = this.options;\n\t\treturn opts.width - opts.margins.left - opts.margins.right;\n\t},\n\n\t/**\n\t * Calculate chart xTicks\n\t */\n\t_xTicks: function() {\n\t\tif (this.__xTicks) this.__xTicks = this.options.xTicks;\n\t\treturn this.__xTicks || Math.round(this._width() / 75);\n\t},\n\n\t/**\n\t * Calculate chart yTicks\n\t */\n\t_yTicks: function() {\n\t\tif (this.__yTicks) this.__yTicks = this.options.yTicks;\n\t\treturn this.__yTicks || Math.round(this._height() / 30);\n\t}\n\n});\n\n/**\n * Attach here some useful elevation hooks.\n */\nElevation.addInitHook(function() {\n\n\tthis.on('waypoint_added', function(e) {\n\t\tlet p = e.point,\n\t\t\tpop = p._popup;\n\t\tif (pop) {\n\t\t\tpop.options.className = 'elevation-popup';\n\t\t}\n\t\tif (pop && pop._content) {\n\t\t\tpop._content = decodeURI(pop._content);\n\t\t\tp.bindTooltip(pop._content, { direction: 'auto', sticky: true, opacity: 1, className: 'elevation-tooltip' }).openTooltip();\n\t\t}\n\t});\n\n\tthis.on(\"eletrack_download\", function(e) {\n\t\tif (e.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: e }));\n\t\t} else if (e.downloadLink == 'link' || e.downloadLink === true) {\n\t\t\te.confirm();\n\t\t}\n\t});\n\n\tthis.on('eledata_loaded', function(e) {\n\t\tlet map = this._map;\n\t\tlet layer = e.layer;\n\t\tif (!map) {\n\t\t\tconsole.warn(\"Undefined elevation map object\");\n\t\t\treturn;\n\t\t}\n\t\tmap.once('layeradd', (e) => this.options.autofitBounds && this.fitBounds(layer.getBounds()));\n\n\t\tif (L.Browser.mobile) {\n\n\t\t\tif (this.options.polyline) layer.addTo(map);\n\n\t\t} else {\n\n\t\t\t// leaflet-geometryutil\n\t\t\tElevation._geomutilLazyLoader = _.lazyLoader(\n\t\t\t\tthis.__LGEOMUTIL,\n\t\t\t\ttypeof L.GeometryUtil !== 'function' || !this.options.lazyLoadJS,\n\t\t\t\tElevation._geomutilLazyLoader\n\t\t\t).then(\n\t\t\t\t() => {\n\n\t\t\t\t\t// leaflet-almostover\n\t\t\t\t\tif (this.options.almostOver) {\n\t\t\t\t\t\tElevation._almostoverLazyLoader = _.lazyLoader(\n\t\t\t\t\t\t\tthis.__LALMOSTOVER,\n\t\t\t\t\t\t\ttypeof L.Handler.AlmostOver !== 'function' || !this.options.lazyLoadJS,\n\t\t\t\t\t\t\tElevation._almostoverLazyLoader\n\t\t\t\t\t\t).then(\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\tmap.addHandler('almostOver',L.Handler.AlmostOver)\n\t\t\t\t\t\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\n\t\t\t\t\t\t\t\t\tmap.almostOver.addLayer(layer);\n\t\t\t\t\t\t\t\t\tmap\n\t\t\t\t\t\t\t\t\t\t.on('almost:move', (e) => this._mousemoveLayerHandler(e))\n\t\t\t\t\t\t\t\t\t\t.on('almost:out', (e) => this._mouseoutHandler(e));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// leaflet-distance-markers\n\t\t\t\t\tif (this.options.distanceMarkers) {\n\t\t\t\t\t\tElevation._distanceMarkersLazyLoader = _.lazyLoader(\n\t\t\t\t\t\t\tthis.__LDISTANCEM,\n\t\t\t\t\t\t\ttypeof L.DistanceMarkers !== 'function' || !this.options.lazyLoadJS,\n\t\t\t\t\t\t\tElevation._distanceMarkersLazyLoader\n\t\t\t\t\t\t).then(() => this.options.polyline && layer.addTo(map));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.options.polyline) layer.addTo(map);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t);\n\t\t}\n\t});\n\n\t// Basic canvas renderer support.\n\tlet oldProto = L.Canvas.prototype._fillStroke;\n\tlet control = this;\n\tL.Canvas.include({\n\t\t_fillStroke: function(ctx, layer) {\n\t\t\tif (control._layers.hasLayer(layer)) {\n\n\t\t\t\tlet theme = control.options.theme.replace('-theme', '');\n\t\t\t\tlet color = D3.Colors[theme] || {};\n\t\t\t\tlet options = layer.options;\n\n\t\t\t\toptions.color = color.line || color.area || theme;\n\t\t\t\toptions.stroke = !!options.color;\n\n\t\t\t\toldProto.call(this, ctx, layer);\n\n\t\t\t\tif (options.stroke && options.weight !== 0) {\n\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\n\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\n\t\t\t\t\tctx.strokeStyle = '#FFF';\n\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\n\t\t\t\t\tctx.stroke();\n\t\t\t\t\tctx.globalCompositeOperation = oldVal;\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\toldProto.call(this, ctx, layer);\n\t\t\t}\n\t\t}\n\t});\n\n\t// Partially fix: https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\n\tthis.on('elechart_init', function() {\n\t\tthis.once('elechart_change elechart_hover', function(e) {\n\t\t\tif (this._chartEnabled) {\n\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t}\n\t\t\tthis._updateMarker(e.data);\n\t\t});\n\t});\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tlet opts = this.options;\n\tlet distance = {};\n\n\tif (this.options.imperial) {\n\t\tthis._distanceFactor = this.__mileFactor;\n\t\tthis._xLabel = \"mi\";\n\t} else {\n\t\tthis._distanceFactor = opts.distanceFactor;\n\t\tthis._xLabel = opts.xLabel;\n\t}\n\n\tthis.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet track = this.track_info;\n\t\tlet dist = track.distance || 0;\n\n\t\tlet curr = data[i].latlng;\n\t\tlet prev = i > 0 ? data[i - 1].latlng : curr;\n\n\t\tlet delta = curr.distanceTo(prev) * this._distanceFactor;\n\n\t\tdist += Math.round(delta / 1000 * 100000) / 100000; // handles floating points calc\n\n\t\tdata[i].dist = dist;\n\n\t\ttrack.distance = dist;\n\t});\n\n\tthis.on(\"elechart_axis\", function() {\n\n\t\tthis._chart._registerAxisGrid({\n\t\t\taxis : \"x\",\n\t\t\tposition : \"bottom\",\n\t\t\tscale : this._chart._x,\n\t\t});\n\n\t});\n\n\tif (this.options.distance != \"summary\") {\n\n\t\tthis.on(\"elechart_axis\", function() {\n\n\t\t\tdistance.x = this._chart._x;\n\t\t\tdistance.label = this._chart._xLabel;\n\n\t\t\tthis._chart._registerAxisScale({\n\t\t\t\taxis : \"x\",\n\t\t\t\tposition: \"bottom\",\n\t\t\t\tscale : distance.x,\n\t\t\t\tlabel : distance.label,\n\t\t\t\tlabelY : 25,\n\t\t\t\tlabelX : () => this._width() + 6,\n\t\t\t\tname : \"distance\",\n\t\t\t});\n\n\t\t});\n\n\t}\n\n\tthis._registerSummary({\n\t\t\"totlen\" : {\n\t\t\tlabel: \"Total Length: \",\n\t\t\tvalue: (track) => (track.distance || 0).toFixed(2) + ' ' + this._xLabel\n\t\t}\n\t});\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tlet opts = this.options;\n\tlet altitude = {};\n\n\tif (opts.imperial) {\n\t\tthis._heightFactor = this.__footFactor;\n\t\tthis._yLabel = \"ft\";\n\t} else {\n\t\tthis._heightFactor = opts.heightFactor;\n\t\tthis._yLabel = opts.yLabel;\n\t}\n\n\tthis.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\t\tlet z = data[i].z * this._heightFactor;\n\n\t\tlet track = this.track_info;\n\t\tlet eleMax = track.elevation_max || -Infinity;\n\t\tlet eleMin = track.elevation_min || +Infinity;\n\n\t\t// check and fix missing elevation data on last added point\n\t\tif (!this.options.skipNullZCoords && i > 0) {\n\t\t\tlet prevZ = data[i - 1].z;\n\t\t\tif (isNaN(prevZ)) {\n\t\t\t\tlet lastZ = this._lastValidZ;\n\t\t\t\tlet currZ = z;\n\t\t\t\tif (!isNaN(lastZ) && !isNaN(currZ)) {\n\t\t\t\t\tprevZ = (lastZ + currZ) / 2;\n\t\t\t\t} else if (!isNaN(lastZ)) {\n\t\t\t\t\tprevZ = lastZ;\n\t\t\t\t} else if (!isNaN(currZ)) {\n\t\t\t\t\tprevZ = currZ;\n\t\t\t\t}\n\t\t\t\tif (!isNaN(prevZ)) return data.splice(i - 1, 1);\n\t\t\t\tdata[i - 1].z = prevZ;\n\t\t\t}\n\t\t}\n\t\t// skip point if it has not elevation\n\t\tif (!isNaN(z)) {\n\t\t\teleMax = eleMax < z ? z : eleMax;\n\t\t\teleMin = eleMin > z ? z : eleMin;\n\t\t\tthis._lastValidZ = z;\n\t\t}\n\n\t\tdata[i].z = z;\n\n\t\ttrack.elevation_max = eleMax;\n\t\ttrack.elevation_min = eleMin;\n\t});\n\n\tthis.on(\"elechart_axis\", function() {\n\n\t\tthis._chart._registerAxisGrid({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"left\",\n\t\t\tscale : this._chart._y,\n\t\t});\n\n\t});\n\n\tif (this.options.altitude != \"summary\") {\n\n\t\tthis.on(\"elechart_axis\", function() {\n\n\t\t\taltitude.y = this._chart._y;\n\t\t\taltitude.label = this._yLabel;\n\n\t\t\tthis._chart._registerAxisScale({\n\t\t\t\taxis : \"y\",\n\t\t\t\tposition: \"left\",\n\t\t\t\tscale : altitude.y,\n\t\t\t\tlabel : altitude.label,\n\t\t\t\tlabelX : -3,\n\t\t\t\tlabelY : -8,\n\t\t\t\tname : \"altitude\",\n\t\t\t});\n\n\t\t});\n\n\t\tthis.on(\"elechart_init\", function() {\n\n\t\t\tlet theme = this.options.theme.replace('-theme', '');\n\t\t\tlet color = D3.Colors[theme] || {};\n\t\t\tlet alpha = (this.options.detached ? (color.alpha || '0.8') : 1);\n\t\t\tlet stroke = (this.options.detached ? color.stroke : false);\n\n\t\t\tthis._chart._registerAreaPath({\n\t\t\t\tname : 'altitude',\n\t\t\t\tlabel : 'Altitude',\n\t\t\t\tscaleX : 'distance',\n\t\t\t\tscaleY : 'altitude',\n\t\t\t\tcolor : color.area || theme,\n\t\t\t\tstrokeColor : stroke || '#000',\n\t\t\t\tstrokeOpacity: \"1\",\n\t\t\t\tfillOpacity : alpha,\n\t\t\t\tpreferCanvas : this.options.preferCanvas,\n\t\t\t});\n\n\t\t});\n\n\t}\n\n\tthis._registerSummary({\n\t\t\"maxele\" : {\n\t\t\tlabel: \"Max Elevation: \",\n\t\t\tvalue: (track) => (track.elevation_max || 0).toFixed(2) + ' ' + this._yLabel\n\t\t},\n\t\t\"minele\" : {\n\t\t\tlabel: \"Min Elevation: \",\n\t\t\tvalue: (track) => (track.elevation_min || 0).toFixed(2) + ' ' + this._yLabel\n\t\t},\n\t});\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tlet opts = this.options;\n\tlet time = {};\n\n\ttime.label = opts.timeLabel || 't';\n\tthis._timeFactor = opts.timeFactor;\n\n\t/**\n\t * Common AVG speeds:\n\t * ----------------------\n\t * slow walk = 1.8 km/h\n\t * walking = 3.6 km/h\n\t * running = 10.8 km/h\n\t * cycling = 18 km/h\n\t * driving = 72 km/h\n\t * ----------------------\n\t */\n\tthis._timeAVGSpeed = (opts.timeAVGSpeed || 3.6) * (opts.speedFactor || 1);\n\n\tif (!opts.timeFormat) {\n\t\topts.timeFormat = (time) => (new Date(time)).toLocaleString().replaceAll('/', '-').replaceAll(',', ' ');\n\t} else if (opts.timeFormat == 'time') {\n\t\topts.timeFormat = (time) => (new Date(time)).toLocaleTimeString();\n\t} else if (opts.timeFormat == 'date') {\n\t\topts.timeFormat = (time) => (new Date(time)).toLocaleDateString();\n\t}\n\n\topts.xTimeFormat = opts.xTimeFormat || ((t) => _.formatTime(t).split(\"'\")[0]);\n\n\tif (opts.time && opts.time != \"summary\" && !L.Browser.mobile) {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"x\",\n\t\t\tposition : \"top\",\n\t\t\tscale : {\n\t\t\t\tattr : \"duration\",\n\t\t\t\tmin : 0,\n\t\t\t},\n\t\t\tlabel : time.label,\n\t\t\tlabelY : -10,\n\t\t\tlabelX : () => this._width(),\n\t\t\tname : \"time\",\n\t\t\ttickFormat : (d) => (d == 0 ? '' : opts.xTimeFormat(d)),\n\t\t\tonAxisMount: axis => {\n\t\t\t\taxis.select(\".domain\")\n\t\t\t\t\t.remove();\n\t\t\t\taxis.selectAll(\"text\")\n\t\t\t\t\t.attr('opacity', 0.65)\n\t\t\t\t\t.style('font-family', 'Monospace')\n\t\t\t\t\t.style('font-size', '110%');\n\t\t\t\taxis.selectAll(\".tick line\")\n\t\t\t\t\t.attr('y2', this._height())\n\t\t\t\t\t.attr('stroke-dasharray', 2)\n\t\t\t\t\t.attr('opacity', 0.75);\n\t\t\t\t}\n\t\t});\n\n\t}\n\n\tthis.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\t// Add missing timestamps (see: options.timeAVGSpeed)\n\t\tif (!e.point.meta || !e.point.meta.time) {\n\t\t\te.point.meta = e.point.meta || {};\n\t\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist);\n\t\t\tlet speed = this._timeAVGSpeed;\n\t\t\te.point.meta.time = new Date(\n\t\t\t\t(\n\t\t\t\t\ti > 0\n\t\t\t\t\t\t? data[i - 1].time.getTime() + ((( delta / speed) * this._timeFactor) * 1000)\n\t\t\t\t\t\t: Date.now()\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tlet time = e.point.meta.time;\n\n\t\t// Handle timezone offset\n\t\tif (time.getTime() - time.getTimezoneOffset() * 60 * 1000 === 0) {\n\t\t\ttime = 0;\n\t\t}\n\n\t\tlet currT = time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = Math.abs(currT - prevT);\n\t\tlet duration = (this.track_info.time || 0) + deltaT;\n\n\t\tdata[i].time = time;\n\t\tdata[i].duration = duration;\n\n\t\tthis.track_info.time = duration;\n\t});\n\n\tif (this.options.time) {\n\n\t\tthis._registerFocusLabel({\n\t\t\tname: 'time',\n\t\t\tchart: (item) => this.options.timeFormat(item.time)\n\t\t});\n\n\t\tthis._registerSummary({\n\t\t\t\"tottime\" : {\n\t\t\t\tlabel: \"Total Time: \",\n\t\t\t\tvalue: (track) => _.formatTime(track.time || 0)\n\t\t\t}\n\t\t});\n\n\t}\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tif (!this.options.slope) return;\n\n\tlet opts = this.options;\n\tlet slope = {};\n\n\tslope.label = opts.slopeLabel || '%';\n\n\tif (this.options.slope != \"summary\") {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"right\",\n\t\t\tscale : {\n\t\t\t\tmin : -1,\n\t\t\t\tmax : +1,\n\t\t\t},\n\t\t\ttickPadding: 16,\n\t\t\tlabel : slope.label,\n\t\t\tlabelX : 25,\n\t\t\tlabelY : -8,\n\t\t\tname : 'slope'\n\t\t});\n\n\t\tthis._registerAreaPath({\n\t\t\tname : 'slope',\n\t\t\tlabel : 'Slope',\n\t\t\tyAttr : 'slope',\n\t\t\tscaleX : 'distance',\n\t\t\tscaleY : 'slope',\n\t\t\tcolor : '#F00',\n\t\t\tstrokeColor : '#000',\n\t\t\tstrokeOpacity: \"0.5\",\n\t\t\tfillOpacity : \"0.25\",\n\t\t});\n\n\t}\n\n\tthis.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\t\tlet z = data[i].z;\n\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist) * 1000;\n\n\t\t// Slope / Gain\n\t\tlet track = this.track_info;\n\t\tlet tAsc = track.ascent || 0; // Total Ascent\n\t\tlet tDes = track.descent || 0; // Total Descent\n\t\tlet sMax = track.slope_max || 0; // Slope Max\n\t\tlet sMin = track.slope_min || 0; // Slope Min\n\t\tlet slope = 0;\n\n\t\tif (!isNaN(z)) {\n\t\t\tlet deltaZ = i > 0 ? z - data[i - 1].z : 0;\n\t\t\tif (deltaZ > 0) tAsc += deltaZ;\n\t\t\telse if (deltaZ < 0) tDes -= deltaZ;\n\t\t\t// slope in % = ( height / length ) * 100\n\t\t\tif (delta !== 0) slope = (deltaZ / delta) * 100;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" slope values.\n\t\tif (this.options.sDeltaMax) {\n\t\t\tlet deltaS = i > 0 ? slope - data[i - 1].slope : 0;\n\t\t\tlet maxDeltaS = this.options.sDeltaMax;\n\t\t\tif (Math.abs(deltaS) > maxDeltaS) {\n\t\t\t\tslope = data[i - 1].slope + maxDeltaS * Math.sign(deltaS);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable slope values.\n\t\tif (this.options.sRange) {\n\t\t\tlet range = this.options.sRange;\n\t\t\tif (slope < range[0]) slope = range[0];\n\t\t\telse if (slope > range[1]) slope = range[1];\n\t\t}\n\n\t\tslope = L.Util.formatNum(slope, 2);\n\n\t\tif (slope > sMax) sMax = slope;\n\t\tif (slope < sMin) sMin = slope;\n\n\t\tdata[i].slope = slope;\n\n\t\ttrack.ascent = tAsc;\n\t\ttrack.descent = tDes;\n\t\ttrack.slope_max = sMax;\n\t\ttrack.slope_min = sMin;\n\t});\n\n\tthis._registerFocusLabel({\n\t\tname: 'slope',\n\t\tchart: (item) => item.slope + slope.label,\n\t\tmarker: (item) => Math.round(item.slope) + slope.label\n\t});\n\n\tthis._registerSummary({\n\t\t\"ascent\" : {\n\t\t\tlabel: \"Total Ascent: \",\n\t\t\tvalue: (track) => Math.round(track.ascent || 0) + ' ' + this._yLabel\n\t\t},\n\t\t\"descent\" : {\n\t\t\tlabel: \"Total Descent: \",\n\t\t\tvalue: (track) => Math.round(track.descent || 0) + ' ' + this._yLabel\n\t\t},\n\t\t\"minslope\": {\n\t\t\tlabel: \"Min Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_min || 0) + ' ' + slope.label\n\t\t},\n\t\t\"maxslope\": {\n\t\t\tlabel: \"Max Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_max || 0) + ' ' + slope.label\n\t\t}\n\t});\n\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tif (!this.options.speed && !this.options.acceleration) return;\n\n\tlet opts = this.options;\n\tlet speed = {};\n\n\tspeed.label = opts.speedLabel || L._(this.options.imperial ? 'mph' : 'km/h');\n\tthis._speedFactor = opts.speedFactor || 1;\n\n\tif (this.options.speed && this.options.speed != \"summary\") {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"right\",\n\t\t\tscale : {\n\t\t\t\tmin : 0,\n\t\t\t\tmax : +1,\n\t\t\t},\n\t\t\ttickPadding: 16,\n\t\t\tlabel : speed.label,\n\t\t\tlabelX : 25,\n\t\t\tlabelY : -8,\n\t\t\tname : \"speed\"\n\t\t});\n\n\t\tthis._registerAreaPath({\n\t\t\tname : 'speed',\n\t\t\tlabel : 'Speed',\n\t\t\tyAttr : \"speed\",\n\t\t\tscaleX : 'distance',\n\t\t\tscaleY : 'speed',\n\t\t\tcolor : '#03ffff',\n\t\t\tstrokeColor : '#000',\n\t\t\tstrokeOpacity: \"0.5\",\n\t\t\tfillOpacity : \"0.25\",\n\t\t});\n\n\t}\n\n\tthis.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet currT = data[i].time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = currT - prevT;\n\n\t\tlet track = this.track_info;\n\t\tlet sMax = track.speed_max || -Infinity; // Speed Max\n\t\tlet sMin = track.speed_min || +Infinity; // Speed Min\n\t\tlet sAvg = track.speed_avg || 0; // Speed Avg\n\t\tlet speed = 0;\n\n\t\tif (deltaT > 0) {\n\t\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist) * 1000;\n\t\t\tspeed = Math.abs((delta / deltaT) * this._timeFactor) * this._speedFactor;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" speed values.\n\t\tif (this.options.speedDeltaMax) {\n\t\t\tlet deltaS = i > 0 ? speed - data[i - 1].speed : 0;\n\t\t\tlet maxDeltaS = this.options.speedDeltaMax;\n\t\t\tif (Math.abs(deltaS) > maxDeltaS) {\n\t\t\t\tspeed = data[i - 1].speed + maxDeltaS * Math.sign(deltaS);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable speed values.\n\t\tif (this.options.speedRange) {\n\t\t\tlet range = this.options.speedRange;\n\t\t\tif (speed < range[0]) speed = range[0];\n\t\t\telse if (speed > range[1]) speed = range[1];\n\t\t}\n\n\t\tspeed = L.Util.formatNum(speed, 2);\n\n\t\tsMax = speed > sMax ? speed : sMax;\n\t\tsMin = speed < sMin ? speed : sMin;\n\t\tsAvg = (speed + sAvg) / 2.0;\n\n\t\tdata[i].speed = speed;\n\n\t\ttrack.speed_max = sMax;\n\t\ttrack.speed_min = sMin;\n\t\ttrack.speed_avg = sAvg;\n\t});\n\n\tif (this.options.speed) {\n\n\t\tthis._registerFocusLabel({\n\t\t\tname: 'speed',\n\t\t\tchart: (item) => item.speed + \" \" + speed.label,\n\t\t\tmarker: (item) => Math.round(item.speed) + \" \" + speed.label\n\t\t});\n\n\t\tthis._registerSummary({\n\t\t\t\"minspeed\" : {\n\t\t\t\tlabel: \"Min Speed: \",\n\t\t\t\tvalue: (track) => Math.round(track.speed_min || 0) + ' ' + speed.label\n\t\t\t},\n\t\t\t\"maxspeed\" : {\n\t\t\t\tlabel: \"Max Speed: \",\n\t\t\t\tvalue: (track) => Math.round(track.speed_max || 0) + ' ' + speed.label\n\t\t\t},\n\t\t\t\"avgspeed\": {\n\t\t\t\tlabel: \"Avg Speed: \",\n\t\t\t\tvalue: (track) => Math.round(track.speed_avg || 0) + ' ' + speed.label\n\t\t\t}\n\t\t});\n\n\t}\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tif (!this.options.acceleration) return;\n\n\tlet opts = this.options;\n\tlet acceleration = {};\n\n\tacceleration.label = opts.accelerationLabel || L._(this.options.imperial ? 'ft/s²' : 'm/s²');\n\tthis._accelerationFactor = opts.accelerationFactor || 1;\n\n\tif (this.options.acceleration != \"summary\") {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"right\",\n\t\t\tscale : {\n\t\t\t\tmin : 0,\n\t\t\t\tmax : +1,\n\t\t\t},\n\t\t\ttickPadding: 16,\n\t\t\tlabel : acceleration.label,\n\t\t\tlabelX : 25,\n\t\t\tlabelY : -8,\n\t\t\tname : 'acceleration'\n\t\t});\n\n\t\tthis._registerAreaPath({\n\t\t\tname : 'acceleration',\n\t\t\tlabel : 'Acceleration',\n\t\t\tyAttr : 'acceleration',\n\t\t\tscaleX : 'distance',\n\t\t\tscaleY : 'acceleration',\n\t\t\tcolor : '#050402',\n\t\t\tstrokeColor : '#000',\n\t\t\tstrokeOpacity: \"0.5\",\n\t\t\tfillOpacity : \"0.25\",\n\t\t});\n\n\t}\n\n\tthis.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet currT = data[i].time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = (currT - prevT) / 1000;\n\n\t\tlet track = this.track_info;\n\t\tlet sMax = track.acceleration_max || -Infinity; // Acceleration Max\n\t\tlet sMin = track.acceleration_min || +Infinity; // Acceleration Min\n\t\tlet sAvg = track.acceleration_avg || 0; // Acceleration Avg\n\t\tlet acceleration = 0;\n\n\t\tif (deltaT > 0) {\n\t\t\tlet curr = data[i].speed;\n\t\t\tlet prev = i > 0 ? data[i - 1].speed : curr;\n\t\t\tlet delta = (curr - prev) * (1000 / this._timeFactor);\n\t\t\tacceleration = Math.abs((delta / deltaT)) * this._accelerationFactor;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" acceleration values.\n\t\tif (this.options.accelerationDeltaMax) {\n\t\t\tlet deltaA = i > 0 ? acceleration - data[i - 1].acceleration : 0;\n\t\t\tlet maxDeltaS = this.options.accelerationDeltaMax;\n\t\t\tif (Math.abs(deltaA) > maxDeltaS) {\n\t\t\t\tacceleration = data[i - 1].acceleration + maxDeltaS * Math.sign(deltaA);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable acceleration values.\n\t\tif (this.options.accelerationRange) {\n\t\t\tlet range = this.options.accelerationRange;\n\t\t\tif (acceleration < range[0]) acceleration = range[0];\n\t\t\telse if (acceleration > range[1]) acceleration = range[1];\n\t\t}\n\n\t\tacceleration = L.Util.formatNum(acceleration, 2);\n\n\t\tif (acceleration > sMax) sMax = acceleration;\n\t\tif (acceleration < sMin) sMin = acceleration;\n\t\tsAvg = (acceleration + sAvg) / 2.0;\n\n\t\tdata[i].acceleration = acceleration;\n\n\t\ttrack.acceleration_max = sMax;\n\t\ttrack.acceleration_min = sMin;\n\t\ttrack.acceleration_avg = sAvg;\n\t});\n\n\tthis._registerFocusLabel({\n\t\tname : 'acceleration',\n\t\tchart : (item) => item.acceleration + \" \" + acceleration.label,\n\t\tmarker: (item) => Math.round(item.acceleration) + \" \" + acceleration.label,\n\t});\n\n\tthis._registerSummary({\n\t\t\"minacceleration\" : {\n\t\t\tlabel: \"Min Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_min || 0) + ' ' + acceleration.label\n\t\t},\n\t\t\"maxacceleration\" : {\n\t\t\tlabel: \"Max Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_max || 0) + ' ' + acceleration.label\n\t\t},\n\t\t\"avgacceleration\": {\n\t\t\tlabel: \"Avg Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_avg || 0) + ' ' + acceleration.label\n\t\t}\n\t});\n\n});\n","/*\n * Copyright (c) 2019, GPL-3.0+ Project, Raruto\n *\n * This file is free software: you may copy, redistribute and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 2 of the License, or (at your\n * option) any later version.\n *\n * This file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n *\n * This file incorporates work covered by the following copyright and\n * permission notice:\n *\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\n *\n * Permission to use, copy, modify, and/or distribute this software\n * for any purpose with or without fee is hereby granted, provided\n * that the above copyright notice and this permission notice appear\n * in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Chart } from './chart';\nimport { Elevation } from './control';\nimport './distance';\nimport './altitude';\nimport './time';\nimport './slope';\nimport './speed';\nimport './acceleration';\n\nElevation.Utils = _;\nElevation.Components = D3;\nElevation.Chart = Chart;\n\nL.control.elevation = (options) => new Elevation(options);\n"],"names":["deepMerge","target","sources","length","source","shift","isObject","key","Object","assign","deferFunc","f","document","readyState","window","addEventListener","once","factory","define","amd","exports","module","require","L","locales","locale","registerLocale","code","Util","extend","setLocale","i18n","_","string","data","template","err","MIN","SEC","HOUR","DAY","formatTime","t","d","Math","floor","h","m","s","round","toString","padStart","GeoJSONLoader","control","JSON","parse","distanceMarkers","this","options","lazy","wptIcons","gpxOptions","marker_options","layer","geoJson","style","feature","polyline","theme","className","pointToLayer","latlng","prop","properties","desc","name","sym","replace","toLowerCase","divIcon","html","iconSize","iconAnchor","marker","icon","bindPopup","openPopup","_registerCheckPoint","label","fire","point","element","onEachFeature","geometry","type","_latlngs","forEach","i","meta","time","ele","hr","cad","atemp","alt","Date","coordTimes","times","_typeof","parseInt","heartRates","heartRate","addData","on","e","path","DistanceMarkers","Polyline","track_info","Control","Elevation","_d3LazyLoader","then","_fireEvt","item","Array","isArray","isVisible","elem","styles","getComputedStyle","visibility","display","isVisibleByStyles","boundingRect","getBoundingClientRect","left","right","top","above","bottom","pointerEvents","elementFromPoint","isAboveOtherElements","isJSONDoc","doc","trim","indexOf","console","warn","isXMLDoc","documentElement","ownerDocument","nodeName","lazyLoader","url","skip","loader","Promise","resolve","reject","tag","createElement","src","head","appendChild","saveFile","dataURI","fileName","a","create","href","download","b","body","click","removeChild","waitHolder","ticking","scrollFn","requestAnimFrame","removeEventListener","addClass","targetNode","split","every","DomUtil","removeClass","toggleClass","conditional","call","replaceClass","removeClassName","addClassName","value","getStyle","setProperty","toggleStyle","toggleEvent","leafletElement","eventName","handler","tagName","attributes","parent","setAttributes","append","child","insert","position","insertAdjacentElement","attrs","k","setAttribute","select","selector","context","querySelector","DomEvent","off","hasClass","randomId","random","substr","each","obj","fn","func","wait","immediate","timeout","args","arguments","clearTimeout","setTimeout","apply","offsetWidth","offsetHeight","getClientRects","Colors","area","alpha","stroke","line","Area","width","height","xAttr","yAttr","scaleX","scaleY","interpolation","d3","curve","x","xDiagCoord","y0","y1","Path","color","strokeColor","strokeOpacity","fillOpacity","classed","attr","Axis","tickSize","tickPadding","axis","scale","ticks","tickFormat","labelX","labelY","onAxisMount","g","w","axisScale","l","toUpperCase","axisGroup","join","text","Grid","props","HeightFocusLine","xCoord","yCoord","HeightFocusLabel","y","node","selectAll","HeightFocusMarker","circle","LegendItem","margins","svg","ownerSVGElement","dispatch","detail","legend","enabled","MouseFocusLine","MouseFocusLabel","rect","xAlign","yAlign","bbox","getBBox","max","Browser","webkit","Infinity","Ruler","symbol","symbolTriangle","exit","remove","enter","merge","size","angle","Domain","min","forceBounds","domain","extent","Range","Scale","range","scaleLinear","Chart","_width","ruler","_height","panes","grid","brush","tooltip","clipPath","clipRect","foreignObject","canvas","getContext","dragG","focusG","brushG","brushX","utils","chart","opts","_resize","bisector","invert","Class","includes","Evented","prototype","Mixin","Events","initialize","_data","_props","scales","paths","areas","grids","axes","legendItems","focusLabels","_scales","_domains","_ranges","_paths","_brushEnabled","dragging","_zoomEnabled","zooming","imperial","_xLabel","_yLabel","xLabel","yLabel","_chart","D3","_container","_grid","pane","_area","_point","_axis","_legend","_initScale","_clipPath","get","_canvas","_context","_dragG","_focusG","_brush","_focusline","_focuslabel","_zoom","zoom","_drag","drag","_initInteractions","update","_updateScale","_updateArea","_updateAxis","_updateLegend","_updateClipper","render","container","_this","clear","_resetDrag","clearRect","_path","_drawPath","ctx","datum","preferCanvas","beginPath","moveTo","p","Path2D","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","_hasActiveLayers","_initBrush","focus","sourceEvent","_this2","pointers","_findIndexForXCoord","filter","shiftKey","button","selection","start","end","dragstart","dragend","bind","_initClipper","margin","scaleExtent","translateExtent","_this3","buttons","transform","distance","_x","rescaleX","_hideDiagramIndicator","_initRuler","_initLegend","_this4","formatNum","format","yMax","_this5","z","_y","coords","_findCoordsForY","_registerAxisScale","xAxisMin","xAxisMax","yAxisMin","yAxisMax","altitude","_registerAreaPath","_registerAxisGrid","forceAxisBounds","xTicks","yTicks","_findIndexForLatLng","dist","isNaN","property","pos","y2","x2","_registerFocusLabel","gridOpts","axesOpts","n","translate","substring","legends","items","nodes","v","map","sign","rev","slice","reverse","push","concat","xAxesB","marginB","marginR","_this6","tx","ty","r","next","list","reduce","array","index","curr","_this7","result","distanceTo","_resetZoom","zoomIdentity","_showDiagramIndicator","xCoordinate","yCoordinate","decimalsX","decimalsY","labels","Marker","_focusmarker","_marker","markerIcon","zIndexOffset","interactive","_focuslabels","addTo","_map","getPane","_latlng","latLngToLayerPoint","_rotate","rotatedPointToMapPanePoint","normalizedAlt","maxElevation","normalizedY","getElement","setLatLng","getLatLng","Summary","summary","reset","innerHTML","_registerSummary","Options","autofitBounds","autohide","mobile","autohideMarker","almostover","collapsed","detached","distanceFactor","downloadLink","elevationDiv","followMarker","async","startIconUrl","endIconUrl","shadowUrl","heightFactor","lazyLoadJS","loadData","defer","placeholder","opacity","weight","lineCap","polylineSegments","reverseCoords","skipNullZCoords","responsive","slope","speed","sLimit","undefined","timeFactor","timeFormat","sDeltaMax","sInterpolation","sRange","zFollow","Mobile","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LDISTANCEM","_addData","_addLayer","eleDiv","_initElevationDiv","isConnected","getContainer","onAdd","_layers","clearLayers","disableBrush","enableBrush","enableDragging","enableBrushing","disableDragging","disableBrushing","disableZoom","enableZoom","fitBounds","bounds","getBounds","isValid","latLngBounds","getZFollow","_zFollow","hide","featureGroup","_markedSegments","_chartEnabled","_setMapView","throttle","setStyle","colors","load","loadChart","loadDefer","loadLazy","loadXML","loadGeoJSON","loadFile","fetch","response","_downloadURL","catch","loadGPX","_togeojsonLazyLoader","toGeoJSON","xml","DOMParser","parseFromString","geojson","getElementsByTagName","pop","parentNode","_initButton","_initChart","_initSummary","_initMarker","_initLayer","_hideMarker","_resetView","_resizeChart","_rotateMarker","_updateChart","_updateSummary","onRemove","redraw","setZFollow","show","geom","_addGeoJSONData","coordinates","features","_addGPXData","_addPoint","_this8","lat","lng","latLng","addLayer","id","_collapse","_expand","_findItemForLatLng","_findItemForX","propagate","_xTicks","_yTicks","clientWidth","_maxWidth","maxWidth","_dragendHandler","_mousemoveHandler","_mouseoutHandler","_rulerFilterHandler","_toggleChartHandler","_this9","_mousemoveLayerHandler","_pane","createPane","zIndex","_renderer","disableClickPropagation","stopPropagation","_mousewheelHandler","link","_button","title","stop","_toggle","_summary","summaryDiv","_updateMarker","gestureHandling","_enabled","ll","getCenter","getZoom","deltaY","flyTo","_this10","_this11","_this12","_this13","_this14","_this15","_isFullscreen","newWidth","_updateMapSegments","setView","animate","duration","contains","eachLayer","_this16","elevation_max","setLatLngs","hasLayer","onclick","preventDefault","_this17","confirm","__xTicks","__yTicks","addInitHook","_popup","_content","decodeURI","bindTooltip","direction","sticky","openTooltip","CustomEvent","dispatchEvent","_this18","_geomutilLazyLoader","GeometryUtil","almostOver","_almostoverLazyLoader","Handler","AlmostOver","addHandler","_distanceMarkersLazyLoader","oldProto","Canvas","_fillStroke","include","oldVal","_distanceFactor","track","prev","delta","toFixed","_heightFactor","eleMax","eleMin","elevation_min","prevZ","lastZ","_lastValidZ","currZ","splice","timeLabel","_timeFactor","_timeAVGSpeed","timeAVGSpeed","speedFactor","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","xTimeFormat","getTime","now","getTimezoneOffset","currT","prevT","deltaT","abs","slopeLabel","tAsc","ascent","tDes","descent","sMax","slope_max","sMin","slope_min","deltaZ","deltaS","maxDeltaS","acceleration","speedLabel","_speedFactor","speed_max","speed_min","sAvg","speed_avg","speedDeltaMax","speedRange","accelerationLabel","_accelerationFactor","accelerationFactor","acceleration_max","acceleration_min","acceleration_avg","accelerationDeltaMax","deltaA","accelerationRange","Utils","Components","elevation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"leaflet-elevation.min.js","sources":["../src/utils.js","../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/components.js","../src/chart.js","../src/marker.js","../src/summary.js","../src/options.js","../src/control.js","../src/distance.js","../src/altitude.js","../src/time.js","../src/slope.js","../src/speed.js","../src/acceleration.js","../src/index.js"],"sourcesContent":["/**\n * Recursive deep merge objects.\n * Alternative to L.Util.setOptions(this, options).\n */\nexport function deepMerge(target, ...sources) {\n\tif (!sources.length) return target;\n\tconst source = sources.shift();\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) Object.assign(target, {\n\t\t\t\t\t[key]: {}\n\t\t\t\t});\n\t\t\t\tdeepMerge(target[key], source[key]);\n\t\t\t} else {\n\t\t\t\tObject.assign(target, {\n\t\t\t\t\t[key]: source[key]\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn deepMerge(target, ...sources);\n}\n\n/**\n * Wait for document load before execute function.\n */\nexport function deferFunc(f) {\n\tif (document.readyState !== 'complete') window.addEventListener(\"load\", f, { once: true });\n\telse f();\n}\n/**\n * Debounce function to limit events are being fired.\n */\nexport function debounce(func, wait, context, immediate) {\n\tvar timeout;\n\treturn function() {\n\t\tvar args = arguments;\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\tif (!immediate) func.apply(context, args);\n\t\t}, wait);\n\t\tif (immediate && !timeout) func.apply(context, args);\n\t};\n}\n\nconst SEC = 1000;\nconst MIN = SEC * 60;\nconst HOUR = MIN * 60;\nconst DAY = HOUR * 24;\n\n/**\n * Convert a duration time (millis) to a human readable string (%Dd %H:%M'%S\")\n */\nexport function formatTime(t) {\n\tlet d = Math.floor(t / DAY);\n\tlet h = Math.floor( (t - d * DAY) / HOUR);\n\tlet m = Math.floor( (t - d * DAY - h * HOUR) / MIN);\n\tlet s = Math.round( (t - d * DAY - h * HOUR - m * MIN) / SEC);\n\tif ( s === 60 ) { m++; s = 0; }\n\tif ( m === 60 ) { h++; m = 0; }\n\tif ( h === 24 ) { d++; h = 0; }\n\treturn (d ? d + \"d \" : '') + h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0) + \"'\" + s.toString().padStart(2, 0) + '\"';\n}\n\n/**\n * Simple GeoJSON data loader.\n */\nexport function GeoJSONLoader(data, control) {\n\tif (typeof data === \"string\") {\n\t\tdata = JSON.parse(data);\n\t}\n\tcontrol = control || this;\n\n let distanceMarkers = (\n\t\t\tcontrol.options.distanceMarkers === true\n\t\t\t\t? { lazy: true }\n\t\t\t\t: L.extend({ lazy: true }, control.options.distanceMarkers)\n\t);\n\n let wptIcons = control.options.wptIcons;\n\n\tlet layer = L.geoJson(data, {\n\t\tdistanceMarkers: distanceMarkers,\n\t\tstyle: (feature) => {\n\t\t\tlet style = L.extend({}, control.options.polyline);\n\t\t\tif (control.options.theme) {\n\t\t\t\tstyle.className += ' ' + control.options.theme;\n\t\t\t}\n\t\t\treturn style;\n\t\t},\n\t\tpointToLayer: (feature, latlng) => {\n\t\t\tif (!control.options.waypoints) return;\n\n\t\t\tlet prop = feature.properties;\n\t\t\tlet desc = prop.desc ? prop.desc : '';\n\t\t\tlet name = prop.name ? prop.name : '';\n\t\t\tlet sym = (prop.sym ? prop.sym : name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase();\n\n\t\t\t// generate and cache appropriate icon symbol\n\t\t\tif (!wptIcons.hasOwnProperty(sym)) {\n\t\t\t\twptIcons[sym] = L.divIcon(\n\t\t\t\t\tL.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } )\n\t\t\t\t);\n\t\t\t}\n\t\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\n\t\t\tif (name || desc) {\n\t\t\t\tmarker.bindPopup(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : '')).openPopup();\n\t\t\t}\n control._addMarker(marker);\n\t\t\tcontrol._registerCheckPoint({latlng: latlng, label: name}, true);\n\t\t\tcontrol.fire('waypoint_added', { point: marker, element: latlng, properties: prop });\n\t\t\treturn marker;\n\t\t},\n\t\tonEachFeature: (feature, layer) => {\n\t\t\tif (feature.geometry && feature.geometry.type == 'Point') return;\n\n\t\t\t// Standard GeoJSON\n\t\t\t// control.addData(feature, layer); // NB uses \"_addGeoJSONData\"\n\n\t\t\t// Extended GeoJSON\n\t\t\tlayer._latlngs.forEach((point, i, data) => {\n\t\t\t\t// same properties as L.GPX layer\n\t\t\t\tpoint.meta = { time: null, ele: null, hr: null, cad: null, atemp: null };\n\t\t\t\tif(\"alt\" in point) point.meta.ele = point.alt;\n\t\t\t\tif(feature.properties) {\n\t\t\t\t\tlet prop = feature.properties;\n\t\t\t\t\tif(\"coordTimes\" in prop) point.meta.time = new Date(Date.parse(prop.coordTimes[i]));\n\t\t\t\t\telse if(\"times\" in prop) point.meta.time = new Date(Date.parse(prop.times[i]));\n\t\t\t\t\telse if(\"time\" in prop) point.meta.time = new Date(Date.parse((typeof prop.time === 'object' ? prop.time[i] : prop.time)));\n\t\t\t\t\tif(\"heartRates\" in prop) point.meta.hr = parseInt(prop.heartRates[i]);\n\t\t\t\t\telse if(\"heartRate\" in prop) point.meta.hr = parseInt((typeof prop.heartRate === 'object' ? prop.heartRate[i] : prop.heartRate));\n\t\t\t\t\t// TODO: cadence, temperature\n\t\t\t\t}\n\t\t\t});\n\t\t\tcontrol.addData(layer); // NB uses \"_addGPXData\"\n\n\t\t\t// Postpone adding the distance markers (lazy: true)\n\t\t\tif(control.options.distanceMarkers && distanceMarkers.lazy) {\n\t\t\t layer.on('add remove', (e) => {\n\t\t\t let path = e.target;\n\t\t\t if (L.DistanceMarkers && path instanceof L.Polyline) {\n\t\t\t\t\t\tpath[e.type + 'DistanceMarkers']();\n\t\t\t }\n\t\t\t });\n\t\t\t}\n\n\t\t\tcontrol.track_info = L.extend({}, control.track_info, { type: \"geojson\", name: data.name });\n\t\t},\n\t});\n\n\tL.Control.Elevation._d3LazyLoader.then(() => {\n\t\tcontrol._fireEvt(\"eledata_loaded\", { data: data, layer: layer, name: control.track_info.name, track_info: control.track_info })\n\t});\n\n\treturn layer;\n}\n\n/**\n * Check DOM element visibility.\n */\nexport function isDomVisible(elem) {\n\treturn !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\n}\n\n/**\n * Check object type.\n */\nexport function isObject(item) {\n\treturn (item && typeof item === 'object' && !Array.isArray(item));\n}\n\n/**\n * Check DOM element viewport visibility.\n */\nexport function isVisible(elem) {\n\tif (!elem) return false;\n\n\tlet styles = window.getComputedStyle(elem);\n\n\tfunction isVisibleByStyles(elem, styles) {\n\t\treturn styles.visibility !== 'hidden' && styles.display !== 'none';\n\t}\n\n\tfunction isAboveOtherElements(elem, styles) {\n\t\tlet boundingRect = elem.getBoundingClientRect();\n\t\tlet left = boundingRect.left + 1;\n\t\tlet right = boundingRect.right - 1;\n\t\tlet top = boundingRect.top + 1;\n\t\tlet bottom = boundingRect.bottom - 1;\n\t\tlet above = true;\n\n\t\tlet pointerEvents = elem.style.pointerEvents;\n\n\t\tif (styles['pointer-events'] == 'none') elem.style.pointerEvents = 'auto';\n\n\t\tif (document.elementFromPoint(left, top) !== elem) above = false;\n\t\tif (document.elementFromPoint(right, top) !== elem) above = false;\n\n\t\t// Only for completely visible elements\n\t\t// if (document.elementFromPoint(left, bottom) !== elem) above = false;\n\t\t// if (document.elementFromPoint(right, bottom) !== elem) above = false;\n\n\t\telem.style.pointerEvents = pointerEvents;\n\n\t\treturn above;\n\t}\n\n\tif (!isVisibleByStyles(elem, styles)) return false;\n\tif (!isAboveOtherElements(elem, styles)) return false;\n\treturn true;\n}\n\n/**\n * Check JSON object type.\n */\nexport function isJSONDoc(doc, lazy) {\n\tlazy = typeof lazy === \"undefined\" ? true : lazy;\n\tif (typeof doc === \"string\" && lazy) {\n\t\tdoc = doc.trim();\n\t\treturn doc.indexOf(\"{\") == 0 || doc.indexOf(\"[\") == 0;\n\t} else {\n\t\ttry {\n\t\t\tJSON.parse(doc.toString());\n\t\t} catch (e) {\n\t\t\tif (typeof doc === \"object\" && lazy) return true;\n\t\t\tconsole.warn(e);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\n/**\n * Check XML object type.\n */\nexport function isXMLDoc(doc, lazy) {\n\tlazy = typeof lazy === \"undefined\" ? true : lazy;\n\tif (typeof doc === \"string\" && lazy) {\n\t\tdoc = doc.trim();\n\t\treturn doc.indexOf(\"<\") == 0;\n\t} else {\n\t\tlet documentElement = (doc ? doc.ownerDocument || doc : 0).documentElement;\n\t\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n\t}\n}\n\n/**\n * Async JS script download.\n */\nexport function lazyLoader(url, skip, loader) {\n\tif (skip === false) {\n\t\treturn Promise.resolve();\n\t}\n\tif (loader instanceof Promise) {\n\t\treturn loader;\n\t}\n\treturn new Promise((resolve, reject) => {\n\t\tlet tag = document.createElement(\"script\");\n\t\ttag.addEventListener('load', resolve, { once: true });\n\t\ttag.src = url;\n\t\tdocument.head.appendChild(tag);\n\t});\n}\n\n/**\n * Generate download data event.\n */\nexport function saveFile(dataURI, fileName) {\n\tlet a = create('a', '', { href: dataURI, target: '_new', download: fileName || \"\", style: \"display:none;\" });\n\tlet b = document.body;\n\tb.appendChild(a);\n\ta.click();\n\tb.removeChild(a);\n}\n\n/**\n * Wait for element visible before execute function.\n */\nexport function waitHolder(elem) {\n\treturn new Promise((resolve, reject) => {\n\t\tlet ticking = false;\n\t\tlet scrollFn = () => {\n\t\t\tif (!ticking) {\n\t\t\t\tL.Util.requestAnimFrame(() => {\n\t\t\t\t\tif (isVisible(elem)) {\n\t\t\t\t\t\twindow.removeEventListener('scroll', scrollFn);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t\tticking = false;\n\t\t\t\t});\n\t\t\t\tticking = true;\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener('scroll', scrollFn);\n\t\tif (elem) elem.addEventListener('mouseenter', scrollFn, { once: true });\n\t\tscrollFn();\n\t});\n}\n\n/**\n * A little bit safier than L.DomUtil.addClass\n */\nexport function addClass(targetNode, className) {\n\tif (targetNode) className.split(\" \").every(s => s && L.DomUtil.addClass(targetNode, s));\n}\n\n/**\n * A little bit safier than L.DomUtil.removeClass()\n */\nexport function removeClass(targetNode, className) {\n\tif (targetNode) className.split(\" \").every(s => s && L.DomUtil.removeClass(targetNode, s));\n}\n\nexport function toggleClass(targetNode, className, conditional) {\n\treturn (conditional ? addClass : removeClass).call(null, targetNode, className)\n}\n\nexport function replaceClass(targetNode, removeClassName, addClassName) {\n if (removeClassName) removeClass(targetNode, removeClassName);\n if (addClassName) addClass(targetNode, addClassName);\n}\n\nexport function style(targetNode, name, value) {\n\tif (typeof value === \"undefined\") return L.DomUtil.getStyle(targetNode, name);\n\telse return targetNode.style.setProperty(name, value);\n}\n\nexport function toggleStyle(targetNode, name, value, conditional) {\n return style(targetNode, name, conditional ? value : '');\n}\n\nexport function toggleEvent(leafletElement, eventName, handler, conditional) {\n\treturn leafletElement[conditional ? 'on' : 'off'](eventName, handler);\n}\n\n/**\n * A little bit shorter than L.DomUtil.create()\n */\nexport function create(tagName, className, attributes, parent) {\n\tlet elem = L.DomUtil.create(tagName, className || \"\");\n\tif (attributes) setAttributes(elem, attributes);\n\tif (parent) append(parent, elem);\n\treturn elem;\n}\n\n/**\n * Same as node.appendChild()\n */\nexport function append(parent, child) {\n\treturn parent.appendChild(child);\n}\n\n/**\n * Same as node.insertAdjacentElement()\n */\nexport function insert(parent, child, position) {\n\treturn parent.insertAdjacentElement(position, child);\n}\n\n/**\n * Loop for node.setAttribute()\n */\nexport function setAttributes(elem, attrs) {\n\tfor (let k in attrs) { elem.setAttribute(k, attrs[k]); }\n}\n\n/**\n * Same as node.querySelector().\n */\nexport function select(selector, context) {\n\treturn (context || document).querySelector(selector);\n}\n\n/**\n * Alias for L.DomEvent.on.\n */\nexport const on = L.DomEvent.on;\n\n/**\n * Alias for L.DomEvent.off.\n */\nexport const off = L.DomEvent.off;\n\n/**\n * Alias for L.DomUtil.hasClass.\n */\nexport const hasClass = L.DomUtil.hasClass;\n\n\nexport function randomId() {\n\treturn Math.random().toString(36).substr(2, 9);\n}\n\nexport function each(obj, fn) {\n\tfor (let i in obj) fn(obj[i], i);\n}\n","// Following https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md\n(function (factory, window) {\n\n // define an AMD module that relies on 'leaflet'\n if (typeof define === 'function' && define.amd) {\n define(['leaflet'], factory);\n\n // define a Common JS module that relies on 'leaflet'\n } else if (typeof exports === 'object') {\n module.exports = factory(require('leaflet'));\n }\n\n // attach your plugin to the global 'L' variable\n if (typeof window !== 'undefined' && window.L) {\n factory(window.L);\n\n }\n}(function (L) {\n L.locales = {};\n L.locale = null;\n L.registerLocale = function registerLocale(code, locale) {\n L.locales[code] = L.Util.extend({}, L.locales[code], locale);\n };\n L.setLocale = function setLocale(code) {\n L.locale = code;\n };\n return L.i18n = L._ = function translate(string, data) {\n if (L.locale && L.locales[L.locale] && L.locales[L.locale][string]) {\n string = L.locales[L.locale][string];\n }\n try {\n // Do not fail if some data is missing\n // a bad translation should not break the app\n string = L.Util.template(string, data);\n }\n catch (err) {/*pass*/\n }\n\n return string;\n };\n}, window));\n","export const Colors = {\n\t'lightblue': { area: '#3366CC', alpha: 0.45, stroke: '#3366CC' },\n\t'magenta' : { area: '#FF005E' },\n\t'yellow' : { area: '#FF0' },\n\t'purple' : { area: '#732C7B' },\n\t'steelblue': { area: '#4682B4' },\n\t'red' : { area: '#F00' },\n\t'lime' : { area: '#9CC222', line: '#566B13' }\n};\n\nexport const Area = ({\n\twidth,\n\theight,\n\txAttr,\n\tyAttr,\n\tscaleX,\n\tscaleY,\n\tinterpolation = \"curveLinear\"\n}) => {\n\treturn d3.area()\n\t\t.curve(typeof interpolation === 'string' ? d3[interpolation] : interpolation)\n\t\t.x(d => (d.xDiagCoord = scaleX(d[xAttr])))\n\t\t.y0(height)\n\t\t.y1(d => scaleY(d[yAttr]));\n};\n\nexport const Path = ({\n\tname,\n\tcolor,\n\tstrokeColor,\n\tstrokeOpacity,\n\tfillOpacity,\n}) => {\n\tlet path = d3.create('svg:path')\n\n\tif (name) path.classed(name, true);\n\n\tpath.style(\"pointer-events\", \"none\");\n\n\tpath\n\t.attr(\"fill\", color || '#3366CC')\n\t.attr(\"stroke\", strokeColor || '#000')\n\t.attr(\"stroke-opacity\", strokeOpacity || '1')\n\t.attr(\"fill-opacity\", fillOpacity || '0.8');\n\n\treturn path;\n};\n\nexport const Axis = ({\n\ttype = \"axis\",\n\ttickSize = 6,\n\ttickPadding = 3,\n\tposition,\n\theight,\n\twidth,\n\taxis,\n\tscale,\n\tticks,\n\ttickFormat,\n\tlabel,\n\tlabelX,\n\tlabelY,\n\tname = \"\",\n\tonAxisMount,\n}) => {\n\treturn g => {\n\t\tlet [w, h] = [0, 0];\n\t\tif (position == \"bottom\") h = height;\n\t\tif (position == \"right\") w = width;\n\n\t\tif (axis == \"x\" && type == \"grid\") {\n\t\t\ttickSize = -height;\n\t\t} else if (axis == \"y\" && type == \"grid\") {\n\t\t\ttickSize = -width;\n\t\t}\n\n\t\tlet axisScale = d3[\"axis\" + position.replace(/\\b\\w/g, l => l.toUpperCase())]()\n\t\t\t.scale(scale)\n\t\t\t.ticks(ticks)\n\t\t\t.tickPadding(tickPadding)\n\t\t\t.tickSize(tickSize)\n\t\t\t.tickFormat(tickFormat);\n\n\t\tlet axisGroup = g.append(\"g\")\n\t\t\t.attr(\"class\", [axis, type, position, name].join(\" \"))\n\t\t\t.attr(\"transform\", \"translate(\" + w + \",\" + h + \")\")\n\t\t\t.call(axisScale);\n\n\t\tif (label) {\n\t\t\taxisGroup.append(\"svg:text\")\n\t\t\t\t.attr(\"x\", labelX)\n\t\t\t\t.attr(\"y\", labelY)\n\t\t\t\t.text(label);\n\t\t}\n\n\t\tif (onAxisMount) {\n\t\t\taxisGroup.call(onAxisMount);\n\t\t}\n\n\t\treturn axisGroup;\n\t};\n};\n\nexport const Grid = (props) => {\n\tprops.type = \"grid\";\n\treturn Axis(props);\n};\n\nexport const HeightFocusLine = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n\tlength = 0,\n}) => {\n\treturn line => line\n\t\t.attr(\"class\", theme + \" height-focus line\")\n\t\t.attr(\"x1\", xCoord)\n\t\t.attr(\"x2\", xCoord)\n\t\t.attr(\"y1\", yCoord)\n\t\t.attr(\"y2\", length);\n};\n\nexport const HeightFocusLabel = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n\tlabel,\n}) => {\n\treturn text => {\n\t\ttext\n\t\t\t.attr(\"class\", theme + \" height-focus-label\")\n\t\t\t.style(\"pointer-events\", \"none\")\n\t\t\t.attr(\"x\", xCoord + 5)\n\t\t\t.attr(\"y\", yCoord);\n\n\t\tlet y = text.select(\".height-focus-y\");\n\t\tif (!y.node()) y = text.append(\"svg:tspan\");\n\n\t\ty\n\t\t\t.attr(\"class\", \"height-focus-y\")\n\t\t\t.text(label);\n\n\t\ttext.selectAll('tspan').attr(\"x\", xCoord + 5);\n\n\t\treturn text;\n\t};\n};\n\nexport const HeightFocusMarker = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n}) => {\n\treturn circle => circle\n\t\t.attr(\"class\", theme + \" height-focus circle-lower\")\n\t\t.attr(\"transform\", \"translate(\" + xCoord + \",\" + yCoord + \")\")\n\t\t.attr(\"r\", 6)\n\t\t.attr(\"cx\", 0)\n\t\t.attr(\"cy\", 0);\n};\n\nexport const LegendItem = ({\n\tname,\n label,\n\twidth,\n\theight,\n\tmargins = {},\n\tcolor,\n\tpath\n}) => {\n\treturn g => {\n\t\tg\n\t\t\t.attr(\"class\", \"legend-item legend-\" + name.toLowerCase())\n\t\t\t.attr(\"data-name\", name);\n\n\t\tconst svg = d3.select(g.node().ownerSVGElement || g);\n\n\t\tg.on('click.legend', () => svg.dispatch(\"legend_clicked\", {\n\t\t\tdetail: {\n\t\t\t\tpath: path.node(),\n\t\t\t\tname: name,\n\t\t\t\tlegend: g.node(),\n\t\t\t\tenabled: !path.classed('leaflet-hidden'),\n\t\t\t}\n\t\t}));\n\n\t\tg.append(\"svg:rect\")\n\t\t\t.attr(\"x\", (width / 2) - 50)\n\t\t\t.attr(\"y\", height + margins.bottom / 2)\n\t\t\t.attr(\"width\", 50)\n\t\t\t.attr(\"height\", 10)\n\t\t\t.attr(\"fill\", color)\n\t\t\t.attr(\"stroke\", \"#000\")\n\t\t\t.attr(\"stroke-opacity\", \"0.5\")\n\t\t\t.attr(\"fill-opacity\", \"0.25\");\n\n\t\tg.append('svg:text')\n\t\t\t.text(L._(label || name))\n\t\t\t.attr(\"x\", (width / 2) + 5)\n\t\t\t.attr(\"font-size\", 10)\n\t\t\t.style(\"text-decoration-thickness\", \"2px\")\n\t\t\t.style(\"font-weight\", \"700\")\n\t\t\t.attr('y', height + margins.bottom / 2)\n\t\t\t.attr('dy', \"0.75em\");\n\n\t\treturn g;\n\t}\n};\n\nexport const MouseFocusLine = ({\n\txCoord = 0,\n\theight,\n}) => {\n\treturn line => line\n\t\t.attr('class', 'mouse-focus-line')\n\t\t.attr('x2', xCoord)\n\t\t.attr('y2', 0)\n\t\t.attr('x1', xCoord)\n\t\t.attr('y1', height);\n};\n\nexport const MouseFocusLabel = ({\n\txCoord,\n\tyCoord,\n\tlabelX = \"\",\n\tlabelY = \"\",\n\twidth,\n}) => {\n\treturn g => {\n\n\t\tg.attr('class', 'mouse-focus-label');\n\n\t\tlet rect = g.select(\".mouse-focus-label-rect\");\n\t\tlet text = g.select(\".mouse-focus-label-text\");\n\t\tlet y = text.select(\".mouse-focus-label-y\");\n\t\tlet x = text.select(\".mouse-focus-label-x\");\n\n\t\tif (!rect.node()) rect = g.append(\"svg:rect\");\n\t\tif (!text.node()) text = g.append(\"svg:text\");\n\t\tif (!y.node()) y = text.append(\"svg:tspan\");\n\t\tif (!x.node()) x = text.append(\"svg:tspan\");\n\n\t\ty.text(labelY);\n\t\tx.text(labelX);\n\n\t\t// Sets focus-label-text position to the left / right of the mouse-focus-line\n\t\tlet xAlign = 0;\n\t\tlet yAlign = 0;\n\t\tlet bbox = { width: 0, height: 0 };\n\t\ttry { bbox = text.node().getBBox(); } catch (e) { return g; }\n\n\t\tif (xCoord) xAlign = xCoord + (xCoord < width / 2 ? 10 : -bbox.width - 10);\n\t\tif (yCoord) yAlign = Math.max(yCoord - bbox.height, L.Browser.webkit ? 0 : -Infinity);\n\n\t\trect\n\t\t\t.attr(\"class\", \"mouse-focus-label-rect\")\n\t\t\t.attr(\"x\", xAlign - 5)\n\t\t\t.attr(\"y\", yAlign - 5)\n\t\t\t.attr(\"width\", bbox.width + 10)\n\t\t\t.attr(\"height\", bbox.height + 10)\n\t\t\t.attr(\"rx\", 3)\n\t\t\t.attr(\"ry\", 3);\n\t\ttext\n\t\t\t.attr(\"class\", \"mouse-focus-label-text\")\n\t\t\t.style(\"font-weight\", \"700\")\n\t\t\t.attr(\"y\", yAlign);\n\t\ty\n\t\t\t.attr(\"class\", \"mouse-focus-label-y\")\n\t\t\t.attr(\"dy\", \"1em\");\n\t\tx\n\t\t\t.attr(\"class\", \"mouse-focus-label-x\")\n\t\t\t.attr(\"dy\", \"2em\");\n\n\t\ttext.selectAll('tspan').attr(\"x\", xAlign);\n\n\t\treturn g;\n\t};\n};\n\nexport const Ruler = ({\n\theight,\n\twidth,\n}) => {\n\treturn g => {\n\n\t\tg.data([{\n\t\t\t\t\"x\": 0,\n\t\t\t\t\"y\": height,\n\t\t\t}])\n\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\");\n\n\t\tlet rect = g.selectAll('.horizontal-drag-rect')\n\t\t\t.data([{ w: width }]);\n\n\t\tlet line = g.selectAll('.horizontal-drag-line')\n\t\t\t.data([{ w: width }]);\n\n\t\tlet label = g.selectAll('.horizontal-drag-label')\n\t\t\t.data([{ w: width - 8 }]);\n\n\t\tlet symbol = g.selectAll('.horizontal-drag-symbol')\n\t\t\t.data([{\n\t\t\t\t\"type\": d3.symbolTriangle,\n\t\t\t\t\"x\": width + 7,\n\t\t\t\t\"y\": 0,\n\t\t\t\t\"angle\": -90,\n\t\t\t\t\"size\": 50\n\t\t\t}]);\n\n\t\trect.exit().remove();\n\t\tline.exit().remove();\n\t\tlabel.exit().remove();\n\t\tsymbol.exit().remove();\n\n\t\trect.enter()\n\t\t\t.append(\"svg:rect\")\n\t\t\t.attr(\"class\", \"horizontal-drag-rect\")\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", -8)\n\t\t\t.attr(\"height\", 8)\n\t\t\t.attr('fill', 'none')\n\t\t\t.attr('pointer-events', 'all')\n\t\t\t.merge(rect)\n\t\t\t.attr(\"width\", d => d.w);\n\n\t\tline.enter()\n\t\t\t.append(\"svg:line\")\n\t\t\t.attr(\"class\", \"horizontal-drag-line\")\n\t\t\t.attr(\"x1\", 0)\n\t\t\t.merge(line)\n\t\t\t.attr(\"x2\", d => d.w);\n\n\t\tlabel.enter()\n\t\t\t.append(\"svg:text\")\n\t\t\t.attr(\"class\", \"horizontal-drag-label\")\n\t\t\t.attr(\"text-anchor\", \"end\")\n\t\t\t.attr(\"y\", -8)\n\t\t\t.merge(label)\n\t\t\t.attr(\"x\", d => d.w)\n\n\t\tsymbol\n\t\t\t.enter()\n\t\t\t.append(\"svg:path\")\n\t\t\t.attr(\"class\", \"horizontal-drag-symbol\")\n\t\t\t.merge(symbol)\n\t\t\t.attr(\"d\",\n\t\t\t\td3.symbol()\n\t\t\t\t.type(d => d.type)\n\t\t\t\t.size(d => d.size)\n\t\t\t)\n\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \") rotate(\" + d.angle + \")\");\n\n\t\treturn g;\n\t}\n};\n\nexport const Domain = ({\n\tmin,\n\tmax,\n\tattr,\n\tname,\n\tforceBounds,\n\tscale\n}) => function(data) {\n\tattr = attr || name;\n\tif (scale && scale.attr) attr = scale.attr;\n\tlet domain = data && data.length ? d3.extent(data, d => d[attr]) : [0, 1];\n\tif (typeof min !== \"undefined\" && (min < domain[0] || forceBounds)) {\n\t\tdomain[0] = min;\n\t}\n\tif (typeof max !== \"undefined\" && (max > domain[1] || forceBounds)) {\n\t\tdomain[1] = max;\n\t}\n\treturn domain;\n};\n\nexport const Range = ({\n\taxis\n}) => function(width, height) {\n\tif (axis == 'x') return [0, width];\n\telse if (axis == 'y') return [height, 0];\n};\n\nexport const Scale = ({\n\tdata,\n\tattr,\n\tmin,\n\tmax,\n\tforceBounds,\n\trange,\n}) => {\n\treturn d3.scaleLinear()\n\t\t.range(range)\n\t\t.domain(Domain({min, max, attr, forceBounds})(data));\n};\n\nexport const Bisect = ({\n\tdata = [0, 1],\n\tscale,\n\tx,\n\tattr\n}) => {\n\treturn d3\n\t\t.bisector(d => d[attr])\n\t\t.left(data, scale.invert(x));\n};\n\nexport const Chart = ({\n\twidth,\n\theight,\n\tmargins = {},\n\truler,\n}) => {\n\n\tconst _width = width - margins.left - margins.right;\n\tconst _height = height - margins.top - margins.bottom;\n\n\t// SVG Container\n\tconst svg = d3.create(\"svg:svg\").attr(\"class\", \"background\");\n\n\t// SVG Groups\n\tconst g = svg.append(\"g\");\n\tconst panes = {\n\t\tgrid : g.append(\"g\").attr(\"class\", \"grid\"),\n\t\tarea : g.append('g').attr(\"class\", \"area\"),\n\t\tpoint : g.append('g').attr(\"class\", \"point\"),\n\t\taxis : g.append('g').attr(\"class\", \"axis\"),\n\t\tbrush : g.append(\"g\").attr(\"class\", \"brush\"),\n\t\ttooltip: g.append(\"g\").attr(\"class\", \"tooltip\").attr('display', 'none'),\n\t\truler : g.append('g').attr('class', 'ruler'),\n\t\tlegend : g.append('g').attr(\"class\", \"legend\"),\n\t};\n\n\t// SVG Paths\n\tconst clipPath = panes.area.append(\"svg:clipPath\").attr(\"id\", 'elevation-clipper');\n\tconst clipRect = clipPath.append(\"svg:rect\");\n\n\t// Canvas Paths\n\tconst foreignObject = panes.area.append('svg:foreignObject');\n\tconst canvas = foreignObject.append('xhtml:canvas').attr('class', 'canvas-plot');\n\tconst context = canvas.node().getContext('2d');\n\n\t// Mouse Focus\n\tconst dragG = panes.ruler;\n\tconst focusG = panes.tooltip;\n\tconst brushG = panes.brush;\n\n\tfocusG.append('svg:line')\n\t\t.call(\n\t\t\tMouseFocusLine({\n\t\t\t\txCoord: 0,\n\t\t\t\theight: _height\n\t\t\t})\n\t\t);\n\n\tfocusG.append(\"g\")\n\t\t.call(\n\t\t\tMouseFocusLabel({\n\t\t\t\txCoord: 0,\n\t\t\t\tyCoord: 0,\n\t\t\t\theight: _height,\n\t\t\t\twidth : _width,\n\t\t\t\tlabelX: \"\",\n\t\t\t\tlabelY: \"\",\n\t\t\t})\n\t\t);\n\n\n\t// Add the brushing\n\tlet brush = d3.brushX().on('start.cursor end.cursor brush.cursor', () => brushG.select(\".overlay\").attr('cursor', null));\n\n\t// Scales\n\tconst scale = (opts) => ({ x: Scale(opts.x), y: Scale(opts.y)});\n\n\tlet utils = {\n\t\tclipPath,\n\t\tcanvas,\n\t\tcontext,\n\t\tdragG,\n\t\tfocusG,\n\t\tbrush,\n\t};\n\n\tlet chart = {\n\t\tsvg,\n\t\tg,\n\t\tpanes,\n\t\tutils,\n\t\tscale,\n\t};\n\n\t// Resize\n\tchart._resize = ({\n\t\twidth,\n\t\theight,\n\t\tmargins = {},\n\t\truler,\n\t}) => {\n\n\t\tconst _width = width - margins.left - margins.right;\n\t\tconst _height = height - margins.top - margins.bottom;\n\n\t\tsvg.attr(\"viewBox\", `0 0 ${width} ${height}`)\n\t\t\t.attr(\"width\", width)\n\t\t\t.attr(\"height\", height);\n\n\t\tg.attr(\"transform\", \"translate(\" + margins.left + \",\" + margins.top + \")\");\n\n\t\t// Partially fix: https://github.com/Raruto/leaflet-elevation/issues/123\n\t\tif(/Mac|iPod|iPhone|iPad/.test(navigator.platform) && /AppleWebkit/i.test(navigator.userAgent)) {\n\t\t\tcanvas\n\t\t\t.style(\"transform\", \"translate(\" + margins.left + \"px,\" + margins.top + \"px)\");\n\t\t}\n\n\t\tclipRect\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"width\", _width)\n\t\t\t.attr(\"height\", _height);\n\n\t\tforeignObject\n\t\t\t.attr('width', _width)\n\t\t\t.attr('height', _height);\n\n\t\tcanvas\n\t\t\t.attr('width', _width)\n\t\t\t.attr('height', _height);\n\n\t\tif (ruler) {\n\t\t\tdragG .call(Ruler({ height: _height, width: _width }));\n\t\t}\n\n\t\tbrushG.call(brush.extent( [ [0,0], [_width, _height] ] ));\n\t\tbrushG.select(\".overlay\").attr('cursor', null);\n\n\t\tchart._width = _width;\n\t\tchart._height = _height;\n\n\t\tchart.svg.dispatch('resize', { detail: { width: _width, height: _height } } );\n\n\t};\n\n\tchart.pane = (name) => {\n\t\tif (!panes[name]) {\n\t\t\tpanes[name] = g.append('g').attr(\"class\", name);\n\t\t}\n\t\treturn panes[name];\n\t}\n\n\tchart.get = (name) => utils[name];\n\n\tchart._resize({ width, height, margins});\n\n\treturn chart;\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Chart = L.Class.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\tinitialize: function(opts, control) {\n\t\tthis.options = opts;\n\t\tthis.control = control;\n\n\t\tthis._data = [];\n\n\t\t// cache registered components\n\t\tthis._props = {\n\t\t\tscales : {},\n\t\t\tpaths : {},\n\t\t\tareas : {},\n\t\t\tgrids : {},\n\t\t\taxes : {},\n\t\t\tlegendItems: {},\n\t\t\tfocusLabels: {},\n\t\t};\n\n\t\tthis._scales = {};\n\t\tthis._domains = {};\n\t\tthis._ranges = {};\n\t\tthis._paths = {};\n\n\t\tthis._brushEnabled = opts.dragging;\n\t\tthis._zoomEnabled = opts.zooming;\n\n\t\tif (opts.imperial) {\n\t\t\tthis._xLabel = \"mi\";\n\t\t\tthis._yLabel = \"ft\";\n\t\t} else {\n\t\t\tthis._xLabel = opts.xLabel;\n\t\t\tthis._yLabel = opts.yLabel;\n\t\t}\n\n\t\tlet chart = this._chart = D3.Chart(opts);\n\n\t\t// SVG Container\n\t\tlet svg = this._container = chart.svg;\n\n\t\t// Panes\n\t\tthis._grid = chart.pane('grid');\n\t\tthis._area = chart.pane('area');\n\t\tthis._point = chart.pane('point');\n\t\tthis._axis = chart.pane('axis');\n\t\tthis._legend = chart.pane('legend');\n\n\t\t// Scales\n\t\tthis._initScale();\n\n\t\t// Helpers\n\t\tthis._clipPath = chart.get('clipPath');\n\t\tthis._canvas = chart.get('canvas');\n\t\tthis._context = chart.get('context');\n\t\tthis._dragG = chart.get('dragG');\n\t\tthis._focusG = chart.get('focusG');\n\t\tthis._brush = chart.get('brush');\n\n\t\t// Tooltip\n\t\tthis._focusline = this._focusG.select('.mouse-focus-line');\n\t\tthis._focuslabel = this._focusG.select('.mouse-focus-label');\n\n\t\tthis._zoom = d3.zoom();\n\t\tthis._drag = d3.drag();\n\n\t\t// Interactions\n\t\tthis._initInteractions();\n\n\t\t// svg.on('resize', (e)=>console.log(e.detail));\n\n\t},\n\n\tupdate: function(props) {\n\t\tif (props) {\n\t\t\tif (props.data) this._data = props.data;\n\t\t\tif (props.options) this.options = props.options;\n\t\t}\n\n\t\tthis._updateScale();\n\t\tthis._updateArea();\n\t\tthis._updateAxis();\n\t\tthis._updateLegend();\n\t\tthis._updateClipper();\n\n\t\treturn this;\n\t},\n\n\trender: function() {\n\t\treturn container => container.append(() => this._container.node());\n\t},\n\n\tclear: function() {\n\t\tthis._resetDrag();\n\t\tthis._hideDiagramIndicator()\n\t\tthis._area.selectAll('path').attr(\"d\", \"M0 0\");\n\t\tthis._context.clearRect(0, 0, this._width(), this._height());\n\n\t\tif (this._path) {\n\t\t\t// this._x.domain([0, 1]);\n\t\t\t// this._y.domain([0, 1]);\n\t\t}\n\t},\n\n\t_drawPath: function(name) {\n\t\tlet opts = this.options;\n\t\tlet ctx = this._context;\n\n\t\tlet path = this._paths[name];\n\t\tlet area = this._props.areas[name];\n\t\tlet node = path.node();\n\t\tlet scaleX = this._scales[area.scaleX];\n\t\tlet scaleY = this._scales[area.scaleY];\n\n\t\tarea = L.extend({}, area, {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t\tscaleX : scaleX,\n\t\t\tscaleY : scaleY\n\t\t});\n\n\t\tif (!scaleY || !scaleY) {\n\t\t\treturn console.warn('Unable to render path:' + name);\n\t\t}\n\n\t\tpath.datum(this._data).attr(\"d\", D3.Area(area));\n\n\t\tif (path.classed('leaflet-hidden')) return;\n\n\t\tif (opts.preferCanvas) {\n\t\t\tpath.classed('canvas-path', true);\n\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(0, 0);\n\t\t\tlet p = new Path2D(path.attr('d'));\n\n\t\t\tctx.strokeStyle = path.attr('stroke');\n\t\t\tctx.fillStyle = path.attr('fill');\n\t\t\tctx.lineWidth = 1.25;\n\t\t\tctx.globalCompositeOperation = 'source-over';\n\n\t\t\t// stroke opacity\n\t\t\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\n\t\t\tctx.stroke(p);\n\n\t\t\t// fill opacity\n\t\t\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\n\t\t\tctx.fill(p);\n\n\t\t\tctx.globalAlpha = 1;\n\n\t\t\tctx.closePath();\n\t\t} else {\n\t\t\tthis._area.append(() => node);\n\t\t}\n\t},\n\n\t_hasActiveLayers: function() {\n\t\tconst paths = this._paths;\n\t\tfor (var i in paths) {\n\t\t\tif (!paths[i].classed('leaflet-hidden')) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/**\n\t * Initialize \"d3-brush\".\n\t */\n\t_initBrush: function(e) {\n\t\tconst brush = (e) => {\n\t\t\tif (!this._data.length) return;\n\t\t\tlet extent = e.selection;\n\t\t\tif (extent) {\n\t\t\t\tlet start = this._findIndexForXCoord(extent[0]);\n\t\t\t\tlet end = this._findIndexForXCoord(extent[1]);\n\t\t\t\tthis.fire('dragged', { dragstart: this._data[start], dragend: this._data[end] });\n\t\t\t}\n\t\t}\n\n\t\tconst focus = (e) => {\n\t\t\tif (!this._data.length) return;\n\t\t\tif (e.type == 'brush' && !e.sourceEvent) return;\n\t\t\tlet rect = this._chart.panes.brush.select('.overlay').node();\n\t\t\tlet coords = d3.pointers(e, rect)[0];\n\t\t\tlet xCoord = coords[0];\n\t\t\tlet item = this._data[this._findIndexForXCoord(xCoord)];\n\n\t\t\tthis.fire(\"mouse_move\", { item: item, xCoord: xCoord });\n\t\t};\n\n\t\tthis._brush\n\t\t\t.filter((e) => this._brushEnabled && !e.shiftKey && !e.button)\n\t\t\t.on(\"end.update\", brush)\n\t\t\t.on(\"brush.update\", focus);\n\n\t\tthis._chart.panes.brush\n\t\t\t.on(\"mouseenter.focus touchstart.focus\", this.fire.bind(this, \"mouse_enter\"))\n\t\t\t.on(\"mouseout.focus touchend.focus\", this.fire.bind(this, \"mouse_out\") )\n\t\t\t.on(\"mousemove.focus touchmove.focus\", focus );\n\n\t},\n\n\t/**\n\t * Initialize \"d3-zoom\"\n\t */\n\t_initClipper: function() {\n\t\tlet svg = this._container;\n\t\tlet margin = this.options.margins;\n\n\t\tconst zoom = this._zoom;\n\n\t\tconst onStart = (e) => {\n\t\t\tif (e.sourceEvent && e.sourceEvent.type == \"mousedown\") svg.style('cursor', 'grabbing');\n\t\t\tif (e.transform.k == 1 && e.transform.x == 0) {\n\t\t\t\tthis._container.classed('zoomed', true);\n\t\t\t}\n\t\t\tthis.zooming = true;\n\t\t};\n\n\t\tconst onEnd = (e) => {\n\t\t\tif (e.transform.k ==1 && e.transform.x == 0){\n\t\t\t\tthis._container.classed('zoomed', false);\n\t\t\t}\n\t\t\tthis.zooming = false;\n\t\t\tsvg.style('cursor', '');\n\t\t};\n\n\t\tconst onZoom = (e) => {\n\t\t\t// TODO: find a faster way to redraw the chart.\n\t\t\tthis.zooming = false;\n\t\t\tthis._updateScale(); // hacky way for restoring x scale when zooming out\n\t\t\tthis.zooming = true;\n\t\t\tthis._scales.distance = this._x = e.transform.rescaleX(this._x); // calculate x scale at zoom level\n\t\t\tthis._resetDrag();\n\t\t\tif (e.sourceEvent && e.sourceEvent.type == \"mousemove\") {\n\t\t\t\tthis._hideDiagramIndicator();\n\t\t\t}\n\t\t\tthis.fire('zoom');\n\t\t};\n\n\t\tzoom\n\t\t\t.scaleExtent([1, 10])\n\t\t\t.extent([\n\t\t\t\t[margin.left, 0],\n\t\t\t\t[this._width() - margin.right, this._height()]\n\t\t\t])\n\t\t\t.translateExtent([\n\t\t\t\t[margin.left, -Infinity],\n\t\t\t\t[this._width() - margin.right, Infinity]\n\t\t\t])\n\t\t\t.filter((e) => this._zoomEnabled && (e.shiftKey || e.buttons == 4))\n\t\t\t.on(\"start\", onStart)\n\t\t\t.on(\"end\", onEnd)\n\t\t\t.on(\"zoom\", onZoom);\n\n\t\tsvg.call(zoom); // add zoom functionality to \"svg\" group\n\n\t\t// d3.select(\"body\").on(\"keydown.grabzoom keyup.grabzoom\", (e) => svg.style('cursor', e.shiftKey ? 'move' : ''));\n\n\t},\n\n\t_initInteractions: function() {\n\t\tthis._initBrush();\n\t\tthis._initRuler();\n\t\tthis._initClipper();\n\t\tthis._initLegend();\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_initLegend: function() {\n\t\tthis._container.on('legend_clicked', (e) => {\n\t\t\tlet { path, legend, name, enabled } = e.detail;\n\n\t\t\tif (!path) return;\n\n\t\t\tlet label = _.select('text', legend);\n\t\t\tlet rect = _.select('rect', legend);\n\n\t\t\t_.toggleStyle(label, 'text-decoration-line', 'line-through', enabled);\n\t\t\t_.toggleStyle(rect, 'fill-opacity', '0', enabled);\n\t\t\t_.toggleClass(path, 'leaflet-hidden', enabled);\n\n\t\t\tthis._updateArea();\n\n\t\t\tthis.fire(\"elepath_toggle\", { path, name, legend, enabled })\n\t\t});\n\t},\n\n\t/**\n\t * Initialize \"ruler\".\n\t */\n\t_initRuler: function() {\n\t\tif (!this.options.ruler) return;\n\n\t\t// const yMax = this._height();\n\t\tconst formatNum = d3.format(\".0f\");\n\t\tconst drag = this._drag;\n\n\t\tconst label = (e, d) => {\n\t\t\tlet yMax = this._height();\n\t\t\tlet y = this._dragG.data()[0].y;\n\t\t\tif (y >= yMax || y <= 0) this._dragG.select(\".horizontal-drag-label\").text('');\n\t\t\tthis._hideDiagramIndicator();\n\t\t};\n\n\t\tconst position = (e, d) => {\n\t\t\tlet yMax = this._height();\n\t\t\tlet yCoord = d3.pointers(e, this._area.node())[0][1];\n\t\t\tlet y = yCoord > 0 ? (yCoord < yMax ? yCoord : yMax) : 0;\n\t\t\tlet z = this._y.invert(y);\n\t\t\tlet data = L.extend(this._dragG.data()[0], { y: y });\n\n\t\t\tthis._dragG\n\t\t\t\t.data([data])\n\t\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\")\n\t\t\t\t.classed('active', y < yMax);\n\n\t\t\tthis._container.select(\".horizontal-drag-label\")\n\t\t\t\t.text(formatNum(z) + \" \" + this._yLabel);\n\n\t\t\tthis.fire('ruler_filter', { coords: yCoord < yMax && yCoord > 0 ? this._findCoordsForY(yCoord) : [] });\n\t\t}\n\n\t\tdrag\n\t\t.on(\"start end\", label)\n\t\t.on(\"drag\", position);\n\n\t\tthis._dragG.call(drag);\n\n\t},\n\n\t/**\n\t * Initialize x and y scales\n\t */\n\t_initScale: function() {\n\t\tlet opts = this.options;\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : 'x',\n\t\t\tposition: 'bottom',\n\t\t\tattr : opts.xAttr,\n\t\t\tmin : opts.xAxisMin,\n\t\t\tmax : opts.xAxisMax,\n\t\t\tname : 'distance'\n\t\t});\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : 'y',\n\t\t\tposition : 'left',\n\t\t\tattr : opts.yAttr,\n\t\t\tmin : opts.yAxisMin,\n\t\t\tmax : opts.yAxisMax,\n\t\t\tname : 'altitude'\n\t\t});\n\n\t\tthis._x = this._scales.distance;\n\t\tthis._y = this._scales.altitude;\n\t},\n\n\t_registerAreaPath: function(props) {\n\t\tlet opts = this.options;\n\n\t\tif (!props.xAttr) props.xAttr = opts.xAttr;\n\t\tif (!props.yAttr) props.yAttr = opts.yAttr;\n\t\tif (typeof props.preferCanvas === \"undefined\") props.preferCanvas = opts.preferCanvas;\n\n\t\tlet path = D3.Path(props);\n\n\t\t// Save paths in memory for latter usage\n\t\tthis._paths[props.name] = path;\n\t\tthis._props.areas[props.name] = props;\n\n\t\tif (opts.legend) {\n\t\t\tthis._props.legendItems[props.name] = {\n\t\t\t\tname : props.name,\n\t\t\t\tlabel : props.label,\n\t\t\t\tcolor : props.color,\n\t\t\t\tpath : path\n\t\t\t};\n\t\t}\n\n\t},\n\n\t_registerAxisGrid: function(props) {\n\t\tthis._props.grids[props.name || props.axis] = props;\n\t},\n\n\t_registerAxisScale: function(props) {\n\t\tlet opts = this.options;\n\t\tlet scale = props.scale;\n\n\t\tif (typeof scale !== 'function') {\n\t\t\tscale = L.extend({\n\t\t\t\tdata : this._data,\n\t\t\t\tforceBounds: opts.forceAxisBounds\n\t\t\t}, scale);\n\n\t\t\tscale.attr = scale.attr || props.name;\n\n\t\t\tlet domain = this._domains[props.name] = D3.Domain(props);\n\t\t\tlet range = this._ranges[props.name] = D3.Range(props);\n\t\t\tscale.range = scale.range || range(this._width(),this._height());\n\t\t\tscale.domain = scale.domain || domain(this._data);\n\n\t\t\tthis._props.scales[props.name] = scale;\n\n\t\t\tprops.scale = this._scales[props.name] = D3.Scale(scale);\n\t\t}\n\n\t\tif (!props.ticks) {\n\t\t\tif (props.axis == 'x') props.ticks = opts.xTicks;\n\t\t\telse if (props.axis == 'y') props.ticks = opts.yTicks;\n\t\t}\n\n\t\tthis._props.axes[props.name] = props;\n\n\t\treturn scale;\n\t},\n\n\t/**\n\t * Add a waypoint of interest over the chart\n\t */\n\t_registerCheckPoint: function(point) {\n\t\tif (!this._data.length) return;\n\n\t\tlet item, x, y;\n\n\t\tif (point.latlng) {\n\t\t\titem = this._data[this._findIndexForLatLng(point.latlng)];\n\t\t\tx = this._x(item.dist);\n\t\t\ty = this._y(item.z);\n\t\t} else if (!isNaN(point.dist)) {\n\t\t\tx = this._x(point.dist);\n\t\t\titem = this._data[this._findIndexForXCoord(x)]\n\t\t\ty = this._y(item.z);\n\t\t} else\n\n\t\tif (isNaN(x) || isNaN(y)) return;\n\n\t\tif (!point.item || !point.item.property('isConnected')) {\n\t\t\tpoint.position = point.position || \"bottom\";\n\n\t\t\tpoint.item = this._point.append('g');\n\n\t\t\tpoint.item.append(\"svg:line\")\n\t\t\t\t.attr(\"y1\", 0)\n\t\t\t\t.attr(\"x1\", 0)\n\t\t\t\t.attr(\"style\",\"stroke: rgb(51, 51, 51); stroke-width: 0.5; stroke-dasharray: 2, 2;\");\n\n\t\t\tpoint.item\n\t\t\t\t.append(\"svg:circle\")\n\t\t\t\t.attr(\"class\", \" height-focus circle-lower\")\n\t\t\t\t.attr(\"r\", 3);\n\n\t\t\tif (point.label) {\n\t\t\t\tpoint.item.append(\"svg:text\")\n\t\t\t\t\t.attr(\"dx\", \"4px\")\n\t\t\t\t\t.attr(\"dy\", \"-4px\");\n\t\t\t}\n\t\t}\n\n\t\tpoint.item\n\t\t\t.datum({\n\t\t\t\tpos: point.position,\n\t\t\t\tx: x,\n\t\t\t\ty: y\n\t\t\t})\n\t\t\t.attr(\"class\", d => \"point \" + d.pos)\n\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\");\n\n\t\tpoint.item.select('line')\n\t\t\t.datum({\n\t\t\t\ty2: ({'top': -y, 'bottom': this._height() - y})[point.position],\n\t\t\t\tx2: ({'left': -x, 'right': this._width() - x})[point.position] || 0\n\t\t\t})\n\t\t\t.attr(\"y2\", d => d.y2)\n\t\t\t.attr(\"x2\", d => d.x2)\n\n\t\tif (point.label) {\n\t\t\tpoint.item.select('text')\n\t\t\t\t.text(point.label);\n\t\t}\n\n\t},\n\n\t_registerFocusLabel: function(props) {\n\t\tthis._props.focusLabels[props.name] = props;\n\t},\n\n\t_updateArea: function() {\n\t\tlet paths = this._paths;\n\t\t// Reset and update chart profiles\n\t\tthis._context.clearRect(0, 0, this._width(), this._height());\n\t\tfor (var i in paths) {\n\t\t\tif (!paths[i].classed('leaflet-hidden')) {\n\t\t\t\tthis._drawPath(i);\n\t\t\t}\n\t\t}\n\t},\n\n\t_updateAxis: function() {\n\n\t\tlet opts = this.options;\n\n\t\t// Reset chart axis.\n\t\tthis._grid.selectAll('g').remove();\n\t\tthis._axis.selectAll('g').remove();\n\n\t\tlet grids = this._props.grids;\n\t\tlet axes = this._props.axes;\n\t\tlet props, axis, grid;\n\n\t\tlet gridOpts = {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t\ttickFormat: \"\",\n\t\t};\n\t\tlet axesOpts = {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t};\n\n\t\t// Render grids\n\t\tfor (let i in grids) {\n\t\t\tprops = L.extend({}, gridOpts, grids[i]);\n\t\t\tgrid = D3.Grid(props);\n\t\t\tthis._grid.call(grid);\n\t\t}\n\n\t\t// Render axis\n\t\tfor (let i in axes) {\n\t\t\tif (opts[i] === false || opts[i] === 'summary') continue;\n\t\t\tprops = L.extend({}, axesOpts, axes[i]);\n\t\t\taxis = D3.Axis(props);\n\t\t\tthis._axis.call(axis);\n\t\t}\n\n\t\t// Adjust axis scale positions\n\t\tthis._axis\n\t\t\t.selectAll('.y.axis.right')\n\t\t\t.each((d, i, n) => {\n\n\t\t\t\tlet axis = d3.select(n[i]);\n\t\t\t\tlet transform = axis.attr('transform');\n\t\t\t\tlet translate = transform.substring(transform.indexOf(\"(\") + 1, transform.indexOf(\")\")).split(\",\");\n\n\t\t\t\taxis.attr('transform', 'translate(' + (+translate[0] + (i * 40)) + ',' + translate[1] + ')')\n\n\t\t\t\tif (i > 0) {\n\t\t\t\t\taxis.select(':scope > path') .attr('opacity', 0.25);\n\t\t\t\t\taxis.selectAll(':scope > .tick line').attr('opacity', 0.75);\n\t\t\t\t}\n\n\t\t\t});\n\n\t},\n\n\t_updateClipper: function() {\n\t\tlet margin = this.options.margins;\n\n\t\tthis._zoom\n\t\t\t.scaleExtent([1, 10])\n\t\t\t.extent([\n\t\t\t\t[margin.left, 0],\n\t\t\t\t[this._width() - margin.right, this._height()]\n\t\t\t])\n\t\t\t.translateExtent([\n\t\t\t\t[margin.left, -Infinity],\n\t\t\t\t[this._width() - margin.right, Infinity]\n\t\t\t]);\n\n\t},\n\n\t_updateLegend: function () {\n\n\t\tif (this.options.legend == false) return;\n\n\t\tlet legends = this._props.legendItems;\n\t\tlet legend;\n\n\t\t// Reset legend items\n\t\tthis._legend.selectAll('g').remove();\n\t\tfor (var i in legends) {\n\t\t\tlegend = D3.LegendItem(\n\t\t\t\tL.extend({\n\t\t\t\t\twidth : this._width(),\n\t\t\t\t\theight : this._height(),\n\t\t\t\t\tmargins: this.options.margins,\n\t\t\t\t}, legends[i])\n\t\t\t)\n\t\t\tthis._legend.append(\"g\").call(legend);\n\t\t}\n\n\t\t// Get legend items\n\t\tlet items = this._legend.selectAll('.legend-item');\n\n\t\t// Calculate legend item positions\n\t\tlet n = items.nodes().length;\n\t\tlet v = Array(Math.floor(n / 2)).fill(null).map((d, i) => (i + 1) * 2 - (1 - Math.sign(n % 2)));\n\t\tlet rev = v.slice().reverse().map((d) => -(d));\n\n\t\tif (n % 2 !== 0) {\n\t\t\trev.push(0);\n\t\t}\n\t\tv = rev.concat(v);\n\n\t\t// Get chart margins\n\t\tlet xAxesB = this._axis.selectAll('.x.axis.bottom').nodes().length;\n\t\tlet marginB = 30 + (xAxesB * 2);\n\t\tlet marginR = n * 30;\n\n\t\t// Adjust chart right margins\n\t\tif (n && this.options.margins.right < marginR) {\n\t\t\tthis.options.margins.right = marginR;\n\t\t\tthis.fire('margins_updated');\n\t\t}\n\n\t\t// Adjust chart bottom margins\n\t\tif(xAxesB && this.options.margins.bottom < marginB) {\n\t\t\tthis.options.margins.bottom = marginB;\n\t\t\tthis.fire('margins_updated');\n\t\t}\n\n\t\titems\n\t\t\t.each((d, i, n) => {\n\n\t\t\t\tlet legend = d3.select(n[i]);\n\t\t\t\tlet rect = legend.select('rect');\n\t\t\t\tlet name = legend.attr('data-name');\n\t\t\t\tlet path = this._paths[name];\n\n\t\t\t\tlet tx = v[i] * 55;\n\t\t\t\tlet ty = xAxesB * 2;\n\n\t\t\t\tlegend\n\n\t\t\t\t// Adjust legend item positions\n\t\t\t\t.attr(\"transform\", \"translate(\" + tx + \", \" + ty + \")\");\n\n\t\t\t\t// Set initial state (disabled controls)\n\t\t\t\tif (name in this.options && this.options[name] == 'disabled') {\n\t\t\t\t\tpath.classed('leaflet-hidden', true);\n\t\t\t\t\tlegend.select('text').style('text-decoration-line', 'line-through');\n\t\t\t\t\tlegend.select('rect').style('fill-opacity', '0');\n\t\t\t\t}\n\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._clipPath) {\n\t\t\t\t\tpath.attr('clip-path', 'url(#' + this._clipPath.attr('id') + ')');\n\t\t\t\t}\n\n\t\t\t});\n\t},\n\n\t_updateScale: function() {\n\t\tif (this.zooming) return { x: this._x, y: this._y };\n\n\t\tlet opts = this.options;\n\n\t\tlet scales = this._scales;\n\t\tlet d = this._domains;\n\t\tlet r = this._ranges;\n\n\t\tfor (let i in scales) {\n\t\t\tscales[i]\n\t\t\t.domain(d[i](this._data))\n\t\t\t.range(r[i](this._width(), this._height()))\n\t\t}\n\n\t\treturn { x: this._x, y: this._y };\n\t},\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\treturn this._chart._width;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\treturn this._chart._height;\n\t},\n\n\t/*\n\t * Finds data entries above a given y-elevation value and returns geo-coordinates\n\t */\n\t_findCoordsForY: function(y) {\n\t\tlet data = this._data;\n\t\tlet z = this._y.invert(y);\n\n\t\t// save indexes of elevation values above the horizontal line\n\t\tconst list = data.reduce((array, item, index) => {\n\t\t\tif (item.z >= z) array.push(index);\n\t\t\treturn array;\n\t\t}, []);\n\n\t\tlet start = 0;\n\t\tlet next;\n\n\t\t// split index list into blocks of coordinates\n\t\tconst coords = list.reduce((array, _, curr) => {\n\t\t\tnext = curr + 1;\n\t\t\tif (list[next] !== list[curr] + 1 || next === list.length) {\n\t\t\t\tarray.push(\n\t\t\t\t\tlist\n\t\t\t\t\t.slice(start, next)\n\t\t\t\t\t.map(i => data[i].latlng)\n\t\t\t\t);\n\t\t\t\tstart = next;\n\t\t\t}\n\t\t\treturn array;\n\t\t}, []);\n\n\t\treturn coords;\n\t},\n\n\t/*\n\t * Finds a data entry for a given x-coordinate of the diagram\n\t */\n\t_findIndexForXCoord: function(x) {\n\t\treturn d3\n\t\t\t.bisector(d => d[this.options.xAttr])\n\t\t\t.left(this._data || [0, 1], this._x.invert(x));\n\t},\n\n\t/*\n\t * Finds a data entry for a given latlng of the map\n\t */\n\t_findIndexForLatLng: function(latlng) {\n\t\tlet result = null;\n\t\tlet d = Infinity;\n\t\tthis._data.forEach((item, index) => {\n\t\t\tlet dist = latlng.distanceTo(item.latlng);\n\t\t\tif (dist < d) {\n\t\t\t\td = dist;\n\t\t\t\tresult = index;\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t},\n\n\t/*\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\n\t */\n\t_resetDrag: function() {\n\t\tif (this._chart.panes.brush.select(\".selection\").attr('width')) {\n\t\t\tthis._chart.panes.brush.call(this._brush.clear);\n\t\t\tthis._hideDiagramIndicator();\n\t\t\tthis.fire('reset_drag');\n\t\t}\n\t},\n\n\t_resetZoom: function() {\n\t\tif (this._zoom) {\n\t\t\tthis._zoom.transform(this._chart.svg, d3.zoomIdentity);\n\t\t}\n\t},\n\n\t/**\n\t * Display distance and altitude level (\"focus-rect\").\n\t */\n\t_showDiagramIndicator: function(item, xCoordinate) {\n\t\tlet opts = this.options;\n\t\tlet yCoordinate = this._y(item[opts.yAttr]);\n\n\t\tthis._focusG.attr(\"display\", null);\n\n\t\tthis._focusline.call(\n\t\t\tD3.MouseFocusLine({\n\t\t\t\txCoord: xCoordinate,\n\t\t\t\theight: this._height()\n\t\t\t})\n\t\t);\n\t\tthis._focuslabel.call(\n\t\t\tD3.MouseFocusLabel({\n\t\t\t\txCoord: xCoordinate,\n\t\t\t\tyCoord: yCoordinate,\n\t\t\t\theight: this._height(),\n\t\t\t\twidth : this._width(),\n\t\t\t\tlabelX: d3.format(\".\"+ opts.decimalsX +\"f\")(item[opts.xAttr]) + \" \" + this._xLabel,\n\t\t\t\tlabelY: d3.format(\".\"+ opts.decimalsY +\"f\")(item[opts.yAttr]) + \" \" + this._yLabel\n\t\t\t})\n\t\t);\n\n\t\t// this._focuslabel.selectAll('tspan').data(Object.values(this._focuslabels));\n\n\t\tlet labels = this._props.focusLabels;\n\t\tlet tooltip = this._focuslabel.select('text');\n\t\tlet label;\n\n\t\tfor (var i in labels) {\n\t\t\tlabel = tooltip.select(\".mouse-focus-label-\" + labels[i].name);\n\n\t\t\tif (!label.size()) {\n\t\t\t\tlabel = tooltip.append(\"svg:tspan\", \".mouse-focus-label-x\")\n\t\t\t\t\t.attr(\"class\", \"mouse-focus-label-\" + labels[i].name)\n\t\t\t\t\t.attr(\"dy\", \"1.5em\");\n\t\t\t}\n\n\t\t\tlabel.text(typeof labels[i].value !== \"function\" ? labels[i].value : labels[i].value(item) );\n\n\t\t\tthis._focuslabel.select('.mouse-focus-label-x')\n\t\t\t\t.attr(\"dy\", \"1.5em\");\n\t\t}\n\n\t},\n\n\t_hideDiagramIndicator: function() {\n\t\tthis._focusG.attr(\"display\", 'none');\n\t},\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Marker = L.Class.extend({\n\n\tinitialize: function(options) {\n\t\tthis.options = options;\n\n\t\tif (this.options.imperial) {\n\t\t\tthis._xLabel = \"mi\";\n\t\t\tthis._yLabel = \"ft\";\n\t\t} else {\n\t\t\tthis._xLabel = this.options.xLabel;\n\t\t\tthis._yLabel = this.options.yLabel;\n\t\t}\n\n\t\tif (this.options.marker == 'elevation-line') {\n\t\t\t// this._container = d3.create(\"g\").attr(\"class\", \"height-focus-group\");\n\t\t\tthis._focusline = d3.create('svg:line');\n\t\t\tthis._focusmarker = d3.create(\"svg:circle\");\n\t\t\tthis._focuslabel = d3.create(\"svg:text\");\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\t// this._marker = L.circleMarker([0, 0], { pane: 'overlayPane', radius: 6, fillColor: '#fff', fillOpacity:1, color: '#000', weight:1, interactive: false });\n\t\t\tthis._marker = L.marker([0, 0], { icon: this.options.markerIcon, zIndexOffset: 1000000, interactive: false });\n\t\t}\n\n\t\tthis._focuslabels = {};\n\n\t\treturn this;\n\t},\n\n\taddTo: function(map) {\n\t\tthis._map = map;\n\t\tif (this.options.marker == 'elevation-line') {\n\t\t\tlet g = this._container = d3.select(map.getPane('elevationPane')).select(\"svg > g\")\n\t\t\t\t.attr(\"class\", \"height-focus-group\");\n\t\t\tg.append(() => this._focusline.node());\n\t\t\tg.append(() => this._focusmarker.node());\n\t\t\tg.append(() => this._focuslabel.node());\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\tthis._marker.addTo(map, { pane: 'overlayPane' });\n\t\t}\n\t\treturn this;\n\t},\n\n\t/**\n\t * Update position marker (\"leaflet-marker\").\n\t */\n\tupdate: function(props) {\n\t\tif (props) this._props = props;\n\t\telse props = this._props;\n\n\t\tif(!props) return;\n\n\t\tif (props.options) this.options = props.options;\n\t\tif (!this._map) this.addTo(props.map);\n\n\t\tlet opts = this.options;\n\t\tlet map = this._map;\n\n\t\tthis._latlng = props.item.latlng;\n\n\t\tlet pos = map.latLngToLayerPoint(this._latlng);\n\n\t\tif (map._rotate) {\n\t\t\tpos = map.rotatedPointToMapPanePoint(pos);\n\t\t}\n\n\t\tlet point = L.extend({}, props.item, pos);\n\n\t\tif (this.options.marker == 'elevation-line') {\n\n\t\t\tlet normalizedAlt = this._height() / props.maxElevation * point.z;\n\t\t\tlet normalizedY = point.y - normalizedAlt;\n\n\t\t\tthis._container.classed(\"leaflet-hidden\", false);\n\n\t\t\tthis._focusmarker\n\t\t\t\t.call(\n\t\t\t\t\tD3.HeightFocusMarker({\n\t\t\t\t\t\ttheme : opts.theme,\n\t\t\t\t\t\txCoord: point.x,\n\t\t\t\t\t\tyCoord: point.y,\n\t\t\t\t\t}));\n\n\t\t\tthis._focusline\n\t\t\t\t.call(\n\t\t\t\t\tD3.HeightFocusLine({\n\t\t\t\t\t\ttheme : opts.theme,\n\t\t\t\t\t\txCoord: point.x,\n\t\t\t\t\t\tyCoord: point.y,\n\t\t\t\t\t\tlength: normalizedY\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\tthis._focuslabel\n\t\t\t\t.call(\n\t\t\t\t\tD3.HeightFocusLabel({\n\t\t\t\t\t\ttheme : opts.theme,\n\t\t\t\t\t\txCoord: point.x,\n\t\t\t\t\t\tyCoord: normalizedY,\n\t\t\t\t\t\tlabel : d3.format(\".\" + opts.decimalsY + \"f\")(point[opts.yAttr]) + \" \" + this._yLabel\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\tlet labels = this._focuslabels;\n\t\t\tlet tooltip = this._focuslabel;\n\t\t\tlet label;\n\n\t\t\tfor (var i in labels) {\n\t\t\t\tlabel = tooltip.select(\".height-focus-\" + labels[i].name);\n\n\t\t\t\tif (!label.size()) {\n\t\t\t\t\tlabel = tooltip.append(\"svg:tspan\")\n\t\t\t\t\t\t.attr(\"class\", \"height-focus-\" + labels[i].name)\n\t\t\t\t\t\t.attr(\"dy\", \"1.5em\");\n\t\t\t\t}\n\n\t\t\t\tlabel.text(typeof labels[i].value !== \"function\" ? labels[i].value : labels[i].value(props.item) );\n\n\t\t\t\tthis._focuslabel.select('.height-focus-y')\n\t\t\t\t\t.attr(\"dy\", \"-1.5em\");\n\t\t\t}\n\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\t_.removeClass(this._marker.getElement(), 'leaflet-hidden');\n\t\t\tthis._marker.setLatLng(this._latlng);\n\t\t}\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\tremove: function() {\n\t\tthis._props = null;\n\t\tif (this.options.marker == 'elevation-line') {\n\t\t\tif (this._container) this._container.classed(\"leaflet-hidden\", true);\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\t_.addClass(this._marker.getElement(), 'leaflet-hidden');\n\t\t}\n\t},\n\n\tgetLatLng: function() {\n\t\treturn this._latlng;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\tlet opts = this.options;\n\t\treturn opts.height - opts.margins.top - opts.margins.bottom;\n\t},\n\n\t_registerFocusLabel: function(props) {\n\t\tthis._focuslabels[props.name] = props;\n\t}\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Summary = L.Class.extend({\n\tinitialize: function(opts, control) {\n\t\tthis.options = opts;\n\t\tthis.control = control;\n\n\t\tlet summary = this._container = _.create(\"div\", \"elevation-summary \" + (opts.summary ? opts.summary + \"-summary\" : ''));\n\t\t_.style(summary, 'max-width', opts.width ? opts.width + 'px' : '');\n\t},\n\n\trender: function() {\n\t\treturn container => container.append(() => this._container);\n\t},\n\n\treset: function() {\n\t\tthis._container.innerHTML = '';\n\t},\n\n\tappend: function(className, label, value) {\n\t\tthis._container.innerHTML += `<span class=\"${className}\"><span class=\"summarylabel\">${label}</span><span class=\"summaryvalue\">${value}</span></span>`;\n\t\treturn this;\n\t},\n\n\t_registerSummary: function(data) {\n\t\tfor (let i in data) {\n\t\t\tthis.append(i, L._(data[i].label), typeof data[i].value !== \"function\" ? data[i].value : data[i].value(this.control.track_info));\n\t\t}\n\t}\n\n});\n","import * as _ from './utils';\n\nexport var Options = {\n\tautofitBounds: true,\n\tautohide: !L.Browser.mobile,\n\tautohideMarker: true,\n\talmostover: true,\n\taltitude: true,\n\tcollapsed: false,\n\tdetached: true,\n\tdistance: true,\n\tdistanceFactor: 1,\n\tdistanceMarkers: false,\n\tdecimalsX: 2,\n\tdecimalsY: 0,\n\tdragging: !L.Browser.mobile,\n\tdownloadLink: 'link',\n\televationDiv: \"#elevation-div\",\n\tfollowMarker: true,\n\tforceAxisBounds: false,\n\theight: 200,\n\theightFactor: 1,\n\timperial: false,\n\tinterpolation: \"curveLinear\",\n\tlazyLoadJS: true,\n\tlegend: true,\n\tloadData: {\n\t\tdefer: false,\n\t\tlazy: false,\n\t},\n\tmargins: {\n\t\ttop: 30,\n\t\tright: 30,\n\t\tbottom: 30,\n\t\tleft: 40\n\t},\n\tmarker: 'elevation-line',\n\tmarkerIcon: L.divIcon({\n\t\tclassName: 'elevation-position-marker',\n\t\thtml: '<i class=\"elevation-position-icon\"></i>',\n\t\ticonSize: [32, 32],\n\t\ticonAnchor: [16, 16],\n\t}),\n\tplaceholder: false,\n\tposition: \"topright\",\n\tpolyline: {\n\t\tclassName: 'elevation-polyline',\n\t\tcolor: '#000',\n\t\topacity: 0.75,\n\t\tweight: 5,\n\t\tlineCap: 'round'\n\t},\n\tpolylineSegments: {\n\t\tclassName: 'elevation-polyline-segments',\n\t\tcolor: '#F00',\n\t\tinteractive: false,\n\t},\n\tpreferCanvas: false,\n\treverseCoords: false,\n\truler: true,\n\tskipNullZCoords: false,\n\ttheme: \"lightblue-theme\",\n\tresponsive: true,\n\tsummary: 'inline',\n\tslope: false,\n\tspeed: false,\n\tsLimit: undefined,\n\ttime: false,\n\ttimeFactor: 3600,\n\ttimeFormat: false,\n\tsDeltaMax: undefined,\n\tsInterpolation: \"curveStepAfter\",\n\tsRange: undefined,\n\twidth: 600,\n\twaypoints: true,\n\twptIcons: {\n\t\t'': L.divIcon({\n\t\t\tclassName: 'elevation-waypoint-marker',\n\t\t\thtml: '<i class=\"elevation-waypoint-icon\"></i>',\n\t\t\ticonSize: [30, 30],\n\t\t\ticonAnchor: [8, 30],\n\t\t}),\n\t},\n\txAttr: \"dist\",\n\txLabel: \"km\",\n\txTicks: undefined,\n\tyAttr: \"z\",\n\tyAxisMax: undefined,\n\tyAxisMin: undefined,\n\tyLabel: \"m\",\n\tyTicks: undefined,\n\tzFollow: false,\n\tzooming: !L.Browser.Mobile,\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Chart } from './chart';\nimport { Marker } from './marker';\nimport { Summary } from './summary';\nimport { Options } from './options';\n\nexport const Elevation = L.Control.Elevation = L.Control.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\toptions: Options,\n\t__mileFactor: 0.621371,\n\t__footFactor: 3.28084,\n\t__D3: 'https://unpkg.com/d3@6.5.0/dist/d3.min.js',\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@4.3.0/dist/togeojson.umd.js',\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\n\t__LDISTANCEM: 'https://unpkg.com/@raruto/leaflet-elevation@1.7.3/libs/leaflet-distance-marker.min.js',\n\n\t/*\n\t * Add data to the diagram either from GPX or GeoJSON and update the axis domain and data\n\t */\n\taddData: function(d, layer) {\n\t\tif (typeof layer === \"undefined\" && d.on) {\n\t\t\tlayer = d;\n\t\t}\n\t\tElevation._d3LazyLoader = _.lazyLoader(\n\t\t\tthis.__D3,\n\t\t\ttypeof d3 !== 'object' || !this.options.lazyLoadJS,\n\t\t\tElevation._d3LazyLoader\n\t\t).then(() => {\n\t\t\tthis._addData(d);\n\t\t\tthis._addLayer(layer);\n\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\n\t\t});\n\t},\n\n\t/**\n\t * Adds the control to the given map.\n\t */\n\taddTo: function(map) {\n\t\tif (this.options.detached) {\n\t\t\tlet eleDiv = this._initElevationDiv();\n\t\t\tif (!eleDiv.isConnected) _.insert(map.getContainer(), eleDiv, 'afterend');\n\t\t\t_.append(eleDiv, this.onAdd(map));\n\t\t} else {\n\t\t\tL.Control.prototype.addTo.call(this, map);\n\t\t}\n\t\treturn this;\n\t},\n\n\t/*\n\t * Reset data and display\n\t */\n\tclear: function() {\n\t\tif (this._marker) this._marker.remove();\n\t\tif (this._chart) this._clearChart();\n\t\tif (this._layers) this._clearLayers();\n\t\tif (this._markers) this._clearMarkers();\n\n\t\tthis._data = [];\n\t\tthis.track_info = {};\n\n\t\tthis._fireEvt(\"eledata_clear\");\n\n\t\tthis._updateChart();\n\t},\n\n\t_clearChart: function() {\n\t\tif (this._events && this._events.elechart_updated) {\n\t\t\tthis._events.elechart_updated.forEach(e => controlElevation.off('elechart_updated', e.fn, e.ctx));\n\t\t}\n\t\tif (this._chart && this._chart._container) {\n\t\t\tthis._chart._container.selectAll('g.point .point').remove();\n\t\t\tthis._chart.clear();\n\t\t}\n\t},\n\n\t_clearLayers: function() {\n\t\tif (this._layers && this._layers.eachLayer) {\n\t\t\tthis._layers.eachLayer(l => l.remove())\n\t\t\tthis._layers.clearLayers();\n\t\t}\n\t},\n\n\t_clearMarkers: function() {\n\t\tif (this._markers && this._markers.eachLayer) {\n\t\t\tthis._markers.eachLayer(l => l.remove())\n\t\t\tthis._markers.clearLayers();\n\t\t}\n\t},\n\n\t/**\n\t * Disable chart brushing.\n\t */\n\tdisableBrush: function() {\n\t\tthis._chart._brushEnabled = false;\n\t\tthis._resetDrag();\n\t},\n\n\t/**\n\t * Enable chart brushing.\n\t */\n\tenableBrush: function() {\n\t\tthis._chart._brushEnabled = true;\n\t},\n\n\t/**\n\t * Alias for enableBrush\n\t */\n\tenableDragging: function() {\n\t\tthis.enableBrushing();\n\t},\n\n\t/**\n\t * Alias for disableBrush\n\t */\n\tdisableDragging: function() {\n\t\tthis.disableBrushing();\n\t},\n\n\t/**\n\t * Disable chart zooming.\n\t */\n\tdisableZoom: function() {\n\t\tthis._chart._zoomEnabled = false;\n\t\tthis._chart._resetZoom();\n\t},\n\n\t/**\n\t * Enable chart zooming.\n\t */\n\tenableZoom: function() {\n\t\tthis._chart._zoomEnabled = true;\n\t},\n\n\t/**\n\t * Sets a map view that contains the given geographical bounds.\n\t */\n\tfitBounds: function(bounds) {\n\t\tbounds = bounds || this.getBounds();\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\n\t},\n\n\tgetBounds: function(data) {\n\t\tdata = data || this._data;\n\t\treturn L.latLngBounds(data.map((d) => d.latlng));\n\t},\n\n\t/**\n\t * Get default zoom level when \"followMarker\" is true.\n\t */\n\tgetZFollow: function() {\n\t\treturn this._zFollow;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\thide: function() {\n\t\t_.style(this._container, \"display\", \"none\");\n\t},\n\n\t/**\n\t * Initialize chart control \"options\" and \"container\".\n\t */\n\tinitialize: function(options) {\n\t\tthis._data = [];\n\t\tthis._layers = L.featureGroup();\n\t\tthis._markers = L.featureGroup();\n\t\tthis._markedSegments = L.polyline([]);\n\t\tthis._chartEnabled = true,\n\n\t\tthis.track_info = {};\n\n\t\tthis.options = _.deepMerge({}, this.options, options);\n\n\t\tthis._zFollow = this.options.zFollow;\n\n\t\tif (this.options.followMarker) this._setMapView = L.Util.throttle(this._setMapView, 300, this);\n\t\tif (this.options.placeholder) this.options.loadData.lazy = this.options.loadData.defer = true;\n\n\t\tif (this.options.legend) this.options.margins.bottom += 30;\n\n\t\tif (this.options.theme) this.options.polylineSegments.className += ' ' + this.options.theme;\n\n\t\tthis._markedSegments.setStyle(this.options.polylineSegments);\n\n\t\t// this._resizeChart = _.debounce(this._resizeChart, 300, this);\n\t\t// this._resizeChart = L.Util.throttle(this._resizeChart, 300, this);\n\n\t\t// if (L.Browser.mobile) {\n\t\t// \tthis._updateChart = _.debounce(this._updateChart, 300, this);\n\t\t// \tthis._updateSummary = _.debounce(this._updateSummary, 300, this);\n\t\t// }\n\n\t\t// Leaflet canvas renderer colors\n\t\tL.extend(D3.Colors, this.options.colors || {});\n\t},\n\n\t/**\n\t * Alias for loadData\n\t */\n\tload: function(data, opts) {\n\t\tthis.loadData(data, opts);\n\t},\n\n\t/**\n\t * Alias for addTo\n\t */\n\tloadChart: function(map) {\n\t\tthis.addTo(map);\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON or KML).\n\t */\n\tloadData: function(data, opts) {\n\t\topts = L.extend({}, this.options.loadData, opts);\n\t\tif (opts.defer) {\n\t\t\tthis.loadDefer(data, opts);\n\t\t} else if (opts.lazy) {\n\t\t\tthis.loadLazy(data, opts);\n\t\t} else if (_.isXMLDoc(data)) {\n\t\t\tthis.loadXML(data);\n\t\t} else if (_.isJSONDoc(data)) {\n\t\t\tthis.loadGeoJSON(data);\n\t\t} else {\n\t\t\tthis.loadFile(data);\n\t\t}\n\t},\n\n\t/**\n\t * Wait for document load before download data.\n\t */\n\tloadDefer: function(data, opts) {\n\t\topts = L.extend({}, this.options.loadData, opts);\n\t\topts.defer = false;\n\t\t_.deferFunc(L.bind(this.loadData, this, data, opts));\n\t},\n\n\t/**\n\t * Load data from a remote url.\n\t */\n\tloadFile: function(url) {\n\t\tfetch(url)\n\t\t\t.then((response) => response.text())\n\t\t\t.then((data) => {\n\t\t\t\tthis._downloadURL = url; // TODO: handle multiple urls?\n\t\t\t\tthis.loadData(data, { lazy: false, defer: false });\n\t\t\t})\n\t\t\t.catch((err) => console.warn(err));\n\t},\n\n\t/**\n\t * Load raw GeoJSON data.\n\t */\n\tloadGeoJSON: function(data) {\n\t\t_.GeoJSONLoader(data, this);\n\t},\n\n\t/**\n\t * Alias for loadXML\n\t */\n\tloadGPX: function(data){\n\t\tthis.loadXML(data);\n\t},\n\n\t/**\n\t * Load raw XML data.\n\t */\n\tloadXML: function(data) {\n\t\tElevation._togeojsonLazyLoader = _.lazyLoader(\n\t\t\tthis.__TOGEOJSON,\n\t\t\ttypeof toGeoJSON !== 'function' || !this.options.lazyLoadJS,\n\t\t\tElevation._togeojsonLazyLoader\n\t\t).then(\n\t\t\t() => {\n\t\t\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\n\t\t\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\n\t\t\t\tif (!(type in toGeoJSON)) {\n\t\t\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\n\t\t\t\t}\n\t\t\t\tlet geojson = toGeoJSON[type](xml);\n\t\t\t\tlet name = xml.getElementsByTagName('name');\n\t\t\t\tif(name[0]) { geojson.name = name[0].innerHTML; }\n\t\t\t\telse if(this._downloadURL) { geojson.name = this._downloadURL.split('/').pop().split('#')[0].split('?')[0]; }\n\n\t\t\t\treturn this.loadGeoJSON(geojson, this);\n\t\t\t}\n\t\t);\n\t},\n\n\t/**\n\t * Wait for chart container visible before download data.\n\t */\n\tloadLazy: function(data, opts) {\n\t\topts = L.extend({}, this.options.loadData, opts);\n\t\tlet elem = opts.lazy.parentNode ? opts.lazy : this.placeholder;\n\t\t_.waitHolder(elem)\n\t\t\t.then(() => {\n\t\t\t\topts.lazy = false;\n\t\t\t\tthis.loadData(data, opts)\n\t\t\t\tthis.once('eledata_loaded', () => this.placeholder.parentNode.removeChild(elem));\n\t\t\t});\n\t},\n\n\t/**\n\t * Create container DOM element and related event listeners.\n\t * Called on control.addTo(map).\n\t */\n\tonAdd: function(map) {\n\t\tthis._map = map;\n\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control elevation \" + this.options.theme);\n\n\t\tif (!this.options.detached) {\n\t\t\t_.addClass(container, 'leaflet-control');\n\t\t}\n\n\t\tif (this.options.placeholder && !this._data.length) {\n\t\t\tthis.placeholder = _.create('img', 'elevation-placeholder', typeof this.options.placeholder === 'string' ? { src: this.options.placeholder, alt: '' } : this.options.placeholder);\n\t\t\t_.insert(container, this.placeholder, 'afterbegin');\n\t\t}\n\n\t\tElevation._d3LazyLoader = _.lazyLoader(\n\t\t\tthis.__D3,\n\t\t\ttypeof d3 !== 'object' || !this.options.lazyLoadJS,\n\t\t\tElevation._d3LazyLoader\n\t\t).then(() => {\n\t\t\tthis._initButton(container);\n\t\t\tthis._initChart(container);\n\t\t\tthis._initSummary(container);\n\t\t\tthis._initMarker(map);\n\t\t\tthis._initLayer(map);\n\n\t\t\tmap\n\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t\t.on('resize', this._resetView, this)\n\t\t\t\t.on('resize', this._resizeChart, this)\n\t\t\t\t.on('rotate', this._rotateMarker, this)\n\t\t\t\t.on('mousedown', this._resetDrag, this);\n\n\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\n\n\t\t\tthis\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\n\n\t\t\tthis._updateChart();\n\t\t\tthis._updateSummary();\n\t\t});\n\n\t\treturn container;\n\t},\n\n\t/**\n\t * Clean up control code and related event listeners.\n\t * Called on control.remove().\n\t */\n\tonRemove: function(map) {\n\t\tthis._container = null;\n\n\t\tmap\n\t\t\t.off('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t.off('resize', this._resetView, this)\n\t\t\t.off('resize', this._resizeChart, this)\n\t\t\t.off('mousedown', this._resetDrag, this);\n\n\t\t_.off(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t_.off(map.getContainer(), 'touchstart', this._resetDrag, this);\n\n\t\tthis\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\n\t},\n\n\t/**\n\t * Redraws the chart control. Sometimes useful after screen resize.\n\t */\n\tredraw: function() {\n\t\tthis._resizeChart();\n\t},\n\n\t/**\n\t * Set default zoom level when \"followMarker\" is true.\n\t */\n\tsetZFollow: function(zoom) {\n\t\tthis._zFollow = zoom;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\tshow: function() {\n\t\t_.style(this._container, \"display\", \"block\");\n\t},\n\n\t/*\n\t * Parsing data either from GPX or GeoJSON and update the diagram data\n\t */\n\t_addData: function(d) {\n\t\tif (!d) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet geom = d.geometry;\n\t\tif (geom) {\n\t\t\tswitch (geom.type) {\n\t\t\t\tcase 'LineString':\n\t\t\t\t\tthis._addGeoJSONData(geom.coordinates);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'MultiLineString':\n\t\t\t\t\t_.each(geom.coordinates, coords => this._addGeoJSONData(coords));\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn('Unsopperted GeoJSON feature geometry type:' + geom.type);\n\t\t\t}\n\t\t}\n\n\t\tif (d.type === \"FeatureCollection\") {\n\t\t\t_.each(d.features, feature => this._addData(feature));\n\t\t}\n\n\t\tif (d._latlngs) {\n\t\t\tthis._addGPXData(d._latlngs);\n\t\t}\n\t},\n\n\t/*\n\t * Parsing of GeoJSON data lines and their elevation in z-coordinate\n\t */\n\t_addGeoJSONData: function(coords) {\n\t\t_.each(coords, point => {\n\t\t\tthis._addPoint(point[1], point[0], point[2]);\n\t\t\tthis._fireEvt(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\t\t});\n\t\tthis._fireEvt(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\n\t},\n\n\t/*\n\t * Parsing function for GPX data and their elevation in z-coordinate\n\t */\n\t_addGPXData: function(coords) {\n\t\t_.each(coords, point => {\n\t\t\tthis._addPoint(point.lat, point.lng, typeof point.alt !== \"undefined\" ? point.alt : point.meta.ele);\n\t\t\tthis._fireEvt(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\t\t});\n\t\tthis._fireEvt(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\n\t},\n\n\t/*\n\t * Parse and push a single (x, y, z) point to current elevation profile.\n\t */\n\t_addPoint: function(x, y, z) {\n\t\tif (this.options.reverseCoords) {\n\t\t\t[x, y] = [y, x];\n\t\t}\n\n\t\tthis._data.push({\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t\tz: z,\n\t\t\tlatlng: L.latLng(x, y, z)\n\t\t});\n\n\t\tthis._fireEvt(\"eledata_updated\", { index: this._data.length - 1 });\n\t},\n\n\t_addLayer: function(layer) {\n\t\tif (layer) this._layers.addLayer(layer)\n\t},\n\n\t_addMarker: function(marker) {\n\t\tif (marker) this._markers.addLayer(marker)\n\t},\n\n\t/**\n\t * Adds the control to the given \"detached\" div.\n\t */\n\t_initElevationDiv: function() {\n\t\tlet eleDiv = _.select(this.options.elevationDiv);\n\t\tif (!eleDiv) {\n\t\t\tthis.options.elevationDiv = '#elevation-div_' + _.randomId();\n\t\t\teleDiv = _.create('div', 'leaflet-control elevation elevation-div', { id: this.options.elevationDiv.substr(1) });\n\t\t}\n\t\tif (this.options.detached) {\n\t\t\t_.replaceClass(eleDiv, 'leaflet-control', 'elevation-detached');\n\t\t}\n\t\tthis.eleDiv = eleDiv;\n\t\treturn this.eleDiv;\n\t},\n\n\t/*\n\t * Collapse current chart control.\n\t */\n\t_collapse: function() {\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\n\t},\n\n\t/*\n\t * Expand current chart control.\n\t */\n\t_expand: function() {\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\n\t},\n\n\t/*\n\t * Finds a data entry for the given LatLng\n\t */\n\t_findItemForLatLng: function(latlng) {\n\t\treturn this._data[this._chart._findIndexForLatLng(latlng)];\n\t},\n\n\t/*\n\t * Finds a data entry for the given xDiagCoord\n\t */\n\t_findItemForX: function(x) {\n\t\treturn this._data[this._chart._findIndexForXCoord(x)];\n\t},\n\n\t/**\n\t * Fires an event of the specified type.\n\t */\n\t_fireEvt: function(type, data, propagate) {\n\t\tif (this.fire) this.fire(type, data, propagate);\n\t\tif (this._map) this._map.fire(type, data, propagate);\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\tif (this._chart) return this._chart._height();\n\t\tlet opts = this.options;\n\t\treturn opts.height - opts.margins.top - opts.margins.bottom;\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\t_hideMarker: function() {\n\t\tif (this.options.autohideMarker) {\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Generate \"svg\" chart DOM element.\n\t */\n\t_initChart: function(container) {\n\t\tlet opts = this.options;\n\n\t\topts.xTicks = this._xTicks();\n\t\topts.yTicks = this._yTicks();\n\n\t\tif (opts.responsive) {\n\t\t\tif (opts.detached) {\n\t\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\n\t\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\n\t\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\n\t\t\t} else {\n\t\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\n\t\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\n\t\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\n\t\t\t}\n\t\t}\n\n\t\tlet chart = this._chart = new Chart(opts, this);\n\n\t\tthis._x = this._chart._x;\n\t\tthis._y = this._chart._y;\n\n\t\td3\n\t\t\t.select(container)\n\t\t\t.call(chart.render())\n\n\t\tchart\n\t\t\t.on('reset_drag', this._hideMarker, this)\n\t\t\t.on('mouse_enter', this._fireEvt.bind('elechart_enter'), this)\n\t\t\t.on('dragged', this._dragendHandler, this)\n\t\t\t.on('mouse_move', this._mousemoveHandler, this)\n\t\t\t.on('mouse_out', this._mouseoutHandler, this)\n\t\t\t.on('ruler_filter', this._rulerFilterHandler, this)\n\t\t\t.on('zoom', this._updateChart, this)\n\t\t\t.on('elepath_toggle', this._toggleChartHandler, this)\n\t\t\t.on('margins_updated',this._resizeChart, this);\n\n\n\t\tthis._fireEvt(\"elechart_axis\");\n\t\tif (this.options.legend) this._fireEvt(\"elechart_legend\");\n\n\t\tthis._fireEvt(\"elechart_init\");\n\t},\n\n\t_initLayer: function() {\n\t\tthis._layers\n\t\t\t.on('layeradd layerremove', (e) => {\n\t\t\t\tlet layer = e.layer\n\t\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, e.type == 'layeradd');\n\t\t\t\t_.toggleEvent(layer, \"mousemove\", this._mousemoveLayerHandler.bind(this), e.type == 'layeradd')\n\t\t\t\t_.toggleEvent(layer, \"mouseout\", this._mouseoutHandler.bind(this), e.type == 'layeradd');\n\t\t\t});\n\t},\n\n\t_initMarker: function(map) {\n\t\tlet pane = map.getPane('elevationPane');\n\t\tif (!pane) {\n\t\t\tpane = this._pane = map.createPane('elevationPane', map.getPane('norotatePane') || map.getPane('mapPane'));\n\t\t\tpane.style.zIndex = 625; // This pane is above markers but below popups.\n\t\t\tpane.style.pointerEvents = 'none';\n\t\t}\n\n\t\tif (this._renderer) this._renderer.remove()\n\t\tthis._renderer = L.svg({ pane: \"elevationPane\" }).addTo(this._map); // default leaflet svg renderer\n\t\tthis._marker = new Marker(this.options);\n\n\t\tthis._fireEvt(\"elechart_marker\");\n\t},\n\n\t/**\n\t * Inspired by L.Control.Layers\n\t */\n\t_initButton: function(container) {\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 (!this.options.detached) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container);\n\t\t\t//.disableScrollPropagation(container);\n\t\t}\n\n\t\tif (L.Browser.mobile) {\n\t\t\t_.on(container, 'click', L.DomEvent.stopPropagation);\n\t\t}\n\n\t\t_.on(container, 'mousewheel', this._mousewheelHandler, this);\n\n\t\tif (!this.options.detached) {\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle elevation-toggle-icon\" + (this.options.autohide ? \"\" : \" close-button\"), { href: '#', title: L._('Elevation') }, container);\n\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tthis._collapse();\n\t\t\t\tif (this.options.autohide) {\n\t\t\t\t\t_.on(container, 'mouseover', this._expand, this);\n\t\t\t\t\t_.on(container, 'mouseout', this._collapse, this);\n\t\t\t\t} else {\n\t\t\t\t\t_.on(link, 'click', L.DomEvent.stop);\n\t\t\t\t\t_.on(link, 'click', this._toggle, this);\n\t\t\t\t}\n\n\t\t\t\t_.on(link, 'focus', this._toggle, this);\n\n\t\t\t\tthis._map.on('click', this._collapse, this);\n\t\t\t\t// TODO: keyboard accessibility\n\t\t\t}\n\t\t} else {\n\t\t\t// TODO: handle autohide when detached=true\n\t\t}\n\t},\n\n\t_initSummary: function(container) {\n\t\tlet summary = this._summary = new Summary({ summary: this.options.summary }, this);\n\n\t\td3\n\t\t\t.select(container)\n\t\t\t.call(summary.render());\n\n\t\tthis.summaryDiv = this._summary._container;\n\t},\n\n\t_dragendHandler: function(e) {\n\t\tthis._hideMarker();\n\t\tthis.fitBounds(L.latLngBounds([e.dragstart.latlng, e.dragend.latlng]));\n\n\t\tthis._fireEvt(\"elechart_dragged\");\n\t},\n\n\t/*\n\t * Handles the moueseover the chart and displays distance and altitude level.\n\t */\n\t_mousemoveHandler: function(e) {\n\t\tif (!this._data.length || !this._chartEnabled) {\n\t\t\treturn;\n\t\t}\n\t\tlet item = this._findItemForX(e.xCoord);\n\n\t\tif (item) {\n\t\t\tlet xCoord = e.xCoord;\n\n\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\n\t\t\tthis._updateMarker(item);\n\t\t\tthis._setMapView(item);\n\n\t\t\tif (this._map) {\n\t\t\t\t_.addClass(this._map.getContainer(), 'elechart-hover');\n\t\t\t}\n\n\t\t\tthis._fireEvt(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\tthis._fireEvt(\"elechart_hover\", { data: item, xCoord: xCoord });\n\t\t}\n\t},\n\n\t/*\n\t * Handles mouseover events of the data layers on the map.\n\t */\n\t_mousemoveLayerHandler: function(e) {\n\t\tif (!this._data.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet item = this._findItemForLatLng(e.latlng);\n\t\tif (item) {\n\t\t\tlet xCoord = item.xDiagCoord;\n\n\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\n\t\t\tthis._updateMarker(item);\n\n\t\t\tthis._fireEvt(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t}\n\t},\n\n\t/*\n\t * Handles the moueseout over the chart.\n\t */\n\t_mouseoutHandler: function() {\n\t\tif (!this.options.detached) {\n\t\t\tthis._hideMarker();\n\t\t\tthis._chart._hideDiagramIndicator();\n\t\t}\n\n\t\tif (this._map) {\n\t\t\t_.removeClass(this._map.getContainer(), 'elechart-hover');\n\t\t}\n\n\t\tthis._fireEvt(\"elechart_leave\");\n\t},\n\n\t/*\n\t * Handles the mouesewheel over the chart.\n\t */\n\t_mousewheelHandler: function(e) {\n\t\tif (this._map.gestureHandling && this._map.gestureHandling._enabled) return;\n\t\tlet ll = this._marker.getLatLng() || this._map.getCenter();\n\t\tlet z = this._map.getZoom() + Math.sign(e.deltaY);\n\t\tthis._resetDrag();\n\t\tthis._map.flyTo(ll, z);\n\t},\n\n\t/**\n\t * Add a waypoint marker to the diagram\n\t */\n\t_registerCheckPoint: function(props) {\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\n\t},\n\n\t/**\n\t * Add chart profile to diagram\n\t */\n\t_registerAreaPath: function(props) {\n\t\tthis.on(\"elechart_init\", () => this._chart._registerAreaPath(props));\n\t},\n\n\t/**\n\t * Add chart grid to diagram\n\t */\n\t_registerAxisGrid: function(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisGrid(props));\n\t},\n\n\t/**\n\t * Add chart axis to diagram\n\t */\n\t_registerAxisScale: function(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisScale(props));\n\t},\n\n\t/**\n\t * Add chart or marker tooltip info\n\t */\n\t_registerFocusLabel: function(props) {\n\t\tif (props.chart) {\n\t\t\tlet label = L.extend({}, props, { value: props.chart });\n\t\t\tthis.on(\"elechart_init\", () => this._chart._registerFocusLabel(label));\n\t\t}\n\t\tif (props.marker) {\n\t\t\tlet label = L.extend({}, props, { value: props.marker });\n\t\t\tthis.on(\"elechart_marker\", () => this._marker._registerFocusLabel(label));\n\t\t}\n\t},\n\n\t/**\n\t * Add summary info to diagram\n\t */\n\t_registerSummary: function(props) {\n\t\tthis.on('elechart_summary', () => this._summary._registerSummary(props));\n\t},\n\n\t/*\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\n\t */\n\t_resetDrag: function() {\n\t\tthis._chart._resetDrag();\n\t\tthis._hideMarker();\n\t},\n\n\t/**\n\t * Resets drag, marker and bounds.\n\t */\n\t_resetView: function() {\n\t\tif (this._map && this._map._isFullscreen) return;\n\t\tthis._resetDrag();\n\t\tthis._hideMarker();\n\t\tif (this.options.autofitBounds) {\n\t\t\tthis.fitBounds();\n\t\t}\n\t},\n\n\t/**\n\t * Hacky way for handling chart resize. Deletes it and redraw chart.\n\t */\n\t_resizeChart: function() {\n\t\t// prevent displaying chart on resize if hidden\n\t\tif (_.style(this._container, \"display\") == \"none\") return;\n\n\t\tlet opts = this.options;\n\n\t\tif (opts.responsive) {\n\t\t\tlet newWidth;\n\t\t\tif (opts.detached) {\n\t\t\t\tnewWidth = (this.eleDiv || this._container).offsetWidth;\n\t\t\t} else {\n\t\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\t\tnewWidth = opts._maxWidth > clientWidth ? clientWidth - 30 : opts._maxWidth;\n\t\t\t}\n\t\t\tif (newWidth) {\n\t\t\t\tlet chart = this._chart;\n\t\t\t\topts.width = newWidth;\n\t\t\t\tif (chart && chart._chart) {\n\t\t\t\t\tchart._chart._resize(opts);\n\t\t\t\t\topts.xTicks = this._xTicks();\n\t\t\t\t\topts.yTicks = this._yTicks();\n\t\t\t\t\tthis._updateChart();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._updateMapSegments();\n\t},\n\n\t/**\n\t * Handles the drag event over the ruler filter.\n\t */\n\t_rulerFilterHandler: function(e) {\n\t\tthis._updateMapSegments(e.coords);\n\t},\n\n\t/**\n\t * Collapse or Expand current chart control.\n\t */\n\t_toggle: function() {\n\t\tif (_.hasClass(this._container, \"elevation-expanded\"))\n\t\t\tthis._collapse();\n\t\telse\n\t\t\tthis._expand();\n\t},\n\n\t/**\n\t * Sets the view of the map (center and zoom). Useful when \"followMarker\" is true.\n\t */\n\t_setMapView: function(item) {\n\t\tif (!this.options.followMarker || !this._map) return;\n\t\tlet zoom = this._map.getZoom();\n\t\tif (\"number\" === typeof this._zFollow) {\n\t\t\tif (zoom < this._zFollow) zoom = this._zFollow;\n\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\n\t\t} else if (!this._map.getBounds().contains(item.latlng)) {\n\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\n\t\t}\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_toggleChartHandler: function(e) {\n\t\tlet { path, name, enabled } = e;\n\n\t\tthis._chartEnabled = this._chart._hasActiveLayers();\n\n\t\t// toggle layer visibility on empty chart\n\t\tthis._layers.eachLayer(layer => {\n\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, this._chartEnabled);\n\t\t\t}\n\t\t);\n\n\t\t// toggle option value (eg. altitude = { 'disabled' || 'disabled' })\n\t\tthis.options[name] = !enabled && this.options[name] == 'disabled' ? 'enabled' : 'disabled';\n\n\t\t// remove marker on empty chart\n\t\tif (!this._chartEnabled) {\n\t\t\tthis._chart._hideDiagramIndicator();\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Calculates [x, y] domain and then update chart.\n\t */\n\t_updateChart: function() {\n\t\tif (/*!this._data.length ||*/ !this._container) return;\n\n\t\tthis._fireEvt(\"elechart_axis\");\n\t\tthis._fireEvt(\"elechart_area\");\n\n\t\tthis._chart.update({ data: this._data, options: this.options });\n\n\t\tthis._x = this._chart._x;\n\t\tthis._y = this._chart._y;\n\n\t\tthis._fireEvt('elechart_updated');\n\t},\n\n\t/*\n\t * Update the position/height indicator marker drawn onto the map\n\t */\n\t_updateMarker: function(item) {\n\t\tif (!this._marker) return;\n\t\tthis._marker.update({\n\t\t\tmap : this._map,\n\t\t\titem : item,\n\t\t\tmaxElevation: this.track_info.elevation_max || 0,\n\t\t\toptions : this.options\n\t\t});\n\t},\n\n\t/**\n\t * Fix marker rotation on rotated maps\n\t */\n\t_rotateMarker: function() {\n\t\tif (!this._marker) return;\n\t\tthis._marker.update();\n\t},\n\n\t/**\n\t * Highlight track segments on the map.\n\t */\n\t_updateMapSegments: function(coords) {\n\t\tthis._markedSegments.setLatLngs(coords || []);\n\t\tif (coords && this._map && !this._map.hasLayer(this._markedSegments)) {\n\t\t\tthis._markedSegments.addTo(this._map);\n\t\t}\n\t},\n\n\t/**\n\t * Update chart summary.\n\t */\n\t_updateSummary: function() {\n\t\tthis._summary.reset();\n\n\t\tif (this.options.summary) {\n\t\t\tthis._fireEvt(\"elechart_summary\");\n\t\t}\n\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\n\t\t\tthis.summaryDiv.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t_.select('.download a', this.summaryDiv).onclick = (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis._fireEvt('eletrack_download', { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) });\n\t\t\t};\n\t\t};\n\t},\n\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\tif (this._chart) return this._chart._width();\n\t\tlet opts = this.options;\n\t\treturn opts.width - opts.margins.left - opts.margins.right;\n\t},\n\n\t/**\n\t * Calculate chart xTicks\n\t */\n\t_xTicks: function() {\n\t\tif (this.__xTicks) this.__xTicks = this.options.xTicks;\n\t\treturn this.__xTicks || Math.round(this._width() / 75);\n\t},\n\n\t/**\n\t * Calculate chart yTicks\n\t */\n\t_yTicks: function() {\n\t\tif (this.__yTicks) this.__yTicks = this.options.yTicks;\n\t\treturn this.__yTicks || Math.round(this._height() / 30);\n\t}\n\n});\n\n/**\n * Attach here some useful elevation hooks.\n */\nElevation.addInitHook(function() {\n\n\tthis.on('waypoint_added', function(e) {\n\t\tlet p = e.point,\n\t\t\tpop = p._popup;\n\t\tif (pop) {\n\t\t\tpop.options.className = 'elevation-popup';\n\t\t}\n\t\tif (pop && pop._content) {\n\t\t\tpop._content = decodeURI(pop._content);\n\t\t\tp.bindTooltip(pop._content, { direction: 'auto', sticky: true, opacity: 1, className: 'elevation-tooltip' }).openTooltip();\n\t\t}\n\t});\n\n\tthis.on(\"eletrack_download\", function(e) {\n\t\tif (e.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: e }));\n\t\t} else if (e.downloadLink == 'link' || e.downloadLink === true) {\n\t\t\te.confirm();\n\t\t}\n\t});\n\n\tthis.on('eledata_loaded', function(e) {\n\t\tlet map = this._map;\n\t\tlet layer = e.layer;\n\t\tif (!map) {\n\t\t\tconsole.warn(\"Undefined elevation map object\");\n\t\t\treturn;\n\t\t}\n\t\tmap.once('layeradd', (e) => this.options.autofitBounds && this.fitBounds(layer.getBounds()));\n\n\t\tif (L.Browser.mobile) {\n\n\t\t\tif (this.options.polyline) layer.addTo(map);\n\n\t\t} else {\n\n\t\t\t// leaflet-geometryutil\n\t\t\tElevation._geomutilLazyLoader = _.lazyLoader(\n\t\t\t\tthis.__LGEOMUTIL,\n\t\t\t\ttypeof L.GeometryUtil !== 'function' || !this.options.lazyLoadJS,\n\t\t\t\tElevation._geomutilLazyLoader\n\t\t\t).then(\n\t\t\t\t() => {\n\n\t\t\t\t\t// leaflet-almostover\n\t\t\t\t\tif (this.options.almostOver) {\n\t\t\t\t\t\tElevation._almostoverLazyLoader = _.lazyLoader(\n\t\t\t\t\t\t\tthis.__LALMOSTOVER,\n\t\t\t\t\t\t\ttypeof L.Handler.AlmostOver !== 'function' || !this.options.lazyLoadJS,\n\t\t\t\t\t\t\tElevation._almostoverLazyLoader\n\t\t\t\t\t\t).then(\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\tmap.addHandler('almostOver',L.Handler.AlmostOver)\n\t\t\t\t\t\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\n\t\t\t\t\t\t\t\t\tmap.almostOver.addLayer(layer);\n\t\t\t\t\t\t\t\t\tmap\n\t\t\t\t\t\t\t\t\t\t.on('almost:move', (e) => this._mousemoveLayerHandler(e))\n\t\t\t\t\t\t\t\t\t\t.on('almost:out', (e) => this._mouseoutHandler(e));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// leaflet-distance-markers\n\t\t\t\t\tif (this.options.distanceMarkers) {\n\t\t\t\t\t\tElevation._distanceMarkersLazyLoader = _.lazyLoader(\n\t\t\t\t\t\t\tthis.__LDISTANCEM,\n\t\t\t\t\t\t\ttypeof L.DistanceMarkers !== 'function' || !this.options.lazyLoadJS,\n\t\t\t\t\t\t\tElevation._distanceMarkersLazyLoader\n\t\t\t\t\t\t).then(() => this.options.polyline && layer.addTo(map));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.options.polyline) layer.addTo(map);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t);\n\t\t}\n\t});\n\n\t// Basic canvas renderer support.\n\tlet oldProto = L.Canvas.prototype._fillStroke;\n\tlet control = this;\n\tL.Canvas.include({\n\t\t_fillStroke: function(ctx, layer) {\n\t\t\tif (control._layers.hasLayer(layer)) {\n\n\t\t\t\tlet theme = control.options.theme.replace('-theme', '');\n\t\t\t\tlet color = D3.Colors[theme] || {};\n\t\t\t\tlet options = layer.options;\n\n\t\t\t\toptions.color = color.line || color.area || theme;\n\t\t\t\toptions.stroke = !!options.color;\n\n\t\t\t\toldProto.call(this, ctx, layer);\n\n\t\t\t\tif (options.stroke && options.weight !== 0) {\n\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\n\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\n\t\t\t\t\tctx.strokeStyle = '#FFF';\n\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\n\t\t\t\t\tctx.stroke();\n\t\t\t\t\tctx.globalCompositeOperation = oldVal;\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\toldProto.call(this, ctx, layer);\n\t\t\t}\n\t\t}\n\t});\n\n\t// Partially fix: https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\n\tthis.on('elechart_init', function() {\n\t\tthis.once('elechart_change elechart_hover', function(e) {\n\t\t\tif (this._chartEnabled) {\n\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t}\n\t\t\tthis._updateMarker(e.data);\n\t\t});\n\t});\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tlet opts = this.options;\n\tlet distance = {};\n\n\tif (this.options.imperial) {\n\t\tthis._distanceFactor = this.__mileFactor;\n\t\tthis._xLabel = \"mi\";\n\t} else {\n\t\tthis._distanceFactor = opts.distanceFactor;\n\t\tthis._xLabel = opts.xLabel;\n\t}\n\n\tthis.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet track = this.track_info;\n\t\tlet dist = track.distance || 0;\n\n\t\tlet curr = data[i].latlng;\n\t\tlet prev = i > 0 ? data[i - 1].latlng : curr;\n\n\t\tlet delta = curr.distanceTo(prev) * this._distanceFactor;\n\n\t\tdist += Math.round(delta / 1000 * 100000) / 100000; // handles floating points calc\n\n\t\tdata[i].dist = dist;\n\n\t\ttrack.distance = dist;\n\t});\n\n\tthis.on(\"elechart_axis\", function() {\n\n\t\tthis._chart._registerAxisGrid({\n\t\t\taxis : \"x\",\n\t\t\tposition : \"bottom\",\n\t\t\tscale : this._chart._x,\n\t\t});\n\n\t});\n\n\tif (this.options.distance != \"summary\") {\n\n\t\tthis.on(\"elechart_axis\", function() {\n\n\t\t\tdistance.x = this._chart._x;\n\t\t\tdistance.label = this._chart._xLabel;\n\n\t\t\tthis._chart._registerAxisScale({\n\t\t\t\taxis : \"x\",\n\t\t\t\tposition: \"bottom\",\n\t\t\t\tscale : distance.x,\n\t\t\t\tlabel : distance.label,\n\t\t\t\tlabelY : 25,\n\t\t\t\tlabelX : () => this._width() + 6,\n\t\t\t\tname : \"distance\",\n\t\t\t});\n\n\t\t});\n\n\t}\n\n\tthis._registerSummary({\n\t\t\"totlen\" : {\n\t\t\tlabel: \"Total Length: \",\n\t\t\tvalue: (track) => (track.distance || 0).toFixed(2) + ' ' + this._xLabel\n\t\t}\n\t});\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tlet opts = this.options;\n\tlet altitude = {};\n\n\tif (opts.imperial) {\n\t\tthis._heightFactor = this.__footFactor;\n\t\tthis._yLabel = \"ft\";\n\t} else {\n\t\tthis._heightFactor = opts.heightFactor;\n\t\tthis._yLabel = opts.yLabel;\n\t}\n\n\tthis.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\t\tlet z = data[i].z * this._heightFactor;\n\n\t\tlet track = this.track_info;\n\t\tlet eleMax = track.elevation_max || -Infinity;\n\t\tlet eleMin = track.elevation_min || +Infinity;\n\n\t\t// check and fix missing elevation data on last added point\n\t\tif (!this.options.skipNullZCoords && i > 0) {\n\t\t\tlet prevZ = data[i - 1].z;\n\t\t\tif (isNaN(prevZ)) {\n\t\t\t\tlet lastZ = this._lastValidZ;\n\t\t\t\tlet currZ = z;\n\t\t\t\tif (!isNaN(lastZ) && !isNaN(currZ)) {\n\t\t\t\t\tprevZ = (lastZ + currZ) / 2;\n\t\t\t\t} else if (!isNaN(lastZ)) {\n\t\t\t\t\tprevZ = lastZ;\n\t\t\t\t} else if (!isNaN(currZ)) {\n\t\t\t\t\tprevZ = currZ;\n\t\t\t\t}\n\t\t\t\tif (!isNaN(prevZ)) return data.splice(i - 1, 1);\n\t\t\t\tdata[i - 1].z = prevZ;\n\t\t\t}\n\t\t}\n\t\t// skip point if it has not elevation\n\t\tif (!isNaN(z)) {\n\t\t\teleMax = eleMax < z ? z : eleMax;\n\t\t\teleMin = eleMin > z ? z : eleMin;\n\t\t\tthis._lastValidZ = z;\n\t\t}\n\n\t\tdata[i].z = z;\n\n\t\ttrack.elevation_max = eleMax;\n\t\ttrack.elevation_min = eleMin;\n\t});\n\n\tthis.on(\"elechart_axis\", function() {\n\n\t\tthis._chart._registerAxisGrid({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"left\",\n\t\t\tscale : this._chart._y,\n\t\t});\n\n\t});\n\n\tif (this.options.altitude != \"summary\") {\n\n\t\tthis.on(\"elechart_axis\", function() {\n\n\t\t\taltitude.y = this._chart._y;\n\t\t\taltitude.label = this._yLabel;\n\n\t\t\tthis._chart._registerAxisScale({\n\t\t\t\taxis : \"y\",\n\t\t\t\tposition: \"left\",\n\t\t\t\tscale : altitude.y,\n\t\t\t\tlabel : altitude.label,\n\t\t\t\tlabelX : -3,\n\t\t\t\tlabelY : -8,\n\t\t\t\tname : \"altitude\",\n\t\t\t});\n\n\t\t});\n\n\t\tthis.on(\"elechart_init\", function() {\n\n\t\t\tlet theme = this.options.theme.replace('-theme', '');\n\t\t\tlet color = D3.Colors[theme] || {};\n\t\t\tlet alpha = (this.options.detached ? (color.alpha || '0.8') : 1);\n\t\t\tlet stroke = (this.options.detached ? color.stroke : false);\n\n\t\t\tthis._chart._registerAreaPath({\n\t\t\t\tname : 'altitude',\n\t\t\t\tlabel : 'Altitude',\n\t\t\t\tscaleX : 'distance',\n\t\t\t\tscaleY : 'altitude',\n\t\t\t\tcolor : color.area || theme,\n\t\t\t\tstrokeColor : stroke || '#000',\n\t\t\t\tstrokeOpacity: \"1\",\n\t\t\t\tfillOpacity : alpha,\n\t\t\t\tpreferCanvas : this.options.preferCanvas,\n\t\t\t});\n\n\t\t});\n\n\t}\n\n\tthis._registerSummary({\n\t\t\"maxele\" : {\n\t\t\tlabel: \"Max Elevation: \",\n\t\t\tvalue: (track) => (track.elevation_max || 0).toFixed(2) + ' ' + this._yLabel\n\t\t},\n\t\t\"minele\" : {\n\t\t\tlabel: \"Min Elevation: \",\n\t\t\tvalue: (track) => (track.elevation_min || 0).toFixed(2) + ' ' + this._yLabel\n\t\t},\n\t});\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tlet opts = this.options;\n\tlet time = {};\n\n\ttime.label = opts.timeLabel || 't';\n\tthis._timeFactor = opts.timeFactor;\n\n\t/**\n\t * Common AVG speeds:\n\t * ----------------------\n\t * slow walk = 1.8 km/h\n\t * walking = 3.6 km/h\n\t * running = 10.8 km/h\n\t * cycling = 18 km/h\n\t * driving = 72 km/h\n\t * ----------------------\n\t */\n\tthis._timeAVGSpeed = (opts.timeAVGSpeed || 3.6) * (opts.speedFactor || 1);\n\n\tif (!opts.timeFormat) {\n\t\topts.timeFormat = (time) => (new Date(time)).toLocaleString().replaceAll('/', '-').replaceAll(',', ' ');\n\t} else if (opts.timeFormat == 'time') {\n\t\topts.timeFormat = (time) => (new Date(time)).toLocaleTimeString();\n\t} else if (opts.timeFormat == 'date') {\n\t\topts.timeFormat = (time) => (new Date(time)).toLocaleDateString();\n\t}\n\n\topts.xTimeFormat = opts.xTimeFormat || ((t) => _.formatTime(t).split(\"'\")[0]);\n\n\tif (opts.time && opts.time != \"summary\" && !L.Browser.mobile) {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"x\",\n\t\t\tposition : \"top\",\n\t\t\tscale : {\n\t\t\t\tattr : \"duration\",\n\t\t\t\tmin : 0,\n\t\t\t},\n\t\t\tlabel : time.label,\n\t\t\tlabelY : -10,\n\t\t\tlabelX : () => this._width(),\n\t\t\tname : \"time\",\n\t\t\ttickFormat : (d) => (d == 0 ? '' : opts.xTimeFormat(d)),\n\t\t\tonAxisMount: axis => {\n\t\t\t\taxis.select(\".domain\")\n\t\t\t\t\t.remove();\n\t\t\t\taxis.selectAll(\"text\")\n\t\t\t\t\t.attr('opacity', 0.65)\n\t\t\t\t\t.style('font-family', 'Monospace')\n\t\t\t\t\t.style('font-size', '110%');\n\t\t\t\taxis.selectAll(\".tick line\")\n\t\t\t\t\t.attr('y2', this._height())\n\t\t\t\t\t.attr('stroke-dasharray', 2)\n\t\t\t\t\t.attr('opacity', 0.75);\n\t\t\t\t}\n\t\t});\n\n\t}\n\n\tthis.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\t// Add missing timestamps (see: options.timeAVGSpeed)\n\t\tif (!e.point.meta || !e.point.meta.time) {\n\t\t\te.point.meta = e.point.meta || {};\n\t\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist);\n\t\t\tlet speed = this._timeAVGSpeed;\n\t\t\te.point.meta.time = new Date(\n\t\t\t\t(\n\t\t\t\t\ti > 0\n\t\t\t\t\t\t? data[i - 1].time.getTime() + ((( delta / speed) * this._timeFactor) * 1000)\n\t\t\t\t\t\t: Date.now()\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tlet time = e.point.meta.time;\n\n\t\t// Handle timezone offset\n\t\tif (time.getTime() - time.getTimezoneOffset() * 60 * 1000 === 0) {\n\t\t\ttime = 0;\n\t\t}\n\n\t\tlet currT = time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = Math.abs(currT - prevT);\n\t\tlet duration = (this.track_info.time || 0) + deltaT;\n\n\t\tdata[i].time = time;\n\t\tdata[i].duration = duration;\n\n\t\tthis.track_info.time = duration;\n\t});\n\n\tif (this.options.time) {\n\n\t\tthis._registerFocusLabel({\n\t\t\tname: 'time',\n\t\t\tchart: (item) => this.options.timeFormat(item.time)\n\t\t});\n\n\t\tthis._registerSummary({\n\t\t\t\"tottime\" : {\n\t\t\t\tlabel: \"Total Time: \",\n\t\t\t\tvalue: (track) => _.formatTime(track.time || 0)\n\t\t\t}\n\t\t});\n\n\t}\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tif (!this.options.slope) return;\n\n\tlet opts = this.options;\n\tlet slope = {};\n\n\tslope.label = opts.slopeLabel || '%';\n\n\tif (this.options.slope != \"summary\") {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"right\",\n\t\t\tscale : {\n\t\t\t\tmin : -1,\n\t\t\t\tmax : +1,\n\t\t\t},\n\t\t\ttickPadding: 16,\n\t\t\tlabel : slope.label,\n\t\t\tlabelX : 25,\n\t\t\tlabelY : -8,\n\t\t\tname : 'slope'\n\t\t});\n\n\t\tthis._registerAreaPath({\n\t\t\tname : 'slope',\n\t\t\tlabel : 'Slope',\n\t\t\tyAttr : 'slope',\n\t\t\tscaleX : 'distance',\n\t\t\tscaleY : 'slope',\n\t\t\tcolor : '#F00',\n\t\t\tstrokeColor : '#000',\n\t\t\tstrokeOpacity: \"0.5\",\n\t\t\tfillOpacity : \"0.25\",\n\t\t});\n\n\t}\n\n\tthis.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\t\tlet z = data[i].z;\n\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist) * 1000;\n\n\t\t// Slope / Gain\n\t\tlet track = this.track_info;\n\t\tlet tAsc = track.ascent || 0; // Total Ascent\n\t\tlet tDes = track.descent || 0; // Total Descent\n\t\tlet sMax = track.slope_max || 0; // Slope Max\n\t\tlet sMin = track.slope_min || 0; // Slope Min\n\t\tlet slope = 0;\n\n\t\tif (!isNaN(z)) {\n\t\t\tlet deltaZ = i > 0 ? z - data[i - 1].z : 0;\n\t\t\tif (deltaZ > 0) tAsc += deltaZ;\n\t\t\telse if (deltaZ < 0) tDes -= deltaZ;\n\t\t\t// slope in % = ( height / length ) * 100\n\t\t\tif (delta !== 0) slope = (deltaZ / delta) * 100;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" slope values.\n\t\tif (this.options.sDeltaMax) {\n\t\t\tlet deltaS = i > 0 ? slope - data[i - 1].slope : 0;\n\t\t\tlet maxDeltaS = this.options.sDeltaMax;\n\t\t\tif (Math.abs(deltaS) > maxDeltaS) {\n\t\t\t\tslope = data[i - 1].slope + maxDeltaS * Math.sign(deltaS);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable slope values.\n\t\tif (this.options.sRange) {\n\t\t\tlet range = this.options.sRange;\n\t\t\tif (slope < range[0]) slope = range[0];\n\t\t\telse if (slope > range[1]) slope = range[1];\n\t\t}\n\n\t\tslope = L.Util.formatNum(slope, 2);\n\n\t\tif (slope > sMax) sMax = slope;\n\t\tif (slope < sMin) sMin = slope;\n\n\t\tdata[i].slope = slope;\n\n\t\ttrack.ascent = tAsc;\n\t\ttrack.descent = tDes;\n\t\ttrack.slope_max = sMax;\n\t\ttrack.slope_min = sMin;\n\t});\n\n\tthis._registerFocusLabel({\n\t\tname: 'slope',\n\t\tchart: (item) => item.slope + slope.label,\n\t\tmarker: (item) => Math.round(item.slope) + slope.label\n\t});\n\n\tthis._registerSummary({\n\t\t\"ascent\" : {\n\t\t\tlabel: \"Total Ascent: \",\n\t\t\tvalue: (track) => Math.round(track.ascent || 0) + ' ' + this._yLabel\n\t\t},\n\t\t\"descent\" : {\n\t\t\tlabel: \"Total Descent: \",\n\t\t\tvalue: (track) => Math.round(track.descent || 0) + ' ' + this._yLabel\n\t\t},\n\t\t\"minslope\": {\n\t\t\tlabel: \"Min Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_min || 0) + ' ' + slope.label\n\t\t},\n\t\t\"maxslope\": {\n\t\t\tlabel: \"Max Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_max || 0) + ' ' + slope.label\n\t\t}\n\t});\n\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tif (!this.options.speed && !this.options.acceleration) return;\n\n\tlet opts = this.options;\n\tlet speed = {};\n\n\tspeed.label = opts.speedLabel || L._(this.options.imperial ? 'mph' : 'km/h');\n\tthis._speedFactor = opts.speedFactor || 1;\n\n\tif (this.options.speed && this.options.speed != \"summary\") {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"right\",\n\t\t\tscale : {\n\t\t\t\tmin : 0,\n\t\t\t\tmax : +1,\n\t\t\t},\n\t\t\ttickPadding: 16,\n\t\t\tlabel : speed.label,\n\t\t\tlabelX : 25,\n\t\t\tlabelY : -8,\n\t\t\tname : \"speed\"\n\t\t});\n\n\t\tthis._registerAreaPath({\n\t\t\tname : 'speed',\n\t\t\tlabel : 'Speed',\n\t\t\tyAttr : \"speed\",\n\t\t\tscaleX : 'distance',\n\t\t\tscaleY : 'speed',\n\t\t\tcolor : '#03ffff',\n\t\t\tstrokeColor : '#000',\n\t\t\tstrokeOpacity: \"0.5\",\n\t\t\tfillOpacity : \"0.25\",\n\t\t});\n\n\t}\n\n\tthis.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet currT = data[i].time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = currT - prevT;\n\n\t\tlet track = this.track_info;\n\t\tlet sMax = track.speed_max || -Infinity; // Speed Max\n\t\tlet sMin = track.speed_min || +Infinity; // Speed Min\n\t\tlet sAvg = track.speed_avg || 0; // Speed Avg\n\t\tlet speed = 0;\n\n\t\tif (deltaT > 0) {\n\t\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist) * 1000;\n\t\t\tspeed = Math.abs((delta / deltaT) * this._timeFactor) * this._speedFactor;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" speed values.\n\t\tif (this.options.speedDeltaMax) {\n\t\t\tlet deltaS = i > 0 ? speed - data[i - 1].speed : 0;\n\t\t\tlet maxDeltaS = this.options.speedDeltaMax;\n\t\t\tif (Math.abs(deltaS) > maxDeltaS) {\n\t\t\t\tspeed = data[i - 1].speed + maxDeltaS * Math.sign(deltaS);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable speed values.\n\t\tif (this.options.speedRange) {\n\t\t\tlet range = this.options.speedRange;\n\t\t\tif (speed < range[0]) speed = range[0];\n\t\t\telse if (speed > range[1]) speed = range[1];\n\t\t}\n\n\t\tspeed = L.Util.formatNum(speed, 2);\n\n\t\tsMax = speed > sMax ? speed : sMax;\n\t\tsMin = speed < sMin ? speed : sMin;\n\t\tsAvg = (speed + sAvg) / 2.0;\n\n\t\tdata[i].speed = speed;\n\n\t\ttrack.speed_max = sMax;\n\t\ttrack.speed_min = sMin;\n\t\ttrack.speed_avg = sAvg;\n\t});\n\n\tif (this.options.speed) {\n\n\t\tthis._registerFocusLabel({\n\t\t\tname: 'speed',\n\t\t\tchart: (item) => item.speed + \" \" + speed.label,\n\t\t\tmarker: (item) => Math.round(item.speed) + \" \" + speed.label\n\t\t});\n\n\t\tthis._registerSummary({\n\t\t\t\"minspeed\" : {\n\t\t\t\tlabel: \"Min Speed: \",\n\t\t\t\tvalue: (track) => Math.round(track.speed_min || 0) + ' ' + speed.label\n\t\t\t},\n\t\t\t\"maxspeed\" : {\n\t\t\t\tlabel: \"Max Speed: \",\n\t\t\t\tvalue: (track) => Math.round(track.speed_max || 0) + ' ' + speed.label\n\t\t\t},\n\t\t\t\"avgspeed\": {\n\t\t\t\tlabel: \"Avg Speed: \",\n\t\t\t\tvalue: (track) => Math.round(track.speed_avg || 0) + ' ' + speed.label\n\t\t\t}\n\t\t});\n\n\t}\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tif (!this.options.acceleration) return;\n\n\tlet opts = this.options;\n\tlet acceleration = {};\n\n\tacceleration.label = opts.accelerationLabel || L._(this.options.imperial ? 'ft/s²' : 'm/s²');\n\tthis._accelerationFactor = opts.accelerationFactor || 1;\n\n\tif (this.options.acceleration != \"summary\") {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"right\",\n\t\t\tscale : {\n\t\t\t\tmin : 0,\n\t\t\t\tmax : +1,\n\t\t\t},\n\t\t\ttickPadding: 16,\n\t\t\tlabel : acceleration.label,\n\t\t\tlabelX : 25,\n\t\t\tlabelY : -8,\n\t\t\tname : 'acceleration'\n\t\t});\n\n\t\tthis._registerAreaPath({\n\t\t\tname : 'acceleration',\n\t\t\tlabel : 'Acceleration',\n\t\t\tyAttr : 'acceleration',\n\t\t\tscaleX : 'distance',\n\t\t\tscaleY : 'acceleration',\n\t\t\tcolor : '#050402',\n\t\t\tstrokeColor : '#000',\n\t\t\tstrokeOpacity: \"0.5\",\n\t\t\tfillOpacity : \"0.25\",\n\t\t});\n\n\t}\n\n\tthis.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet currT = data[i].time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = (currT - prevT) / 1000;\n\n\t\tlet track = this.track_info;\n\t\tlet sMax = track.acceleration_max || -Infinity; // Acceleration Max\n\t\tlet sMin = track.acceleration_min || +Infinity; // Acceleration Min\n\t\tlet sAvg = track.acceleration_avg || 0; // Acceleration Avg\n\t\tlet acceleration = 0;\n\n\t\tif (deltaT > 0) {\n\t\t\tlet curr = data[i].speed;\n\t\t\tlet prev = i > 0 ? data[i - 1].speed : curr;\n\t\t\tlet delta = (curr - prev) * (1000 / this._timeFactor);\n\t\t\tacceleration = Math.abs((delta / deltaT)) * this._accelerationFactor;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" acceleration values.\n\t\tif (this.options.accelerationDeltaMax) {\n\t\t\tlet deltaA = i > 0 ? acceleration - data[i - 1].acceleration : 0;\n\t\t\tlet maxDeltaS = this.options.accelerationDeltaMax;\n\t\t\tif (Math.abs(deltaA) > maxDeltaS) {\n\t\t\t\tacceleration = data[i - 1].acceleration + maxDeltaS * Math.sign(deltaA);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable acceleration values.\n\t\tif (this.options.accelerationRange) {\n\t\t\tlet range = this.options.accelerationRange;\n\t\t\tif (acceleration < range[0]) acceleration = range[0];\n\t\t\telse if (acceleration > range[1]) acceleration = range[1];\n\t\t}\n\n\t\tacceleration = L.Util.formatNum(acceleration, 2);\n\n\t\tif (acceleration > sMax) sMax = acceleration;\n\t\tif (acceleration < sMin) sMin = acceleration;\n\t\tsAvg = (acceleration + sAvg) / 2.0;\n\n\t\tdata[i].acceleration = acceleration;\n\n\t\ttrack.acceleration_max = sMax;\n\t\ttrack.acceleration_min = sMin;\n\t\ttrack.acceleration_avg = sAvg;\n\t});\n\n\tthis._registerFocusLabel({\n\t\tname : 'acceleration',\n\t\tchart : (item) => item.acceleration + \" \" + acceleration.label,\n\t\tmarker: (item) => Math.round(item.acceleration) + \" \" + acceleration.label,\n\t});\n\n\tthis._registerSummary({\n\t\t\"minacceleration\" : {\n\t\t\tlabel: \"Min Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_min || 0) + ' ' + acceleration.label\n\t\t},\n\t\t\"maxacceleration\" : {\n\t\t\tlabel: \"Max Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_max || 0) + ' ' + acceleration.label\n\t\t},\n\t\t\"avgacceleration\": {\n\t\t\tlabel: \"Avg Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_avg || 0) + ' ' + acceleration.label\n\t\t}\n\t});\n\n});\n","/*\n * Copyright (c) 2019, GPL-3.0+ Project, Raruto\n *\n * This file is free software: you may copy, redistribute and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 2 of the License, or (at your\n * option) any later version.\n *\n * This file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n *\n * This file incorporates work covered by the following copyright and\n * permission notice:\n *\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\n *\n * Permission to use, copy, modify, and/or distribute this software\n * for any purpose with or without fee is hereby granted, provided\n * that the above copyright notice and this permission notice appear\n * in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Chart } from './chart';\nimport { Elevation } from './control';\nimport './distance';\nimport './altitude';\nimport './time';\nimport './slope';\nimport './speed';\nimport './acceleration';\n\nElevation.Utils = _;\nElevation.Components = D3;\nElevation.Chart = Chart;\n\nL.control.elevation = (options) => new Elevation(options);\n"],"names":["deepMerge","target","sources","length","source","shift","isObject","key","Object","assign","deferFunc","f","document","readyState","window","addEventListener","once","factory","define","amd","exports","module","require","L","locales","locale","registerLocale","code","Util","extend","setLocale","i18n","_","string","data","template","err","MIN","SEC","HOUR","DAY","formatTime","t","d","Math","floor","h","m","s","round","toString","padStart","GeoJSONLoader","control","JSON","parse","distanceMarkers","this","options","lazy","wptIcons","layer","geoJson","style","feature","polyline","theme","className","pointToLayer","latlng","waypoints","prop","properties","desc","name","sym","replace","toLowerCase","hasOwnProperty","divIcon","html","marker","icon","bindPopup","openPopup","_addMarker","_registerCheckPoint","label","fire","point","element","onEachFeature","geometry","type","_latlngs","forEach","i","meta","time","ele","hr","cad","atemp","alt","Date","coordTimes","times","_typeof","parseInt","heartRates","heartRate","addData","on","e","path","DistanceMarkers","Polyline","track_info","Control","Elevation","_d3LazyLoader","then","_fireEvt","item","Array","isArray","isVisible","elem","styles","getComputedStyle","visibility","display","isVisibleByStyles","boundingRect","getBoundingClientRect","left","right","top","above","bottom","pointerEvents","elementFromPoint","isAboveOtherElements","isJSONDoc","doc","trim","indexOf","console","warn","isXMLDoc","documentElement","ownerDocument","nodeName","lazyLoader","url","skip","loader","Promise","resolve","reject","tag","createElement","src","head","appendChild","saveFile","dataURI","fileName","a","create","href","download","b","body","click","removeChild","waitHolder","ticking","scrollFn","requestAnimFrame","removeEventListener","addClass","targetNode","split","every","DomUtil","removeClass","toggleClass","conditional","call","replaceClass","removeClassName","addClassName","value","getStyle","setProperty","toggleStyle","toggleEvent","leafletElement","eventName","handler","tagName","attributes","parent","setAttributes","append","child","insert","position","insertAdjacentElement","attrs","k","setAttribute","select","selector","context","querySelector","DomEvent","off","hasClass","randomId","random","substr","each","obj","fn","func","wait","immediate","timeout","args","arguments","clearTimeout","setTimeout","apply","offsetWidth","offsetHeight","getClientRects","Colors","area","alpha","stroke","line","Area","width","height","xAttr","yAttr","scaleX","scaleY","interpolation","d3","curve","x","xDiagCoord","y0","y1","Path","color","strokeColor","strokeOpacity","fillOpacity","classed","attr","Axis","tickSize","tickPadding","axis","scale","ticks","tickFormat","labelX","labelY","onAxisMount","g","w","axisScale","l","toUpperCase","axisGroup","join","text","Grid","props","HeightFocusLine","xCoord","yCoord","HeightFocusLabel","y","node","selectAll","HeightFocusMarker","circle","LegendItem","margins","svg","ownerSVGElement","dispatch","detail","legend","enabled","MouseFocusLine","MouseFocusLabel","rect","xAlign","yAlign","bbox","getBBox","max","Browser","webkit","Infinity","Ruler","symbol","symbolTriangle","exit","remove","enter","merge","size","angle","Domain","min","forceBounds","domain","extent","Range","Scale","range","scaleLinear","Chart","_width","ruler","_height","panes","grid","brush","tooltip","clipPath","clipRect","foreignObject","canvas","getContext","dragG","focusG","brushG","brushX","utils","chart","opts","test","navigator","platform","userAgent","_resize","bisector","invert","Class","includes","Evented","prototype","Mixin","Events","initialize","_data","_props","scales","paths","areas","grids","axes","legendItems","focusLabels","_scales","_domains","_ranges","_paths","_brushEnabled","dragging","_zoomEnabled","zooming","imperial","_xLabel","_yLabel","xLabel","yLabel","_chart","D3","_container","_grid","pane","_area","_point","_axis","_legend","_initScale","_clipPath","get","_canvas","_context","_dragG","_focusG","_brush","_focusline","_focuslabel","_zoom","zoom","_drag","drag","_initInteractions","update","_updateScale","_updateArea","_updateAxis","_updateLegend","_updateClipper","render","container","_this","clear","_resetDrag","_hideDiagramIndicator","clearRect","_path","_drawPath","ctx","datum","preferCanvas","beginPath","moveTo","p","Path2D","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","_hasActiveLayers","_initBrush","focus","_this2","sourceEvent","pointers","_findIndexForXCoord","filter","shiftKey","button","selection","start","end","dragstart","dragend","bind","_initClipper","margin","scaleExtent","translateExtent","_this3","buttons","transform","distance","_x","rescaleX","_initRuler","_initLegend","_this4","formatNum","format","yMax","_this5","z","_y","coords","_findCoordsForY","_registerAxisScale","xAxisMin","xAxisMax","yAxisMin","yAxisMax","altitude","_registerAreaPath","_registerAxisGrid","forceAxisBounds","xTicks","yTicks","_findIndexForLatLng","dist","isNaN","property","pos","y2","x2","_registerFocusLabel","gridOpts","axesOpts","n","translate","substring","legends","items","nodes","v","map","sign","rev","slice","reverse","push","concat","xAxesB","marginB","marginR","_this6","tx","ty","r","next","list","reduce","array","index","curr","_this7","result","distanceTo","_resetZoom","zoomIdentity","_showDiagramIndicator","xCoordinate","yCoordinate","decimalsX","decimalsY","labels","Marker","_focusmarker","_marker","markerIcon","zIndexOffset","interactive","_focuslabels","addTo","_map","getPane","_latlng","latLngToLayerPoint","_rotate","rotatedPointToMapPanePoint","normalizedAlt","maxElevation","normalizedY","getElement","setLatLng","getLatLng","Summary","summary","reset","innerHTML","_registerSummary","Options","autofitBounds","autohide","mobile","autohideMarker","almostover","collapsed","detached","distanceFactor","downloadLink","elevationDiv","followMarker","heightFactor","lazyLoadJS","loadData","defer","iconSize","iconAnchor","placeholder","opacity","weight","lineCap","polylineSegments","reverseCoords","skipNullZCoords","responsive","slope","speed","sLimit","undefined","timeFactor","timeFormat","sDeltaMax","sInterpolation","sRange","zFollow","Mobile","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LDISTANCEM","_addData","_addLayer","eleDiv","_initElevationDiv","isConnected","getContainer","onAdd","_clearChart","_layers","_clearLayers","_markers","_clearMarkers","_updateChart","_events","elechart_updated","controlElevation","eachLayer","clearLayers","disableBrush","enableBrush","enableDragging","enableBrushing","disableDragging","disableBrushing","disableZoom","enableZoom","fitBounds","bounds","getBounds","isValid","latLngBounds","getZFollow","_zFollow","hide","featureGroup","_markedSegments","_chartEnabled","_setMapView","throttle","setStyle","colors","load","loadChart","loadDefer","loadLazy","loadXML","loadGeoJSON","loadFile","fetch","response","_downloadURL","catch","loadGPX","_togeojsonLazyLoader","toGeoJSON","xml","DOMParser","parseFromString","geojson","getElementsByTagName","pop","parentNode","_initButton","_initChart","_initSummary","_initMarker","_initLayer","_hideMarker","_resetView","_resizeChart","_rotateMarker","_updateSummary","onRemove","redraw","setZFollow","show","geom","_addGeoJSONData","coordinates","features","_addGPXData","_addPoint","_this8","lat","lng","latLng","addLayer","id","_collapse","_expand","_findItemForLatLng","_findItemForX","propagate","_xTicks","_yTicks","clientWidth","_maxWidth","maxWidth","_dragendHandler","_mousemoveHandler","_mouseoutHandler","_rulerFilterHandler","_toggleChartHandler","_this9","_mousemoveLayerHandler","_pane","createPane","zIndex","_renderer","disableClickPropagation","stopPropagation","_mousewheelHandler","link","_button","title","stop","_toggle","_summary","summaryDiv","_updateMarker","gestureHandling","_enabled","ll","getCenter","getZoom","deltaY","flyTo","_this10","_this11","_this12","_this13","_this14","_this15","_isFullscreen","newWidth","_updateMapSegments","setView","animate","duration","contains","_this16","elevation_max","setLatLngs","hasLayer","onclick","preventDefault","_this17","confirm","__xTicks","__yTicks","addInitHook","_popup","_content","decodeURI","bindTooltip","direction","sticky","openTooltip","CustomEvent","dispatchEvent","_this18","_geomutilLazyLoader","GeometryUtil","almostOver","_almostoverLazyLoader","Handler","AlmostOver","addHandler","_distanceMarkersLazyLoader","oldProto","Canvas","_fillStroke","include","oldVal","_distanceFactor","track","prev","delta","toFixed","_heightFactor","eleMax","eleMin","elevation_min","prevZ","lastZ","_lastValidZ","currZ","splice","timeLabel","_timeFactor","_timeAVGSpeed","timeAVGSpeed","speedFactor","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","xTimeFormat","getTime","now","getTimezoneOffset","currT","prevT","deltaT","abs","slopeLabel","tAsc","ascent","tDes","descent","sMax","slope_max","sMin","slope_min","deltaZ","deltaS","maxDeltaS","acceleration","speedLabel","_speedFactor","speed_max","speed_min","sAvg","speed_avg","speedDeltaMax","speedRange","accelerationLabel","_accelerationFactor","accelerationFactor","acceleration_max","acceleration_min","acceleration_avg","accelerationDeltaMax","deltaA","accelerationRange","Utils","Components","elevation"],"mappings":"wbAIO,SAASA,EAAUC,8BAAWC,mCAAAA,wBAC/BA,EAAQC,OAAQ,OAAOF,MACtBG,EAASF,EAAQG,WACnBC,EAASL,IAAWK,EAASF,OAC3B,IAAMG,KAAOH,EACbE,EAASF,EAAOG,KACdN,EAAOM,IAAMC,OAAOC,OAAOR,OAC9BM,EAAM,KAERP,EAAUC,EAAOM,GAAMH,EAAOG,KAE9BC,OAAOC,OAAOR,OACZM,EAAMH,EAAOG,YAKXP,gBAAUC,UAAWC,IAMtB,SAASQ,EAAUC,GACG,aAAxBC,SAASC,WAA2BC,OAAOC,iBAAiB,OAAQJ,EAAG,CAAEK,MAAM,IAC9EL,KC5BL,SAAUM,EAASH,GAGM,mBAAXI,QAAyBA,OAAOC,IACvCD,OAAO,CAAC,WAAYD,GAGM,iBAAZG,UACdC,OAAOD,QAAUH,EAAQK,QAAQ,kBAIf,IAAXR,GAA0BA,EAAOS,GACxCN,EAAQH,EAAOS,GAbtB,EAgBC,SAAUA,UACRA,EAAEC,QAAU,GACZD,EAAEE,OAAS,KACXF,EAAEG,eAAiB,SAAwBC,EAAMF,GAC7CF,EAAEC,QAAQG,GAAQJ,EAAEK,KAAKC,OAAO,GAAIN,EAAEC,QAAQG,GAAOF,IAEzDF,EAAEO,UAAY,SAAmBH,GAC7BJ,EAAEE,OAASE,GAERJ,EAAEQ,KAAOR,EAAES,EAAI,SAAmBC,EAAQC,GACzCX,EAAEE,QAAUF,EAAEC,QAAQD,EAAEE,SAAWF,EAAEC,QAAQD,EAAEE,QAAQQ,KACvDA,EAASV,EAAEC,QAAQD,EAAEE,QAAQQ,QAK7BA,EAASV,EAAEK,KAAKO,SAASF,EAAQC,GAErC,MAAOE,WAGAH,KAEZnB,QDOH,IACMuB,EAAOC,IACPC,EAAa,GAANF,EACPG,EAAc,GAAPD,EAKN,SAASE,EAAWC,OACtBC,EAAIC,KAAKC,MAAMH,EAAIF,GACnBM,EAAIF,KAAKC,OAAQH,EAAIC,EAAIH,GAAOD,GAChCQ,EAAIH,KAAKC,OAAQH,EAAIC,EAAIH,EAAMM,EAAIP,GAAQF,GAC3CW,EAAIJ,KAAKK,OAAQP,EAAIC,EAAIH,EAAMM,EAAIP,EAAOQ,EAAIV,GAZtC,YAaD,KAANW,IAAaD,IAAKC,EAAI,GAChB,KAAND,IAAaD,IAAKC,EAAI,GAChB,KAAND,IAAaH,IAAKG,EAAI,IACnBH,EAAIA,EAAI,KAAO,IAAMG,EAAEI,WAAWC,SAAS,EAAG,GAAK,IAAMJ,EAAEG,WAAWC,SAAS,EAAG,GAAK,IAAMH,EAAEE,WAAWC,SAAS,EAAG,GAAK,IAM7H,SAASC,EAAclB,EAAMmB,GACf,iBAATnB,IACVA,EAAOoB,KAAKC,MAAMrB,QAIdsB,GACiC,KAHtCH,EAAUA,GAAWI,MAGXC,QAAQF,gBACb,CAAEG,MAAM,GACRpC,EAAEM,OAAO,CAAE8B,MAAM,GAAQN,EAAQK,QAAQF,iBAGzCI,EAAWP,EAAQK,QAAQE,SAE5BC,EAAQtC,EAAEuC,QAAQ5B,EAAM,CAC3BsB,gBAAiBA,EACjBO,MAAO,SAACC,OACHD,EAAQxC,EAAEM,OAAO,GAAIwB,EAAQK,QAAQO,iBACrCZ,EAAQK,QAAQQ,QACnBH,EAAMI,WAAa,IAAMd,EAAQK,QAAQQ,OAEnCH,GAERK,aAAc,SAACJ,EAASK,MAClBhB,EAAQK,QAAQY,eAEjBC,EAASP,EAAQQ,WACjBC,EAASF,EAAKE,KAAOF,EAAKE,KAAO,GACjCC,EAASH,EAAKG,KAAOH,EAAKG,KAAO,GACjCC,GAAUJ,EAAKI,IAAMJ,EAAKI,IAAMD,GAAME,QAAQ,IAAK,KAAKA,QAAQ,IAAK,IAAIA,QAAQ,IAAK,IAAIC,cAGzFjB,EAASkB,eAAeH,KAC5Bf,EAASe,GAAOpD,EAAEwD,QACjBxD,EAAEM,OAAO,GAAI+B,EAAS,IAAIF,QAAS,CAAEsB,KAAM,qCAAuCL,EAAM,iBAGtFM,EAAS1D,EAAE0D,OAAOZ,EAAQ,CAAEa,KAAMtB,EAASe,YAC3CD,GAAQD,IACXQ,EAAOE,UAAU,MAAQT,EAAO,QAAUD,EAAKtE,OAAS,EAAI,OAASsE,EAAO,KAAKW,YAE/E/B,EAAQgC,WAAWJ,GACtB5B,EAAQiC,oBAAoB,CAACjB,OAAQA,EAAQkB,MAAOb,IAAO,GAC3DrB,EAAQmC,KAAK,iBAAkB,CAAEC,MAAOR,EAAQS,QAASrB,EAAQG,WAAYD,IACtEU,IAERU,cAAe,SAAC3B,EAASH,GACpBG,EAAQ4B,UAAqC,SAAzB5B,EAAQ4B,SAASC,OAMzChC,EAAMiC,SAASC,SAAQ,SAACN,EAAOO,EAAG9D,MAEjCuD,EAAMQ,KAAO,CAAEC,KAAM,KAAMC,IAAK,KAAMC,GAAI,KAAMC,IAAK,KAAMC,MAAO,MAC/D,QAASb,IAAOA,EAAMQ,KAAKE,IAAMV,EAAMc,KACvCvC,EAAQQ,WAAY,KAClBD,EAAOP,EAAQQ,WAChB,eAAgBD,EAAMkB,EAAMQ,KAAKC,KAAO,IAAIM,KAAKA,KAAKjD,MAAMgB,EAAKkC,WAAWT,KACvE,UAAWzB,EAAMkB,EAAMQ,KAAKC,KAAO,IAAIM,KAAKA,KAAKjD,MAAMgB,EAAKmC,MAAMV,KAClE,SAAUzB,IAAMkB,EAAMQ,KAAKC,KAAO,IAAIM,KAAKA,KAAKjD,MAA4B,WAArBoD,EAAOpC,EAAK2B,MAAoB3B,EAAK2B,KAAKF,GAAKzB,EAAK2B,QAChH,eAAgB3B,EAAMkB,EAAMQ,KAAKG,GAAKQ,SAASrC,EAAKsC,WAAWb,IAC1D,cAAezB,IAAMkB,EAAMQ,KAAKG,GAAKQ,SAAoC,WAA1BD,EAAOpC,EAAKuC,WAAyBvC,EAAKuC,UAAUd,GAAKzB,EAAKuC,gBAIvHzD,EAAQ0D,QAAQlD,GAGbR,EAAQK,QAAQF,iBAAmBA,EAAgBG,MACpDE,EAAMmD,GAAG,cAAc,SAACC,OAClBC,EAAOD,EAAEhH,OACTsB,EAAE4F,iBAAmBD,aAAgB3F,EAAE6F,UAC5CF,EAAKD,EAAEpB,KAAO,wBAKjBxC,EAAQgE,WAAa9F,EAAEM,OAAO,GAAIwB,EAAQgE,WAAY,CAAExB,KAAM,UAAWnB,KAAMxC,EAAKwC,kBAItFnD,EAAE+F,QAAQC,UAAUC,cAAcC,MAAK,WACtCpE,EAAQqE,SAAS,iBAAkB,CAAExF,KAAMA,EAAM2B,MAAOA,EAAOa,KAAMrB,EAAQgE,WAAW3C,KAAM2C,WAAYhE,EAAQgE,gBAG5GxD,EAaD,SAASvD,EAASqH,UAChBA,GAAwB,WAAhBhB,EAAOgB,KAAsBC,MAAMC,QAAQF,GAMrD,SAASG,EAAUC,OACpBA,EAAM,OAAO,MAEdC,EAASlH,OAAOmH,iBAAiBF,oBAEVA,EAAMC,SACH,WAAtBA,EAAOE,YAA8C,SAAnBF,EAAOG,QA2B5CC,CAAkBL,EAAMC,eAxBCD,EAAMC,OAC/BK,EAAeN,EAAKO,wBACpBC,EAAOF,EAAaE,KAAO,EAC3BC,EAAQH,EAAaG,MAAQ,EAC7BC,EAAMJ,EAAaI,IAAM,EAEzBC,GADSL,EAAaM,QACd,GAERC,EAAgBb,EAAKhE,MAAM6E,oBAEC,QAA5BZ,EAAO,oBAA6BD,EAAKhE,MAAM6E,cAAgB,QAE/DhI,SAASiI,iBAAiBN,EAAME,KAASV,IAAMW,GAAQ,GACvD9H,SAASiI,iBAAiBL,EAAOC,KAASV,IAAMW,GAAQ,GAM5DX,EAAKhE,MAAM6E,cAAgBA,EAEpBF,EAIHI,CAAqBf,EAAMC,GAO1B,SAASe,EAAUC,EAAKrF,MAC9BA,OAAuB,IAATA,GAA8BA,EACzB,iBAARqF,GAAoBrF,SAEH,IAD3BqF,EAAMA,EAAIC,QACCC,QAAQ,MAAiC,GAApBF,EAAIE,QAAQ,SAG3C5F,KAAKC,MAAMyF,EAAI9F,YACd,MAAO+D,WACW,WAAfN,EAAOqC,KAAoBrF,KAC/BwF,QAAQC,KAAKnC,IACN,UAED,EAOF,SAASoC,EAASL,EAAKrF,MAC7BA,OAAuB,IAATA,GAA8BA,EACzB,iBAARqF,GAAoBrF,SAEH,IAD3BqF,EAAMA,EAAIC,QACCC,QAAQ,SAEfI,GAAmBN,EAAMA,EAAIO,eAAiBP,EAAM,GAAGM,wBACpDA,GAA+C,SAA7BA,EAAgBE,SAOpC,SAASC,EAAWC,EAAKC,EAAMC,UACxB,IAATD,EACIE,QAAQC,UAEZF,aAAkBC,QACdD,EAED,IAAIC,SAAQ,SAACC,EAASC,OACxBC,EAAMpJ,SAASqJ,cAAc,UACjCD,EAAIjJ,iBAAiB,OAAQ+I,EAAS,CAAE9I,MAAM,IAC9CgJ,EAAIE,IAAMR,EACV9I,SAASuJ,KAAKC,YAAYJ,MAOrB,SAASK,EAASC,EAASC,OAC7BC,EAAIC,EAAO,IAAK,GAAI,CAAEC,KAAMJ,EAASrK,OAAQ,OAAQ0K,SAAUJ,GAAY,GAAIxG,MAAO,kBACtF6G,EAAIhK,SAASiK,KACjBD,EAAER,YAAYI,GACdA,EAAEM,QACFF,EAAEG,YAAYP,GAMR,SAASQ,EAAWjD,UACnB,IAAI8B,SAAQ,SAACC,EAASC,OACxBkB,GAAU,EACVC,EAAW,SAAXA,IACED,IACJ1J,EAAEK,KAAKuJ,kBAAiB,WACnBrD,EAAUC,KACbjH,OAAOsK,oBAAoB,SAAUF,GACrCpB,KAEDmB,GAAU,KAEXA,GAAU,IAGZnK,OAAOC,iBAAiB,SAAUmK,GAC9BnD,GAAMA,EAAKhH,iBAAiB,aAAcmK,EAAU,CAAElK,MAAM,IAChEkK,OAOK,SAASG,EAASC,EAAYnH,GAChCmH,GAAYnH,EAAUoH,MAAM,KAAKC,OAAM,SAAAxI,UAAKA,GAAKzB,EAAEkK,QAAQJ,SAASC,EAAYtI,MAM9E,SAAS0I,EAAYJ,EAAYnH,GACnCmH,GAAYnH,EAAUoH,MAAM,KAAKC,OAAM,SAAAxI,UAAKA,GAAKzB,EAAEkK,QAAQC,YAAYJ,EAAYtI,MAGjF,SAAS2I,EAAYL,EAAYnH,EAAWyH,UAC1CA,EAAcP,EAAWK,GAAaG,KAAK,KAAMP,EAAYnH,GAG/D,SAAS2H,EAAaR,EAAYS,EAAiBC,GACpDD,GAAiBL,EAAYJ,EAAYS,GACzCC,GAAcX,EAASC,EAAYU,GAGlC,SAASjI,EAAMuH,EAAY5G,EAAMuH,eAClB,IAAVA,EAA8B1K,EAAEkK,QAAQS,SAASZ,EAAY5G,GAC5D4G,EAAWvH,MAAMoI,YAAYzH,EAAMuH,GAGzC,SAASG,EAAYd,EAAY5G,EAAMuH,EAAOL,UAC5C7H,EAAMuH,EAAY5G,EAAMkH,EAAcK,EAAQ,IAGhD,SAASI,EAAYC,EAAgBC,EAAWC,EAASZ,UACxDU,EAAeV,EAAc,KAAO,OAAOW,EAAWC,GAMvD,SAAS/B,EAAOgC,EAAStI,EAAWuI,EAAYC,OAClD5E,EAAOxG,EAAEkK,QAAQhB,OAAOgC,EAAStI,GAAa,WAC9CuI,GAAYE,EAAc7E,EAAM2E,GAChCC,GAAQE,EAAOF,EAAQ5E,GACpBA,EAMD,SAAS8E,EAAOF,EAAQG,UACvBH,EAAOvC,YAAY0C,GAMpB,SAASC,EAAOJ,EAAQG,EAAOE,UAC9BL,EAAOM,sBAAsBD,EAAUF,GAMxC,SAASF,EAAc7E,EAAMmF,OAC9B,IAAIC,KAAKD,EAASnF,EAAKqF,aAAaD,EAAGD,EAAMC,IAM5C,SAASE,EAAOC,EAAUC,UACxBA,GAAW3M,UAAU4M,cAAcF,GAMrC,IAAMtG,EAAKzF,EAAEkM,SAASzG,GAKhB0G,EAAMnM,EAAEkM,SAASC,IAKjBC,EAAWpM,EAAEkK,QAAQkC,SAG3B,SAASC,WACRhL,KAAKiL,SAAS3K,SAAS,IAAI4K,OAAO,EAAG,GAGtC,SAASC,EAAKC,EAAKC,OACpB,IAAIjI,KAAKgI,EAAKC,EAAGD,EAAIhI,GAAIA,wEA1WxB,SAAkBkI,EAAMC,EAAMZ,EAASa,OACzCC,SACG,eACFC,EAAOC,UACXC,aAAaH,GACbA,EAAWI,YAAW,WACrBJ,EAAU,KACND,GAAWF,EAAKQ,MAAMnB,EAASe,KACjCH,GACCC,IAAcC,GAASH,EAAKQ,MAAMnB,EAASe,+CAuH1C,SAAsBvG,YAClBA,EAAK4G,aAAe5G,EAAK6G,cAAgB7G,EAAK8G,iBAAiB1O,oREnK7D2O,EAAS,WACR,CAAEC,KAAM,UAAWC,MAAO,IAAMC,OAAQ,mBACxC,CAAEF,KAAM,kBACR,CAAEA,KAAM,eACR,CAAEA,KAAM,qBACR,CAAEA,KAAM,eACR,CAAEA,KAAM,aACR,CAAEA,KAAM,UAAWG,KAAM,YAG1BC,EAAO,cACnBC,UACAC,IAAAA,OACAC,IAAAA,MACAC,IAAAA,MACAC,IAAAA,OACAC,IAAAA,WACAC,cAAAA,aAAgB,uBAETC,GAAGZ,OACRa,MAA+B,iBAAlBF,EAA6BC,GAAGD,GAAiBA,GAC9DG,GAAE,SAAAlN,UAAMA,EAAEmN,WAAaN,EAAO7M,EAAE2M,OAChCS,GAAGV,GACHW,IAAG,SAAArN,UAAK8M,EAAO9M,EAAE4M,QAGPU,EAAO,gBACnBvL,IAAAA,KACAwL,IAAAA,MACAC,IAAAA,YACAC,IAAAA,cACAC,IAAAA,YAEInJ,EAAOyI,GAAGlF,OAAO,mBAEjB/F,GAAMwC,EAAKoJ,QAAQ5L,GAAM,GAE7BwC,EAAKnD,MAAM,iBAAkB,QAE7BmD,EACCqJ,KAAK,OAAQL,GAAS,WACtBK,KAAK,SAAUJ,GAAe,QAC9BI,KAAK,iBAAkBH,GAAiB,KACxCG,KAAK,eAAgBF,GAAe,OAE9BnJ,GAGKsJ,EAAO,oBACnB3K,KAAAA,aAAO,aACP4K,SAAAA,aAAW,QACXC,YAAAA,aAAc,IACd1D,IAAAA,SACAqC,IAAAA,OACAD,IAAAA,MACAuB,IAAAA,KACAC,IAAAA,MACAC,IAAAA,MACAC,IAAAA,WACAvL,IAAAA,MACAwL,IAAAA,OACAC,IAAAA,WACAtM,KAAAA,aAAO,KACPuM,IAAAA,mBAEO,SAAAC,OACDC,EAAS,EAANrO,EAAS,EACD,UAAZkK,IAAsBlK,EAAIuM,GACd,SAAZrC,IAAsBmE,EAAI/B,GAElB,KAARuB,GAAuB,QAAR9K,EAClB4K,GAAYpB,EACM,KAARsB,GAAuB,QAAR9K,IACzB4K,GAAYrB,OAGTgC,EAAYzB,GAAG,OAAS3C,EAASpI,QAAQ,SAAS,SAAAyM,UAAKA,EAAEC,oBAC3DV,MAAMA,GACNC,MAAMA,GACNH,YAAYA,GACZD,SAASA,GACTK,WAAWA,GAETS,EAAYL,EAAErE,OAAO,KACvB0D,KAAK,QAAS,CAACI,EAAM9K,EAAMmH,EAAUtI,GAAM8M,KAAK,MAChDjB,KAAK,YAAa,aAAeY,EAAI,IAAMrO,EAAI,KAC/C+I,KAAKuF,UAEH7L,GACHgM,EAAU1E,OAAO,YACf0D,KAAK,IAAKQ,GACVR,KAAK,IAAKS,GACVS,KAAKlM,GAGJ0L,GACHM,EAAU1F,KAAKoF,GAGTM,IAIIG,EAAO,SAACC,UACpBA,EAAM9L,KAAO,OACN2K,EAAKmB,IAGAC,EAAkB,gBAC9B1N,IAAAA,UACA2N,OAAAA,aAAS,QACTC,OAAAA,aAAS,QACT3R,OAAAA,aAAS,WAEF,SAAA+O,UAAQA,EACbqB,KAAK,QAASrM,EAAQ,sBACtBqM,KAAK,KAAMsB,GACXtB,KAAK,KAAMsB,GACXtB,KAAK,KAAMuB,GACXvB,KAAK,KAAMpQ,KAGD4R,EAAmB,gBAC/B7N,IAAAA,UACA2N,OAAAA,aAAS,QACTC,OAAAA,aAAS,IACTvM,IAAAA,aAEO,SAAAkM,GACNA,EACElB,KAAK,QAASrM,EAAQ,uBACtBH,MAAM,iBAAkB,QACxBwM,KAAK,IAAKsB,EAAS,GACnBtB,KAAK,IAAKuB,OAERE,EAAIP,EAAKpE,OAAO,0BACf2E,EAAEC,SAAQD,EAAIP,EAAK5E,OAAO,cAE/BmF,EACEzB,KAAK,QAAS,kBACdkB,KAAKlM,GAEPkM,EAAKS,UAAU,SAAS3B,KAAK,IAAKsB,EAAS,GAEpCJ,IAIIU,EAAoB,gBAChCjO,IAAAA,UACA2N,OAAAA,aAAS,QACTC,OAAAA,aAAS,WAEF,SAAAM,UAAUA,EACf7B,KAAK,QAASrM,EAAQ,8BACtBqM,KAAK,YAAa,aAAesB,EAAS,IAAMC,EAAS,KACzDvB,KAAK,IAAK,GACVA,KAAK,KAAM,GACXA,KAAK,KAAM,KAGD8B,EAAa,gBACzB3N,IAAAA,KACCa,IAAAA,MACD6J,IAAAA,MACAC,IAAAA,WACAiD,QAAAA,aAAU,KACVpC,IAAAA,MACAhJ,IAAAA,YAEO,SAAAgK,GACNA,EACEX,KAAK,QAAS,sBAAwB7L,EAAKG,eAC3C0L,KAAK,YAAa7L,OAEd6N,EAAM5C,GAAGtC,OAAO6D,EAAEe,OAAOO,iBAAmBtB,UAElDA,EAAElK,GAAG,gBAAgB,kBAAMuL,EAAIE,SAAS,iBAAkB,CACzDC,OAAQ,CACPxL,KAAMA,EAAK+K,OACXvN,KAAMA,EACNiO,OAAQzB,EAAEe,OACVW,SAAU1L,EAAKoJ,QAAQ,wBAIzBY,EAAErE,OAAO,YACP0D,KAAK,IAAMnB,EAAQ,EAAK,IACxBmB,KAAK,IAAKlB,EAASiD,EAAQ3J,OAAS,GACpC4H,KAAK,QAAS,IACdA,KAAK,SAAU,IACfA,KAAK,OAAQL,GACbK,KAAK,SAAU,QACfA,KAAK,iBAAkB,OACvBA,KAAK,eAAgB,QAEvBW,EAAErE,OAAO,YACP4E,KAAKlQ,EAAES,EAAEuD,GAASb,IAClB6L,KAAK,IAAMnB,EAAQ,EAAK,GACxBmB,KAAK,YAAa,IAClBxM,MAAM,4BAA6B,OACnCA,MAAM,cAAe,OACrBwM,KAAK,IAAKlB,EAASiD,EAAQ3J,OAAS,GACpC4H,KAAK,KAAM,UAENW,IAII2B,EAAiB,oBAC7BhB,OAAAA,aAAS,IACTxC,IAAAA,cAEO,SAAAH,UAAQA,EACbqB,KAAK,QAAS,oBACdA,KAAK,KAAMsB,GACXtB,KAAK,KAAM,GACXA,KAAK,KAAMsB,GACXtB,KAAK,KAAMlB,KAGDyD,EAAkB,gBAC9BjB,IAAAA,OACAC,IAAAA,WACAf,OAAAA,aAAS,SACTC,OAAAA,aAAS,KACT5B,IAAAA,aAEO,SAAA8B,GAENA,EAAEX,KAAK,QAAS,yBAEZwC,EAAO7B,EAAE7D,OAAO,2BAChBoE,EAAOP,EAAE7D,OAAO,2BAChB2E,EAAOP,EAAKpE,OAAO,wBACnBwC,EAAO4B,EAAKpE,OAAO,wBAElB0F,EAAKd,SAAQc,EAAO7B,EAAErE,OAAO,aAC7B4E,EAAKQ,SAAQR,EAAOP,EAAErE,OAAO,aAC7BmF,EAAEC,SAAWD,EAAOP,EAAK5E,OAAO,cAChCgD,EAAEoC,SAAWpC,EAAO4B,EAAK5E,OAAO,cAErCmF,EAAEP,KAAKT,GACPnB,EAAE4B,KAAKV,OAGHiC,EAAS,EACTC,EAAS,EACTC,EAAS,CAAE9D,MAAO,EAAGC,OAAQ,OAC3B6D,EAAOzB,EAAKQ,OAAOkB,UAAa,MAAOlM,UAAYiK,SAErDW,IAAQmB,EAASnB,GAAUA,EAASzC,EAAQ,EAAI,IAAM8D,EAAK9D,MAAQ,KACnE0C,IAAQmB,EAASrQ,KAAKwQ,IAAItB,EAASoB,EAAK7D,OAAQ9N,EAAE8R,QAAQC,OAAS,GAAKC,EAAAA,IAE5ER,EACExC,KAAK,QAAS,0BACdA,KAAK,IAAKyC,EAAS,GACnBzC,KAAK,IAAK0C,EAAS,GACnB1C,KAAK,QAAS2C,EAAK9D,MAAQ,IAC3BmB,KAAK,SAAU2C,EAAK7D,OAAS,IAC7BkB,KAAK,KAAM,GACXA,KAAK,KAAM,GACbkB,EACElB,KAAK,QAAS,0BACdxM,MAAM,cAAe,OACrBwM,KAAK,IAAK0C,GACZjB,EACEzB,KAAK,QAAS,uBACdA,KAAK,KAAM,OACbV,EACEU,KAAK,QAAS,uBACdA,KAAK,KAAM,OAEbkB,EAAKS,UAAU,SAAS3B,KAAK,IAAKyC,GAE3B9B,IAIIsC,EAAQ,gBACpBnE,IAAAA,OACAD,IAAAA,aAEO,SAAA8B,GAENA,EAAEhP,KAAK,CAAC,GACD,IACAmN,KAELkB,KAAK,aAAa,SAAA5N,SAAK,aAAeA,EAAEkN,EAAI,IAAMlN,EAAEqP,EAAI,WAEtDe,EAAS7B,EAAEgB,UAAU,yBACvBhQ,KAAK,CAAC,CAAEiP,EAAG/B,KAETF,EAASgC,EAAEgB,UAAU,yBACvBhQ,KAAK,CAAC,CAAEiP,EAAG/B,KAET7J,EAAS2L,EAAEgB,UAAU,0BACvBhQ,KAAK,CAAC,CAAEiP,EAAG/B,EAAQ,KAEjBqE,EAASvC,EAAEgB,UAAU,2BACvBhQ,KAAK,CAAC,MACEyN,GAAG+D,iBACNtE,EAAQ,IACR,SACK,QACF,aAGV2D,EAAKY,OAAOC,SACZ1E,EAAKyE,OAAOC,SACZrO,EAAMoO,OAAOC,SACbH,EAAOE,OAAOC,SAEdb,EAAKc,QACHhH,OAAO,YACP0D,KAAK,QAAS,wBACdA,KAAK,IAAK,GACVA,KAAK,KAAM,GACXA,KAAK,SAAU,GACfA,KAAK,OAAQ,QACbA,KAAK,iBAAkB,OACvBuD,MAAMf,GACNxC,KAAK,SAAS,SAAA5N,UAAKA,EAAEwO,KAEvBjC,EAAK2E,QACHhH,OAAO,YACP0D,KAAK,QAAS,wBACdA,KAAK,KAAM,GACXuD,MAAM5E,GACNqB,KAAK,MAAM,SAAA5N,UAAKA,EAAEwO,KAEpB5L,EAAMsO,QACJhH,OAAO,YACP0D,KAAK,QAAS,yBACdA,KAAK,cAAe,OACpBA,KAAK,KAAM,GACXuD,MAAMvO,GACNgL,KAAK,KAAK,SAAA5N,UAAKA,EAAEwO,KAEnBsC,EACEI,QACAhH,OAAO,YACP0D,KAAK,QAAS,0BACduD,MAAML,GACNlD,KAAK,IACLZ,GAAG8D,SACF5N,MAAK,SAAAlD,UAAKA,EAAEkD,QACZkO,MAAK,SAAApR,UAAKA,EAAEoR,SAEbxD,KAAK,aAAa,SAAA5N,SAAK,aAAeA,EAAEkN,EAAI,IAAMlN,EAAEqP,EAAI,YAAcrP,EAAEqR,MAAQ,OAE3E9C,IAII+C,EAAS,gBACrBC,IAAAA,IACAd,IAAAA,IACA7C,IAAAA,KACA7L,IAAAA,KACAyP,IAAAA,YACAvD,IAAAA,aACK,SAAS1O,GACdqO,EAAOA,GAAQ7L,EACXkM,GAASA,EAAML,OAAMA,EAAOK,EAAML,UAClC6D,EAASlS,GAAQA,EAAK/B,OAASwP,GAAG0E,OAAOnS,GAAM,SAAAS,UAAKA,EAAE4N,MAAS,CAAC,EAAG,eACpD,IAAR2D,IAAwBA,EAAME,EAAO,IAAMD,KACrDC,EAAO,GAAKF,QAEM,IAARd,IAAwBA,EAAMgB,EAAO,IAAMD,KACrDC,EAAO,GAAKhB,GAENgB,IAGKE,EAAQ,gBACpB3D,IAAAA,YACK,SAASvB,EAAOC,SACT,KAARsB,EAAyB,CAAC,EAAGvB,GAChB,KAARuB,EAAoB,CAACtB,EAAQ,QAAjC,IAGOkF,EAAQ,gBACpBrS,IAAAA,KACAqO,IAAAA,KACA2D,IAAAA,IACAd,IAAAA,IACAe,IAAAA,YACAK,IAAAA,aAEO7E,GAAG8E,cACRD,MAAMA,GACNJ,OAAOH,EAAO,CAACC,IAAAA,EAAKd,IAAAA,EAAK7C,KAAAA,EAAM4D,YAAAA,GAAxBF,CAAsC/R,KAcnCwS,EAAQ,gBACpBtF,IAAAA,MACAC,IAAAA,WACAiD,QAAAA,aAAU,KAIJqC,KAHNC,MAGiBxF,EAAQkD,EAAQ/J,KAAO+J,EAAQ9J,OAC1CqM,EAAWxF,EAASiD,EAAQ7J,IAAM6J,EAAQ3J,OAG1C4J,EAAQ5C,GAAGlF,OAAO,WAAW8F,KAAK,QAAS,cAG3CW,EAAQqB,EAAI1F,OAAO,KACnBiI,EAAQ,CACbC,KAAS7D,EAAErE,OAAO,KAAK0D,KAAK,QAAS,QACrCxB,KAASmC,EAAErE,OAAO,KAAK0D,KAAK,QAAS,QACrC9K,MAASyL,EAAErE,OAAO,KAAK0D,KAAK,QAAS,SACrCI,KAASO,EAAErE,OAAO,KAAK0D,KAAK,QAAS,QACrCyE,MAAS9D,EAAErE,OAAO,KAAK0D,KAAK,QAAS,SACrC0E,QAAS/D,EAAErE,OAAO,KAAK0D,KAAK,QAAS,WAAWA,KAAK,UAAW,QAChEqE,MAAS1D,EAAErE,OAAO,KAAK0D,KAAK,QAAS,SACrCoC,OAASzB,EAAErE,OAAO,KAAK0D,KAAK,QAAS,WAIhC2E,EAAgBJ,EAAM/F,KAAKlC,OAAO,gBAAgB0D,KAAK,KAAM,qBAC7D4E,EAAgBD,EAASrI,OAAO,YAGhCuI,EAAgBN,EAAM/F,KAAKlC,OAAO,qBAClCwI,EAAgBD,EAAcvI,OAAO,gBAAgB0D,KAAK,QAAS,eACnEhD,EAAgB8H,EAAOpD,OAAOqD,WAAW,MAGzCC,EAAgBT,EAAMF,MACtBY,EAAgBV,EAAMG,QACtBQ,EAAgBX,EAAME,MAE5BQ,EAAO3I,OAAO,YACZhB,KACAgH,EAAe,CACdhB,OAAQ,EACRxC,OAAQwF,KAIXW,EAAO3I,OAAO,KACZhB,KACAiH,EAAgB,CACfjB,OAAQ,EACRC,OAAQ,EACRzC,OAAQwF,EACRzF,MAAQuF,EACR5D,OAAQ,GACRC,OAAQ,UAMPgE,EAAkBrF,GAAG+F,SAAS1O,GAAG,wCAAwC,kBAAMyO,EAAOpI,OAAO,YAAYkD,KAAK,SAAU,SAKxHoF,EAAQ,CACXT,SAAAA,EACAG,OAAAA,EACA9H,QAAAA,EACAgI,MAAAA,EACAC,OAAAA,EACAR,MAAAA,GAGGY,EAAQ,CACXrD,IAAAA,EACArB,EAAAA,EACA4D,MAAAA,EACAa,MAAAA,EACA/E,MAhBqB,SAACiF,SAAU,CAAEhG,EAAG0E,EAAMsB,EAAKhG,GAAImC,EAAGuC,EAAMsB,EAAK7D,KAoBnE4D,QAAiB,gBAChBxG,IAAAA,MACAC,IAAAA,WACAiD,QAAAA,aAAU,KACVsC,IAAAA,MAGMD,EAAWvF,EAAQkD,EAAQ/J,KAAO+J,EAAQ9J,MAC1CqM,EAAWxF,EAASiD,EAAQ7J,IAAM6J,EAAQ3J,OAEhD4J,EAAIhC,KAAK,wBAAkBnB,cAASC,IAClCkB,KAAK,QAASnB,GACdmB,KAAK,SAAUlB,GAEjB6B,EAAEX,KAAK,YAAa,aAAe+B,EAAQ/J,KAAO,IAAM+J,EAAQ7J,IAAM,KAGnE,uBAAuBqN,KAAKC,UAAUC,WAAa,eAAeF,KAAKC,UAAUE,YACnFZ,EACCtR,MAAM,YAAa,aAAeuO,EAAQ/J,KAAO,MAAQ+J,EAAQ7J,IAAM,OAGzE0M,EACE5E,KAAK,IAAK,GACVA,KAAK,IAAK,GACVA,KAAK,QAASoE,GACdpE,KAAK,SAAUsE,GAEjBO,EACE7E,KAAK,QAASoE,GACdpE,KAAK,SAAUsE,GAEjBQ,EACE9E,KAAK,QAASoE,GACdpE,KAAK,SAAUsE,GAEbD,GACHW,EAAU1J,KAAK2H,EAAM,CAAEnE,OAAQwF,EAASzF,MAAOuF,KAGhDc,EAAO5J,KAAKmJ,EAAMX,OAAQ,CAAE,CAAC,EAAE,GAAI,CAACM,EAAQE,MAC5CY,EAAOpI,OAAO,YAAYkD,KAAK,SAAU,MAEzCqF,EAAMjB,OAAUA,EAChBiB,EAAMf,QAAUA,EAEhBe,EAAMrD,IAAIE,SAAS,SAAU,CAAEC,OAAQ,CAAEtD,MAAOuF,EAAQtF,OAAQwF,MAIjEe,KAAa,SAAClR,UACRoQ,EAAMpQ,KACVoQ,EAAMpQ,GAAQwM,EAAErE,OAAO,KAAK0D,KAAK,QAAS7L,IAEpCoQ,EAAMpQ,IAGdkR,IAAY,SAAClR,UAASiR,EAAMjR,YAE5BkR,EAAMM,QAAQ,CAAE9G,MAAAA,EAAOC,OAAAA,EAAQiD,QAAAA,IAExBsD,yNA7Jc,oBACrB1T,KAAAA,aAAO,CAAC,EAAG,KACX0O,IAAAA,MACAf,IAAAA,EACAU,IAAAA,YAEOZ,GACLwG,UAAS,SAAAxT,UAAKA,EAAE4N,MAChBhI,KAAKrG,EAAM0O,EAAMwF,OAAOvG,eChZhB6E,EAAQnT,EAAE8U,MAAMxU,OAAO,CAEjCyU,SAAU/U,EAAEgV,QAAUhV,EAAEgV,QAAQC,UAAYjV,EAAEkV,MAAMC,OAEpDC,WAAY,SAASd,EAAMxS,QACrBK,QAAgBmS,OAChBxS,QAAgBA,OAEhBuT,MAAgB,QAGhBC,OAAgB,CACpBC,OAAa,GACbC,MAAa,GACbC,MAAa,GACbC,MAAa,GACbC,KAAa,GACbC,YAAa,GACbC,YAAa,SAGTC,QAAgB,QAChBC,SAAgB,QAChBC,QAAgB,QAChBC,OAAgB,QAEhBC,cAAgB5B,EAAK6B,cACrBC,aAAgB9B,EAAK+B,QAEtB/B,EAAKgC,eACHC,QAAW,UACXC,QAAW,YAEXD,QAAWjC,EAAKmC,YAChBD,QAAWlC,EAAKoC,YAGlBrC,EAAcnS,KAAKyU,OAASC,EAAStC,GAGvBpS,KAAK2U,WAAaxC,EAAMrD,SAGrC8F,MAAazC,EAAM0C,KAAK,aACxBC,MAAa3C,EAAM0C,KAAK,aACxBE,OAAa5C,EAAM0C,KAAK,cACxBG,MAAa7C,EAAM0C,KAAK,aACxBI,QAAa9C,EAAM0C,KAAK,eAGxBK,kBAGAC,UAAahD,EAAMiD,IAAI,iBACvBC,QAAalD,EAAMiD,IAAI,eACvBE,SAAanD,EAAMiD,IAAI,gBACvBG,OAAapD,EAAMiD,IAAI,cACvBI,QAAarD,EAAMiD,IAAI,eACvBK,OAAatD,EAAMiD,IAAI,cAGvBM,WAAc1V,KAAKwV,QAAQ5L,OAAO,0BAClC+L,YAAc3V,KAAKwV,QAAQ5L,OAAO,2BAElCgM,MAAQ1J,GAAG2J,YACXC,MAAQ5J,GAAG6J,YAGXC,qBAMNC,OAAQ,SAAS/H,UACZA,IACCA,EAAMzP,OAAMuB,KAAKmT,MAAQjF,EAAMzP,MAC/ByP,EAAMjO,UAASD,KAAKC,QAAUiO,EAAMjO,eAGpCiW,oBACAC,mBACAC,mBACAC,qBACAC,iBAEEtW,MAGRuW,OAAQ,6BACA,SAAAC,UAAaA,EAAUpN,QAAO,kBAAMqN,EAAK9B,WAAWnG,YAG5DkI,MAAO,gBACDC,kBACAC,6BACA9B,MAAMrG,UAAU,QAAQ3B,KAAK,IAAK,aAClCwI,SAASuB,UAAU,EAAG,EAAG7W,KAAKkR,SAAUlR,KAAKoR,WAE9CpR,KAAK8W,OAMVC,UAAW,SAAS9V,OACfmR,EAASpS,KAAKC,QACd+W,EAAShX,KAAKsV,SAEd7R,EAASzD,KAAK+T,OAAO9S,GACrBqK,EAAStL,KAAKoT,OAAOG,MAAMtS,GAC3BuN,EAAS/K,EAAK+K,OACdzC,EAAS/L,KAAK4T,QAAQtI,EAAKS,QAC3BC,EAAShM,KAAK4T,QAAQtI,EAAKU,WAE/BV,EAAOxN,EAAEM,OAAO,GAAIkN,EAAM,CACzBK,MAAe3L,KAAKkR,SACpBtF,OAAe5L,KAAKoR,UACpBrF,OAAeA,EACfC,OAAeA,KAGXA,IAAWA,SACRtG,QAAQC,KAAK,yBAA2B1E,MAGhDwC,EAAKwT,MAAMjX,KAAKmT,OAAOrG,KAAK,IAAK4H,EAAQpJ,KAErC7H,EAAKoJ,QAAQ,qBAEbuF,EAAK8E,aAAc,CACtBzT,EAAKoJ,QAAQ,eAAe,GAE5BmK,EAAIG,YACJH,EAAII,OAAO,EAAG,OACVC,EAAI,IAAIC,OAAO7T,EAAKqJ,KAAK,MAE7BkK,EAAIO,YAAc9T,EAAKqJ,KAAK,UAC5BkK,EAAIQ,UAAc/T,EAAKqJ,KAAK,QAC5BkK,EAAIS,UAAc,KAClBT,EAAIU,yBAA2B,cAG/BV,EAAIW,YAAclU,EAAKqJ,KAAK,mBAAqB,GACjDkK,EAAIxL,OAAO6L,GAGXL,EAAIW,YAAclU,EAAKqJ,KAAK,iBAAqB,IACjDkK,EAAIY,KAAKP,GAETL,EAAIW,YAAc,EAElBX,EAAIa,sBAEC/C,MAAM1L,QAAO,kBAAMoF,MAI1BsJ,iBAAkB,eACXxE,EAAQtT,KAAK+T,WACd,IAAIxR,KAAK+Q,MACRA,EAAM/Q,GAAGsK,QAAQ,yBACd,SAGF,GAMRkL,WAAY,SAASvU,cAWdwU,EAAU,SAACxU,MACXyU,EAAK9E,MAAMzW,SACF,SAAV8G,EAAEpB,MAAoBoB,EAAE0U,kBACxB5I,EAAU2I,EAAKxD,OAAOpD,MAAME,MAAM3H,OAAO,YAAY4E,OAErDJ,EADUlC,GAAGiM,SAAS3U,EAAG8L,GAAM,GACd,GACjBpL,EAAU+T,EAAK9E,MAAM8E,EAAKG,oBAAoBhK,IAElD6J,EAAKlW,KAAK,aAAc,CAAEmC,KAAMA,EAAMkK,OAAQA,WAG1CqH,OACH4C,QAAO,SAAC7U,UAAMyU,EAAKjE,gBAAkBxQ,EAAE8U,WAAa9U,EAAE+U,UACtDhV,GAAG,cAvBW,SAACC,MACXyU,EAAK9E,MAAMzW,YACZkU,EAAUpN,EAAEgV,aACZ5H,EAAQ,KACP6H,EAAQR,EAAKG,oBAAoBxH,EAAO,IACxC8H,EAAQT,EAAKG,oBAAoBxH,EAAO,IAC5CqH,EAAKlW,KAAK,UAAW,CAAE4W,UAAWV,EAAK9E,MAAMsF,GAAQG,QAASX,EAAK9E,MAAMuF,UAkBzEnV,GAAG,eAAgByU,QAEhBvD,OAAOpD,MAAME,MAChBhO,GAAG,oCAAqCvD,KAAK+B,KAAK8W,KAAK7Y,KAAM,gBAC7DuD,GAAG,gCAAqCvD,KAAK+B,KAAK8W,KAAK7Y,KAAM,cAC7DuD,GAAG,kCAAqCyU,IAO3Cc,aAAc,sBACThK,EAAY9O,KAAK2U,WACjBoE,EAAY/Y,KAAKC,QAAQ4O,QAEvBgH,EAAU7V,KAAK4V,MA+BrBC,EACEmD,YAAY,CAAC,EAAG,KAChBpI,OAAO,CACP,CAACmI,EAAOjU,KAAM,GACd,CAAC9E,KAAKkR,SAAW6H,EAAOhU,MAAO/E,KAAKoR,aAEpC6H,gBAAgB,CAChB,CAACF,EAAOjU,MAAOgL,EAAAA,GACf,CAAC9P,KAAKkR,SAAW6H,EAAOhU,MAAO+K,EAAAA,KAE/BuI,QAAO,SAAC7U,UAAM0V,EAAKhF,eAAiB1Q,EAAE8U,UAAyB,GAAb9U,EAAE2V,YACpD5V,GAAG,SAxCW,SAACC,GACZA,EAAE0U,aAAqC,aAAtB1U,EAAE0U,YAAY9V,MAAqB0M,EAAIxO,MAAM,SAAU,YACvD,GAAjBkD,EAAE4V,UAAU1P,GAA2B,GAAjBlG,EAAE4V,UAAUhN,GACrC8M,EAAKvE,WAAW9H,QAAQ,UAAU,GAEnCqM,EAAK/E,SAAU,KAoCd5Q,GAAG,OAjCU,SAACC,GACK,GAAhBA,EAAE4V,UAAU1P,GAA0B,GAAjBlG,EAAE4V,UAAUhN,GACpC8M,EAAKvE,WAAW9H,QAAQ,UAAU,GAEnCqM,EAAK/E,SAAU,EACfrF,EAAIxO,MAAM,SAAU,OA6BnBiD,GAAG,QA1BU,SAACC,GAEf0V,EAAK/E,SAAU,EACf+E,EAAKhD,eACLgD,EAAK/E,SAAU,EACf+E,EAAKtF,QAAQyF,SAAWH,EAAKI,GAAK9V,EAAE4V,UAAUG,SAASL,EAAKI,IAC5DJ,EAAKvC,aACDnT,EAAE0U,aAAqC,aAAtB1U,EAAE0U,YAAY9V,MAClC8W,EAAKtC,wBAENsC,EAAKnX,KAAK,WAkBX+M,EAAI1G,KAAKyN,IAMVG,kBAAmB,gBACb+B,kBACAyB,kBACAV,oBACAW,eAMNA,YAAa,2BACP9E,WAAWpR,GAAG,kBAAkB,SAACC,SACCA,EAAEyL,OAAlCxL,IAAAA,KAAMyL,IAAAA,OAAQjO,IAAAA,KAAMkO,IAAAA,WAErB1L,OAED3B,EAAQvD,EAAS,OAAQ2Q,GACzBI,EAAQ/Q,EAAS,OAAQ2Q,GAE7B3Q,EAAcuD,EAAO,uBAAwB,eAAgBqN,GAC7D5Q,EAAc+Q,EAAO,eAAwB,IAAgBH,GAC7D5Q,EAAckF,EAAO,iBAAwC0L,GAE7DuK,EAAKvD,cAELuD,EAAK3X,KAAK,iBAAkB,CAAE0B,KAAAA,EAAMxC,KAAAA,EAAMiO,OAAAA,EAAQC,QAAAA,SAOpDqK,WAAY,yBACNxZ,KAAKC,QAAQkR,WAGZwI,EAAYzN,GAAG0N,OAAO,OACtB7D,EAAY/V,KAAK8V,MA2BvBC,EACCxS,GAAG,aA1Bc,SAACC,EAAGtE,OACjB2a,EAAYC,EAAK1I,UACjB7C,EAAYuL,EAAKvE,OAAO9W,OAAO,GAAG8P,GAClCA,GAAKsL,GAAQtL,GAAK,IAAGuL,EAAKvE,OAAO3L,OAAO,0BAA0BoE,KAAK,IAC3E8L,EAAKlD,2BAuBLrT,GAAG,QApBc,SAACC,EAAGtE,OACjB2a,EAAYC,EAAK1I,UACjB/C,EAAYnC,GAAGiM,SAAS3U,EAAGsW,EAAKhF,MAAMtG,QAAQ,GAAG,GACjDD,EAAYF,EAAS,EAAKA,EAASwL,EAAOxL,EAASwL,EAAQ,EAC3DE,EAAYD,EAAKE,GAAGrH,OAAOpE,GAC3B9P,EAAYX,EAAEM,OAAO0b,EAAKvE,OAAO9W,OAAO,GAAI,CAAE8P,EAAGA,IAErDuL,EAAKvE,OACH9W,KAAK,CAACA,IACNqO,KAAK,aAAa,SAAA5N,SAAK,aAAeA,EAAEkN,EAAI,IAAMlN,EAAEqP,EAAI,OACxD1B,QAAQ,SAAU0B,EAAIsL,GAExBC,EAAKnF,WAAW/K,OAAO,0BACrBoE,KAAK2L,EAAUI,GAAK,IAAMD,EAAKxF,SAEjCwF,EAAK/X,KAAK,eAAgB,CAAEkY,OAAQ5L,EAASwL,GAAQxL,EAAS,EAAIyL,EAAKI,gBAAgB7L,GAAU,aAO7FkH,OAAOnN,KAAK2N,KAOlBb,WAAY,eACP9C,EAAOpS,KAAKC,aAEXka,mBAAmB,CACvBjN,KAAU,IACV3D,SAAU,SACVuD,KAAUsF,EAAKvG,MACf4E,IAAU2B,EAAKgI,SACfzK,IAAUyC,EAAKiI,SACfpZ,KAAU,kBAGNkZ,mBAAmB,CACvBjN,KAAW,IACX3D,SAAW,OACXuD,KAAWsF,EAAKtG,MAChB2E,IAAW2B,EAAKkI,SAChB3K,IAAWyC,EAAKmI,SAChBtZ,KAAW,kBAGPqY,GAAKtZ,KAAK4T,QAAQyF,cAClBW,GAAKha,KAAK4T,QAAQ4G,UAGxBC,kBAAmB,SAASvM,OACvBkE,EAAOpS,KAAKC,QAEXiO,EAAMrC,QAAOqC,EAAMrC,MAAQuG,EAAKvG,OAChCqC,EAAMpC,QAAOoC,EAAMpC,MAAQsG,EAAKtG,YACH,IAAvBoC,EAAMgJ,eAA8BhJ,EAAMgJ,aAAe9E,EAAK8E,kBAErEzT,EAAOiR,EAAQxG,QAGd6F,OAAO7F,EAAMjN,MAAcwC,OAC3B2P,OAAOG,MAAMrF,EAAMjN,MAAQiN,EAE5BkE,EAAKlD,cACHkE,OAAOM,YAAYxF,EAAMjN,MAAQ,CACrCA,KAASiN,EAAMjN,KACfa,MAASoM,EAAMpM,MACf2K,MAASyB,EAAMzB,MACfhJ,KAASA,KAMZiX,kBAAmB,SAASxM,QACtBkF,OAAOI,MAAMtF,EAAMjN,MAAQiN,EAAMhB,MAAQgB,GAG/CiM,mBAAoB,SAASjM,OACxBkE,EAAQpS,KAAKC,QACbkN,EAAQe,EAAMf,SAEG,mBAAVA,EAAsB,EAChCA,EAAcrP,EAAEM,OAAO,CACtBK,KAAauB,KAAKmT,MAClBzC,YAAa0B,EAAKuI,iBAChBxN,IAEGL,KAASK,EAAML,MAAQoB,EAAMjN,SAE/B0P,EAAW3Q,KAAK6T,SAAS3F,EAAMjN,MAAQyT,EAAUxG,GACjD6C,EAAW/Q,KAAK8T,QAAQ5F,EAAMjN,MAASyT,EAASxG,GACpDf,EAAM4D,MAAS5D,EAAM4D,OAAUA,EAAM/Q,KAAKkR,SAASlR,KAAKoR,WACxDjE,EAAMwD,OAASxD,EAAMwD,QAAUA,EAAO3Q,KAAKmT,YAEtCC,OAAOC,OAAOnF,EAAMjN,MAAQkM,EAEjCe,EAAMf,MAAQnN,KAAK4T,QAAQ1F,EAAMjN,MAAQyT,EAASvH,UAG9Ce,EAAMd,QACQ,KAAdc,EAAMhB,KAAkBgB,EAAMd,MAAQgF,EAAKwI,OACxB,KAAd1M,EAAMhB,OAAagB,EAAMd,MAAQgF,EAAKyI,cAG3CzH,OAAOK,KAAKvF,EAAMjN,MAAQiN,EAExBf,GAMRtL,oBAAqB,SAASG,MACxBhC,KAAKmT,MAAMzW,YAEZwH,EAAMkI,EAAGmC,KAETvM,EAAMpB,OACTsD,EAAOlE,KAAKmT,MAAMnT,KAAK8a,oBAAoB9Y,EAAMpB,SACjDwL,EAAOpM,KAAKsZ,GAAGpV,EAAK6W,MACpBxM,EAAOvO,KAAKga,GAAG9V,EAAK6V,QACd,GAAKiB,MAAMhZ,EAAM+Y,OAMxB,GAAIC,MAAM5O,IAAM4O,MAAMzM,GAAI,YALzBnC,EAAOpM,KAAKsZ,GAAGtX,EAAM+Y,MACrB7W,EAAOlE,KAAKmT,MAAMnT,KAAKoY,oBAAoBhM,IAC3CmC,EAAOvO,KAAKga,GAAG9V,EAAK6V,GAKhB/X,EAAMkC,MAASlC,EAAMkC,KAAK+W,SAAS,iBACvCjZ,EAAMuH,SAAWvH,EAAMuH,UAAY,SAEnCvH,EAAMkC,KAAOlE,KAAK+U,OAAO3L,OAAO,KAEhCpH,EAAMkC,KAAKkF,OAAO,YAChB0D,KAAK,KAAM,GACXA,KAAK,KAAM,GACXA,KAAK,QAAQ,uEAEf9K,EAAMkC,KACJkF,OAAO,cACP0D,KAAK,QAAS,8BACdA,KAAK,IAAK,GAER9K,EAAMF,OACTE,EAAMkC,KAAKkF,OAAO,YAChB0D,KAAK,KAAM,OACXA,KAAK,KAAM,SAIf9K,EAAMkC,KACJ+S,MAAM,CACNiE,IAAKlZ,EAAMuH,SACX6C,EAAGA,EACHmC,EAAGA,IAEHzB,KAAK,SAAS,SAAA5N,SAAK,SAAWA,EAAEgc,OAChCpO,KAAK,aAAa,SAAA5N,SAAK,aAAeA,EAAEkN,EAAI,IAAMlN,EAAEqP,EAAI,OAE1DvM,EAAMkC,KAAK0F,OAAO,QAChBqN,MAAM,CACNkE,GAAK,MAAS5M,SAAavO,KAAKoR,UAAY7C,GAAIvM,EAAMuH,UACtD6R,GAAK,OAAUhP,QAAYpM,KAAKkR,SAAW9E,GAAIpK,EAAMuH,WAAa,IAElEuD,KAAK,MAAM,SAAA5N,UAAKA,EAAEic,MAClBrO,KAAK,MAAM,SAAA5N,UAAKA,EAAEkc,MAEhBpZ,EAAMF,OACTE,EAAMkC,KAAK0F,OAAO,QAChBoE,KAAKhM,EAAMF,SAKfuZ,oBAAqB,SAASnN,QACxBkF,OAAOO,YAAYzF,EAAMjN,MAAQiN,GAGvCiI,YAAa,eACR7C,EAAQtT,KAAK+T,WAGZ,IAAIxR,UADJ+S,SAASuB,UAAU,EAAG,EAAG7W,KAAKkR,SAAUlR,KAAKoR,WACpCkC,EACRA,EAAM/Q,GAAGsK,QAAQ,wBAChBkK,UAAUxU,IAKlB6T,YAAa,eAERhE,EAAOpS,KAAKC,aAGX2U,MAAMnG,UAAU,KAAK0B,cACrB6E,MAAMvG,UAAU,KAAK0B,aAItBjC,EAAOhB,EAAMoE,EAFbkC,EAAQxT,KAAKoT,OAAOI,MACpBC,EAAQzT,KAAKoT,OAAOK,KAGpB6H,EAAW,CACd3P,MAAY3L,KAAKkR,SACjBtF,OAAY5L,KAAKoR,UACjB/D,WAAY,IAETkO,EAAY,CACf5P,MAAS3L,KAAKkR,SACdtF,OAAS5L,KAAKoR,eAIV,IAAI7O,KAAKiR,EACbtF,EAAQpQ,EAAEM,OAAO,GAAIkd,EAAU9H,EAAMjR,IACrC+O,EAAQoD,EAAQxG,QACX0G,MAAMxM,KAAKkJ,OAIZ,IAAI/O,KAAKkR,GACG,IAAZrB,EAAK7P,IAA4B,YAAZ6P,EAAK7P,KAC9B2L,EAAQpQ,EAAEM,OAAO,GAAImd,EAAU9H,EAAKlR,IACpC2K,EAAQwH,EAAQxG,QACX8G,MAAM5M,KAAK8E,SAIZ8H,MACHvG,UAAU,iBACVnE,MAAK,SAACpL,EAAGqD,EAAGiZ,OAERtO,EAAYhB,GAAGtC,OAAO4R,EAAEjZ,IACxB6W,EAAYlM,EAAKJ,KAAK,aACtB2O,EAAYrC,EAAUsC,UAAUtC,EAAU3T,QAAQ,KAAO,EAAG2T,EAAU3T,QAAQ,MAAMqC,MAAM,KAE9FoF,EAAKJ,KAAK,YAAa,eAAiB2O,EAAU,GAAU,GAAJlZ,GAAW,IAAMkZ,EAAU,GAAK,KAEpFlZ,EAAI,IACP2K,EAAKtD,OAAO,iBAA0BkD,KAAK,UAAW,KACtDI,EAAKuB,UAAU,uBAAuB3B,KAAK,UAAW,UAO1DwJ,eAAgB,eACXyC,EAAS/Y,KAAKC,QAAQ4O,aAErB+G,MACHoD,YAAY,CAAC,EAAG,KAChBpI,OAAO,CACP,CAACmI,EAAOjU,KAAM,GACd,CAAC9E,KAAKkR,SAAW6H,EAAOhU,MAAO/E,KAAKoR,aAEpC6H,gBAAgB,CAChB,CAACF,EAAOjU,MAAOgL,EAAAA,GACf,CAAC9P,KAAKkR,SAAW6H,EAAOhU,MAAO+K,EAAAA,MAKlCuG,cAAe,yBAEa,GAAvBrW,KAAKC,QAAQiP,YAGbA,EADAyM,EAAU3b,KAAKoT,OAAOM,gBAKrB,IAAInR,UADJ0S,QAAQxG,UAAU,KAAK0B,SACdwL,EACbzM,EAASwF,EACR5W,EAAEM,OAAO,CACRuN,MAAS3L,KAAKkR,SACdtF,OAAS5L,KAAKoR,UACdvC,QAAS7O,KAAKC,QAAQ4O,SACpB8M,EAAQpZ,UAEP0S,QAAQ7L,OAAO,KAAKhB,KAAK8G,OAI3B0M,EAAS5b,KAAKiV,QAAQxG,UAAU,gBAGhC+M,EAAOI,EAAMC,QAAQnf,OACrBof,EAAS3X,MAAMhF,KAAKC,MAAMoc,EAAI,IAAI5D,KAAK,MAAMmE,KAAI,SAAC7c,EAAGqD,UAAgB,GAATA,EAAI,IAAU,EAAIpD,KAAK6c,KAAKR,EAAI,OAC5FS,EAASH,EAAEI,QAAQC,UAAUJ,KAAI,SAAC7c,UAAQA,KAE1Csc,EAAI,GAAM,GACbS,EAAIG,KAAK,GAEVN,EAAIG,EAAII,OAAOP,OAGXQ,EAAUtc,KAAKgV,MAAMvG,UAAU,kBAAkBoN,QAAQnf,OACzD6f,EAAU,GAAe,EAATD,EAChBE,EAAc,GAAJhB,EAGVA,GAAKxb,KAAKC,QAAQ4O,QAAQ9J,MAAQyX,SAChCvc,QAAQ4O,QAAQ9J,MAASyX,OACzBza,KAAK,oBAIRua,GAAUtc,KAAKC,QAAQ4O,QAAQ3J,OAASqX,SACrCtc,QAAQ4O,QAAQ3J,OAASqX,OACzBxa,KAAK,oBAGX6Z,EACEtR,MAAK,SAACpL,EAAGqD,EAAGiZ,OAERtM,EAAUhD,GAAGtC,OAAO4R,EAAEjZ,IAEtBtB,GADUiO,EAAOtF,OAAO,QACdsF,EAAOpC,KAAK,cACtBrJ,EAAUgZ,EAAK1I,OAAO9S,GAEtByb,EAAiB,GAAPZ,EAAEvZ,GACZoa,EAAmB,EAATL,EAEdpN,EAGCpC,KAAK,YAAa,aAAe4P,EAAK,KAAOC,EAAK,KAG/C1b,KAAQwb,EAAKxc,SAAiC,YAAtBwc,EAAKxc,QAAQgB,KACxCwC,EAAKoJ,QAAQ,kBAAkB,GAC/BqC,EAAOtF,OAAO,QAAQtJ,MAAM,uBAAwB,gBACpD4O,EAAOtF,OAAO,QAAQtJ,MAAM,eAAgB,MAIzCmc,EAAKtH,WACR1R,EAAKqJ,KAAK,YAAa,QAAU2P,EAAKtH,UAAUrI,KAAK,MAAQ,UAMjEoJ,aAAc,cACTlW,KAAKmU,QAAS,MAAO,CAAE/H,EAAGpM,KAAKsZ,GAAI/K,EAAGvO,KAAKga,IAEpCha,KAAKC,YAEZoT,EAAUrT,KAAK4T,QACf1U,EAAIc,KAAK6T,SACT+I,EAAI5c,KAAK8T,YAER,IAAIvR,KAAK8Q,EACbA,EAAO9Q,GACNoO,OAAOzR,EAAEqD,GAAGvC,KAAKmT,QACjBpC,MAAM6L,EAAEra,GAAGvC,KAAKkR,SAAUlR,KAAKoR,kBAG1B,CAAEhF,EAAGpM,KAAKsZ,GAAI/K,EAAGvO,KAAKga,KAM9B9I,OAAQ,kBACAlR,KAAKyU,OAAOvD,QAMpBE,QAAS,kBACDpR,KAAKyU,OAAOrD,SAMpB8I,gBAAiB,SAAS3L,OAWrBsO,EAVApe,EAAOuB,KAAKmT,MACZ4G,EAAO/Z,KAAKga,GAAGrH,OAAOpE,GAGpBuO,EAAOre,EAAKse,QAAO,SAACC,EAAO9Y,EAAM+Y,UAClC/Y,EAAK6V,GAAKA,GAAGiD,EAAMZ,KAAKa,GACrBD,IACL,IAECvE,EAAQ,SAIGqE,EAAKC,QAAO,SAACC,EAAOze,EAAG2e,UAEjCJ,EADJD,EAAOK,EAAO,KACKJ,EAAKI,GAAQ,GAAKL,IAASC,EAAKpgB,SAClDsgB,EAAMZ,KACLU,EACCZ,MAAMzD,EAAOoE,GACbd,KAAI,SAAAxZ,UAAK9D,EAAK8D,GAAG3B,WAEnB6X,EAAQoE,GAEFG,IACL,KAQJ5E,oBAAqB,SAAShM,qBACtBF,GACLwG,UAAS,SAAAxT,UAAKA,EAAEie,EAAKld,QAAQ4L,UAC7B/G,KAAK9E,KAAKmT,OAAS,CAAC,EAAG,GAAInT,KAAKsZ,GAAG3G,OAAOvG,KAM7C0O,oBAAqB,SAASla,OACzBwc,EAAS,KACTle,EAAS4Q,EAAAA,cACRqD,MAAM7Q,SAAQ,SAAC4B,EAAM+Y,OACrBlC,EAAOna,EAAOyc,WAAWnZ,EAAKtD,QAC9Bma,EAAO7b,IACVA,EAAI6b,EACJqC,EAASH,MAGJG,GAMRzG,WAAY,WACP3W,KAAKyU,OAAOpD,MAAME,MAAM3H,OAAO,cAAckD,KAAK,gBAChD2H,OAAOpD,MAAME,MAAMnJ,KAAKpI,KAAKyV,OAAOiB,YACpCE,6BACA7U,KAAK,gBAIZub,WAAY,WACPtd,KAAK4V,YACHA,MAAMwD,UAAUpZ,KAAKyU,OAAO3F,IAAK5C,GAAGqR,eAO3CC,sBAAuB,SAAStZ,EAAMuZ,OACjCrL,EAAcpS,KAAKC,QACnByd,EAAc1d,KAAKga,GAAG9V,EAAKkO,EAAKtG,aAE/B0J,QAAQ1I,KAAK,UAAW,WAExB4I,WAAWtN,KACfsM,EAAkB,CACjBtG,OAAQqP,EACR7R,OAAQ5L,KAAKoR,kBAGVuE,YAAYvN,KAChBsM,EAAmB,CAClBtG,OAAQqP,EACRpP,OAAQqP,EACR9R,OAAQ5L,KAAKoR,UACbzF,MAAQ3L,KAAKkR,SACb5D,OAAQpB,GAAG0N,OAAO,IAAKxH,EAAKuL,UAAW,IAA/BzR,CAAoChI,EAAKkO,EAAKvG,QAAU,IAAM7L,KAAKqU,QAC3E9G,OAAQrB,GAAG0N,OAAO,IAAKxH,EAAKwL,UAAW,IAA/B1R,CAAoChI,EAAKkO,EAAKtG,QAAU,IAAM9L,KAAKsU,eAQzExS,EAFA+b,EAAS7d,KAAKoT,OAAOO,YACrBnC,EAAUxR,KAAK2V,YAAY/L,OAAO,YAGjC,IAAIrH,KAAKsb,GACb/b,EAAQ0P,EAAQ5H,OAAO,sBAAwBiU,EAAOtb,GAAGtB,OAE9CqP,SACVxO,EAAU0P,EAAQpI,OAAO,YAAa,wBACpC0D,KAAK,QAAS,qBAAuB+Q,EAAOtb,GAAGtB,MAC/C6L,KAAK,KAAM,UAGdhL,EAAMkM,KAAgC,mBAApB6P,EAAOtb,GAAGiG,MAAuBqV,EAAOtb,GAAGiG,MAAQqV,EAAOtb,GAAGiG,MAAMtE,SAEhFyR,YAAY/L,OAAO,wBACtBkD,KAAK,KAAM,UAKf8J,sBAAuB,gBACjBpB,QAAQ1I,KAAK,UAAW,WChzBpBgR,EAAShgB,EAAE8U,MAAMxU,OAAO,CAElC8U,WAAY,SAASjT,eACfA,QAAUA,EAEXD,KAAKC,QAAQmU,eACXC,QAAU,UACVC,QAAU,YAEVD,QAAUrU,KAAKC,QAAQsU,YACvBD,QAAUtU,KAAKC,QAAQuU,QAGF,kBAAvBxU,KAAKC,QAAQuB,aAEXkU,WAAexJ,GAAGlF,OAAO,iBACzB+W,aAAe7R,GAAGlF,OAAO,mBACzB2O,YAAezJ,GAAGlF,OAAO,aACG,mBAAvBhH,KAAKC,QAAQuB,cAElBwc,QAAelgB,EAAE0D,OAAO,CAAC,EAAG,GAAI,CAAEC,KAAMzB,KAAKC,QAAQge,WAAYC,aAAc,IAASC,aAAa,UAGtGC,aAAe,GAEbpe,MAGRqe,MAAO,SAAStC,sBACVuC,KAAOvC,EACe,kBAAvB/b,KAAKC,QAAQuB,OAA4B,KACxCiM,EAAIzN,KAAK2U,WAAazI,GAAGtC,OAAOmS,EAAIwC,QAAQ,kBAAkB3U,OAAO,WACvEkD,KAAK,QAAS,sBAChBW,EAAErE,QAAO,kBAAMqN,EAAKf,WAAWlH,UAC/Bf,EAAErE,QAAO,kBAAMqN,EAAKsH,aAAavP,UACjCf,EAAErE,QAAO,kBAAMqN,EAAKd,YAAYnH,cACC,mBAAvBxO,KAAKC,QAAQuB,aAClBwc,QAAQK,MAAMtC,EAAK,CAAElH,KAAM,uBAE1B7U,MAMRiW,OAAQ,SAAS/H,MACZA,EAAOlO,KAAKoT,OAASlF,EACpBA,EAAQlO,KAAKoT,OAEdlF,GAEAA,EAAMjO,UAASD,KAAKC,QAAUiO,EAAMjO,SACnCD,KAAKse,MAAMte,KAAKqe,MAAMnQ,EAAM6N,SAE7B3J,EAAOpS,KAAKC,QACZ8b,EAAM/b,KAAKse,UAEVE,QAAUtQ,EAAMhK,KAAKtD,WAEtBsa,EAAMa,EAAI0C,mBAAmBze,KAAKwe,SAElCzC,EAAI2C,UACPxD,EAAMa,EAAI4C,2BAA2BzD,QAGlClZ,EAAQlE,EAAEM,OAAO,GAAI8P,EAAMhK,KAAMgX,MAEV,kBAAvBlb,KAAKC,QAAQuB,OAA4B,KAExCod,EAAgB5e,KAAKoR,UAAYlD,EAAM2Q,aAAe7c,EAAM+X,EAC5D+E,EAAgB9c,EAAMuM,EAAIqQ,OAEzBjK,WAAW9H,QAAQ,kBAAkB,QAErCkR,aACH3V,KACAsM,EAAqB,CACpBjU,MAAQ2R,EAAK3R,MACb2N,OAAQpM,EAAMoK,EACdiC,OAAQrM,EAAMuM,UAGZmH,WACHtN,KACAsM,EAAmB,CAClBjU,MAAQ2R,EAAK3R,MACb2N,OAAQpM,EAAMoK,EACdiC,OAAQrM,EAAMuM,EACd7R,OAAQoiB,UAGNnJ,YACHvN,KACAsM,EAAoB,CACnBjU,MAAQ2R,EAAK3R,MACb2N,OAAQpM,EAAMoK,EACdiC,OAAQyQ,EACRhd,MAAQoK,GAAG0N,OAAO,IAAMxH,EAAKwL,UAAY,IAAjC1R,CAAsClK,EAAMoQ,EAAKtG,QAAU,IAAM9L,KAAKsU,eAM7ExS,EAFA+b,EAAS7d,KAAKoe,aACd5M,EAAUxR,KAAK2V,gBAGd,IAAIpT,KAAKsb,GACb/b,EAAQ0P,EAAQ5H,OAAO,iBAAmBiU,EAAOtb,GAAGtB,OAEzCqP,SACVxO,EAAU0P,EAAQpI,OAAO,aACvB0D,KAAK,QAAS,gBAAkB+Q,EAAOtb,GAAGtB,MAC1C6L,KAAK,KAAM,UAGdhL,EAAMkM,KAAgC,mBAApB6P,EAAOtb,GAAGiG,MAAuBqV,EAAOtb,GAAGiG,MAAQqV,EAAOtb,GAAGiG,MAAM0F,EAAMhK,YAEtFyR,YAAY/L,OAAO,mBACtBkD,KAAK,KAAM,cAGmB,mBAAvB9M,KAAKC,QAAQuB,SACvBjD,EAAcyB,KAAKge,QAAQe,aAAc,uBACpCf,QAAQgB,UAAUhf,KAAKwe,YAO9BrO,OAAQ,gBACFiD,OAAS,KACa,kBAAvBpT,KAAKC,QAAQuB,OACZxB,KAAK2U,YAAY3U,KAAK2U,WAAW9H,QAAQ,kBAAkB,GAC9B,mBAAvB7M,KAAKC,QAAQuB,QACvBjD,EAAWyB,KAAKge,QAAQe,aAAc,mBAIxCE,UAAW,kBACHjf,KAAKwe,SAMbpN,QAAS,eACJgB,EAAOpS,KAAKC,eACTmS,EAAKxG,OAASwG,EAAKvD,QAAQ7J,IAAMoN,EAAKvD,QAAQ3J,QAGtDmW,oBAAqB,SAASnN,QACxBkQ,aAAalQ,EAAMjN,MAAQiN,KCvJvBgR,GAAUphB,EAAE8U,MAAMxU,OAAO,CACnC8U,WAAY,SAASd,EAAMxS,QACrBK,QAAUmS,OACVxS,QAAUA,EAGfrB,EADcyB,KAAK2U,WAAapW,EAAS,MAAO,sBAAwB6T,EAAK+M,QAAU/M,EAAK+M,QAAU,WAAa,KAClG,YAAa/M,EAAKzG,MAAQyG,EAAKzG,MAAQ,KAAO,KAGhE4K,OAAQ,6BACA,SAAAC,UAAaA,EAAUpN,QAAO,kBAAMqN,EAAK9B,gBAGjDyK,MAAO,gBACDzK,WAAW0K,UAAY,IAG7BjW,OAAQ,SAAS1I,EAAWoB,EAAO0G,eAC7BmM,WAAW0K,kCAA6B3e,0CAAyCoB,+CAA0C0G,oBACzHxI,MAGRsf,iBAAkB,SAAS7gB,OACrB,IAAI8D,KAAK9D,OACR2K,OAAO7G,EAAGzE,EAAES,EAAEE,EAAK8D,GAAGT,OAAiC,mBAAlBrD,EAAK8D,GAAGiG,MAAuB/J,EAAK8D,GAAGiG,MAAQ/J,EAAK8D,GAAGiG,MAAMxI,KAAKJ,QAAQgE,gBC1B5G2b,GAAU,CACpBC,eAAe,EACfC,UAAW3hB,EAAE8R,QAAQ8P,OACrBC,gBAAgB,EAChBC,YAAY,EACZpF,UAAU,EACVqF,WAAW,EACXC,UAAU,EACVzG,UAAU,EACV0G,eAAgB,EAChBhgB,iBAAiB,EACjB4d,UAAW,EACXC,UAAW,EACX3J,UAAWnW,EAAE8R,QAAQ8P,OACrBM,aAAc,OACdC,aAAc,iBACdC,cAAc,EACdvF,iBAAiB,EACjB/O,OAAQ,IACRuU,aAAc,EACd/L,UAAU,EACVnI,cAAe,cACfmU,YAAY,EACZlR,QAAQ,EACRmR,SAAU,CACTC,OAAO,EACPpgB,MAAM,GAEP2O,QAAS,CACR7J,IAAK,GACLD,MAAO,GACPG,OAAQ,GACRJ,KAAM,IAEPtD,OAAQ,iBACRyc,WAAYngB,EAAEwD,QAAQ,CACrBZ,UAAW,4BACXa,KAAM,0CACNgf,SAAU,CAAC,GAAI,IACfC,WAAY,CAAC,GAAI,MAElBC,aAAa,EACblX,SAAU,WACV/I,SAAU,CACTE,UAAW,qBACX+L,MAAO,OACPiU,QAAS,IACTC,OAAQ,EACRC,QAAS,SAEVC,iBAAkB,CACjBngB,UAAW,8BACX+L,MAAO,OACP0R,aAAa,GAEdjH,cAAc,EACd4J,eAAe,EACf3P,OAAO,EACP4P,iBAAiB,EACjBtgB,MAAO,kBACPugB,YAAY,EACZ7B,QAAS,SACT8B,OAAO,EACPC,OAAO,EACPC,YAAQC,EACR3e,MAAM,EACN4e,WAAY,KACZC,YAAY,EACZC,eAAWH,EACXI,eAAgB,iBAChBC,YAAQL,EACRzV,MAAO,IACP9K,WAAW,EACXV,SAAU,IACLrC,EAAEwD,QAAQ,CACbZ,UAAW,4BACXa,KAAM,0CACNgf,SAAU,CAAC,GAAI,IACfC,WAAY,CAAC,EAAG,OAGlB3U,MAAO,OACP0I,OAAQ,KACRqG,YAAQwG,EACRtV,MAAO,IACPyO,cAAU6G,EACV9G,cAAU8G,EACV5M,OAAQ,IACRqG,YAAQuG,EACRM,SAAS,EACTvN,SAAUrW,EAAE8R,QAAQ+R,QCpFR7d,GAAYhG,EAAE+F,QAAQC,UAAYhG,EAAE+F,QAAQzF,OAAO,CAE/DyU,SAAU/U,EAAEgV,QAAUhV,EAAEgV,QAAQC,UAAYjV,EAAEkV,MAAMC,OAEpDhT,QAASsf,GACTqC,aAAc,QACdC,aAAc,QACdC,KAAe,4CACfC,YAAe,gEACfC,YAAe,2EACfC,cAAe,uEACfC,aAAe,wFAKf5e,QAAS,SAASpE,EAAGkB,mBACC,IAAVA,GAAyBlB,EAAEqE,KACrCnD,EAAQlB,GAET4E,GAAUC,cAAgBxF,EACzByB,KAAK8hB,KACS,gCAAP5V,iBAAAA,OAAoBlM,KAAKC,QAAQmgB,WACxCtc,GAAUC,eACTC,MAAK,WACNyS,EAAK0L,SAASjjB,GACduX,EAAK2L,UAAUhiB,GACfqW,EAAKxS,SAAS,gBAAiB,CAAExF,KAAMS,EAAGkB,MAAOA,EAAOwD,WAAY6S,EAAK7S,iBAO3Eya,MAAO,SAAStC,MACX/b,KAAKC,QAAQ6f,SAAU,KACtBuC,EAASriB,KAAKsiB,oBACbD,EAAOE,aAAahkB,EAASwd,EAAIyG,eAAgBH,EAAQ,YAC9D9jB,EAAS8jB,EAAQriB,KAAKyiB,MAAM1G,SAE5Bje,EAAE+F,QAAQkP,UAAUsL,MAAMjW,KAAKpI,KAAM+b,UAE/B/b,MAMR0W,MAAO,WACF1W,KAAKge,SAAShe,KAAKge,QAAQ7N,SAC3BnQ,KAAKyU,QAASzU,KAAK0iB,cACnB1iB,KAAK2iB,SAAS3iB,KAAK4iB,eACnB5iB,KAAK6iB,UAAU7iB,KAAK8iB,qBAEnB3P,MAAa,QACbvP,WAAa,QAEbK,SAAS,sBAET8e,gBAGNL,YAAa,WACR1iB,KAAKgjB,SAAWhjB,KAAKgjB,QAAQC,uBAC3BD,QAAQC,iBAAiB3gB,SAAQ,SAAAkB,UAAK0f,iBAAiBjZ,IAAI,mBAAoBzG,EAAEgH,GAAIhH,EAAEwT,QAEzFhX,KAAKyU,QAAUzU,KAAKyU,OAAOE,kBACzBF,OAAOE,WAAWlG,UAAU,kBAAkB0B,cAC9CsE,OAAOiC,UAIdkM,aAAc,WACT5iB,KAAK2iB,SAAW3iB,KAAK2iB,QAAQQ,iBAC3BR,QAAQQ,WAAU,SAAAvV,UAAKA,EAAEuC,iBACzBwS,QAAQS,gBAIfN,cAAe,WACV9iB,KAAK6iB,UAAY7iB,KAAK6iB,SAASM,iBAC7BN,SAASM,WAAU,SAAAvV,UAAKA,EAAEuC,iBAC1B0S,SAASO,gBAOhBC,aAAc,gBACR5O,OAAOT,eAAgB,OACvB2C,cAMN2M,YAAa,gBACP7O,OAAOT,eAAgB,GAM7BuP,eAAgB,gBACVC,kBAMNC,gBAAiB,gBACXC,mBAMNC,YAAa,gBACPlP,OAAOP,cAAe,OACtBO,OAAO6I,cAMbsG,WAAY,gBACNnP,OAAOP,cAAe,GAM5B2P,UAAW,SAASC,GACnBA,EAASA,GAAU9jB,KAAK+jB,YACpB/jB,KAAKse,MAAQwF,EAAOE,WAAWhkB,KAAKse,KAAKuF,UAAUC,IAGxDC,UAAW,SAAStlB,UACnBA,EAAOA,GAAQuB,KAAKmT,MACbrV,EAAEmmB,aAAaxlB,EAAKsd,KAAI,SAAC7c,UAAMA,EAAE0B,YAMzCsjB,WAAY,kBACJlkB,KAAKmkB,UAMbC,KAAM,WACL7lB,EAAQyB,KAAK2U,WAAY,UAAW,SAMrCzB,WAAY,SAASjT,QACfkT,MAAkB,QAClBwP,QAAkB7kB,EAAEumB,oBACpBxB,SAAkB/kB,EAAEumB,oBACpBC,gBAAkBxmB,EAAE0C,SAAS,SAC7B+jB,eAAkB,EAEvBvkB,KAAK4D,WAAkB,QAElB3D,QAAkB1B,EAAY,GAAIyB,KAAKC,QAASA,QAEhDkkB,SAAkBnkB,KAAKC,QAAQyhB,QAEhC1hB,KAAKC,QAAQigB,eAAclgB,KAAKwkB,YAAc1mB,EAAEK,KAAKsmB,SAASzkB,KAAKwkB,YAAa,IAAKxkB,OACrFA,KAAKC,QAAQwgB,cAAczgB,KAAKC,QAAQogB,SAASngB,KAAOF,KAAKC,QAAQogB,SAASC,OAAQ,GAEtFtgB,KAAKC,QAAQiP,SAAclP,KAAKC,QAAQ4O,QAAQ3J,QAAU,IAE1DlF,KAAKC,QAAQQ,QAAcT,KAAKC,QAAQ4gB,iBAAiBngB,WAAa,IAAMV,KAAKC,QAAQQ,YAExF6jB,gBAAgBI,SAAS1kB,KAAKC,QAAQ4gB,kBAW3C/iB,EAAEM,OAAOsW,EAAW1U,KAAKC,QAAQ0kB,QAAU,KAM5CC,KAAM,SAASnmB,EAAM2T,QACfiO,SAAS5hB,EAAM2T,IAMrByS,UAAW,SAAS9I,QACdsC,MAAMtC,IAMZsE,SAAU,SAAS5hB,EAAM2T,IACxBA,EAAOtU,EAAEM,OAAO,GAAI4B,KAAKC,QAAQogB,SAAUjO,IAClCkO,WACHwE,UAAUrmB,EAAM2T,GACXA,EAAKlS,UACV6kB,SAAStmB,EAAM2T,GACV7T,EAAWE,QAChBumB,QAAQvmB,GACHF,EAAYE,QACjBwmB,YAAYxmB,QAEZymB,SAASzmB,IAOhBqmB,UAAW,SAASrmB,EAAM2T,IACzBA,EAAatU,EAAEM,OAAO,GAAI4B,KAAKC,QAAQogB,SAAUjO,IAC5CkO,OAAQ,EACb/hB,EAAYT,EAAE+a,KAAK7Y,KAAKqgB,SAAUrgB,KAAMvB,EAAM2T,KAM/C8S,SAAU,SAASjf,cAClBkf,MAAMlf,GACJjC,MAAK,SAACohB,UAAaA,EAASpX,UAC5BhK,MAAK,SAACvF,GACNwZ,EAAKoN,aAAepf,EACpBgS,EAAKoI,SAAS5hB,EAAM,CAAEyB,MAAM,EAAOogB,OAAO,OAE1CgF,OAAM,SAAC3mB,UAAQ+G,QAAQC,KAAKhH,OAM/BsmB,YAAa,SAASxmB,GACrBF,EAAgBE,EAAMuB,OAMvBulB,QAAS,SAAS9mB,QACZumB,QAAQvmB,IAMdumB,QAAS,SAASvmB,cACjBqF,GAAU0hB,qBAAuBjnB,EAChCyB,KAAK+hB,YACgB,mBAAd0D,YAA6BzlB,KAAKC,QAAQmgB,WACjDtc,GAAU0hB,sBACTxhB,MACD,eACK0hB,GAAW,IAAIC,WAAaC,gBAAgBnnB,EAAM,YAClD2D,EAAUsjB,EAAI7f,gBAAgBmD,QAAQ5H,cACpCgB,KAAQqjB,YACbrjB,EAAsC,0BAA/BsjB,EAAI7f,gBAAgBmD,QAAsC,MAAQ,WAEtE6c,EAAUJ,UAAUrjB,GAAMsjB,GAC1BzkB,EAAUykB,EAAII,qBAAqB,eACpC7kB,EAAK,GAAM4kB,EAAQ5kB,KAAOA,EAAK,GAAGoe,UAC7BnG,EAAKmM,eAAgBQ,EAAQ5kB,KAAOiY,EAAKmM,aAAavd,MAAM,KAAKie,MAAMje,MAAM,KAAK,GAAGA,MAAM,KAAK,IAEjGoR,EAAK+L,YAAYY,EAAS3M,OAQpC6L,SAAU,SAAStmB,EAAM2T,cAEpB9N,GADJ8N,EAAWtU,EAAEM,OAAO,GAAI4B,KAAKC,QAAQogB,SAAUjO,IAC/BlS,KAAK8lB,WAAa5T,EAAKlS,KAAOF,KAAKygB,YACnDliB,EAAa+F,GACXN,MAAK,WACLoO,EAAKlS,MAAO,EACZwZ,EAAK2G,SAAS5hB,EAAM2T,GACpBsH,EAAKnc,KAAK,kBAAkB,kBAAMmc,EAAK+G,YAAYuF,WAAW1e,YAAYhD,UAQ7Eme,MAAO,SAAS1G,mBACVuC,KAAOvC,MAERvF,EAAYxW,KAAK2U,WAAapW,EAAS,MAAO,+BAAiCyB,KAAKC,QAAQQ,cAE3FT,KAAKC,QAAQ6f,UACjBvhB,EAAWiY,EAAW,mBAGnBxW,KAAKC,QAAQwgB,cAAgBzgB,KAAKmT,MAAMzW,cACtC+jB,YAAcliB,EAAS,MAAO,wBAA6D,iBAA7ByB,KAAKC,QAAQwgB,YAA2B,CAAEha,IAAKzG,KAAKC,QAAQwgB,YAAa3d,IAAK,IAAO9C,KAAKC,QAAQwgB,aACrKliB,EAASiY,EAAWxW,KAAKygB,YAAa,eAGvC3c,GAAUC,cAAgBxF,EACzByB,KAAK8hB,KACS,gCAAP5V,iBAAAA,OAAoBlM,KAAKC,QAAQmgB,WACxCtc,GAAUC,eACTC,MAAK,WACN8V,EAAKmM,YAAYzP,GACjBsD,EAAKoM,WAAW1P,GAChBsD,EAAKqM,aAAa3P,GAClBsD,EAAKsM,YAAYrK,GACjBjC,EAAKuM,WAAWtK,GAEhBA,EACExY,GAAG,0BAAiCuW,EAAKwM,YAAgBxM,GACzDvW,GAAG,SAAiCuW,EAAKyM,WAAgBzM,GACzDvW,GAAG,SAAiCuW,EAAK0M,aAAgB1M,GACzDvW,GAAG,SAAiCuW,EAAK2M,cAAgB3M,GACzDvW,GAAG,YAAiCuW,EAAKnD,WAAgBmD,GAE3Dvb,EAAKwd,EAAIyG,eAAgB,aAAc1I,EAAKnD,WAAgBmD,GAC5Dvb,EAAKwd,EAAIyG,eAAgB,aAAc1I,EAAKnD,WAAgBmD,GAE5DA,EACEvW,GAAG,+BAAiCuW,EAAKiJ,aAAgBjJ,GACzDvW,GAAG,+BAAiCuW,EAAK4M,eAAgB5M,GAE3DA,EAAKiJ,eACLjJ,EAAK4M,oBAGClQ,GAORmQ,SAAU,SAAS5K,QACbpH,WAAa,KAElBoH,EACE9R,IAAI,0BAAiCjK,KAAKsmB,YAAgBtmB,MAC1DiK,IAAI,SAAiCjK,KAAKumB,WAAgBvmB,MAC1DiK,IAAI,SAAiCjK,KAAKwmB,aAAgBxmB,MAC1DiK,IAAI,YAAiCjK,KAAK2W,WAAgB3W,MAE5DzB,EAAMwd,EAAIyG,eAAgB,aAAcxiB,KAAK2W,WAAgB3W,MAC7DzB,EAAMwd,EAAIyG,eAAgB,aAAcxiB,KAAK2W,WAAgB3W,WAG3DiK,IAAI,+BAAiCjK,KAAK+iB,aAAgB/iB,MAC1DiK,IAAI,+BAAiCjK,KAAK0mB,eAAgB1mB,OAM7D4mB,OAAQ,gBACFJ,gBAMNK,WAAY,SAAShR,QACfsO,SAAWtO,GAMjBiR,KAAM,WACLvoB,EAAQyB,KAAK2U,WAAY,UAAW,UAMrCwN,SAAU,SAASjjB,iBACbA,OAID6nB,EAAO7nB,EAAEiD,YACT4kB,SACKA,EAAK3kB,UACP,kBACC4kB,gBAAgBD,EAAKE,uBAGtB,kBACJ1oB,EAAOwoB,EAAKE,aAAa,SAAAhN,UAAUwC,EAAKuK,gBAAgB/M,oBAIxDvU,QAAQC,KAAK,6CAA+CohB,EAAK3kB,MAIrD,sBAAXlD,EAAEkD,MACL7D,EAAOW,EAAEgoB,UAAU,SAAA3mB,UAAWkc,EAAK0F,SAAS5hB,MAGzCrB,EAAEmD,eACA8kB,YAAYjoB,EAAEmD,YAOrB2kB,gBAAiB,SAAS/M,cACzB1b,EAAO0b,GAAQ,SAAAjY,GACdmb,EAAKiK,UAAUplB,EAAM,GAAIA,EAAM,GAAIA,EAAM,IACzCmb,EAAKlZ,SAAS,iBAAkB,CAAEjC,MAAOA,EAAOib,MAAOE,EAAKhK,MAAMzW,OAAS,YAEvEuH,SAAS,iBAAkB,CAAEgW,OAAQA,EAAQgD,MAAOjd,KAAKmT,MAAMzW,OAAS,KAM9EyqB,YAAa,SAASlN,cACrB1b,EAAO0b,GAAQ,SAAAjY,GACdqlB,EAAKD,UAAUplB,EAAMslB,IAAKtlB,EAAMulB,SAA0B,IAAdvlB,EAAMc,IAAsBd,EAAMc,IAAMd,EAAMQ,KAAKE,KAC/F2kB,EAAKpjB,SAAS,iBAAkB,CAAEjC,MAAOA,EAAOib,MAAOoK,EAAKlU,MAAMzW,OAAS,YAEvEuH,SAAS,iBAAkB,CAAEgW,OAAQA,EAAQgD,MAAOjd,KAAKmT,MAAMzW,OAAS,KAM9E0qB,UAAW,SAAShb,EAAGmC,EAAGwL,MACrB/Z,KAAKC,QAAQ6gB,cAAe,OACtB,CAACvS,EAAGnC,GAAZA,OAAGmC,YAGA4E,MAAMiJ,KAAK,CACfhQ,EAAGA,EACHmC,EAAGA,EACHwL,EAAGA,EACHnZ,OAAQ9C,EAAE0pB,OAAOpb,EAAGmC,EAAGwL,UAGnB9V,SAAS,kBAAmB,CAAEgZ,MAAOjd,KAAKmT,MAAMzW,OAAS,KAG/D0lB,UAAW,SAAShiB,GACfA,GAAOJ,KAAK2iB,QAAQ8E,SAASrnB,IAGlCwB,WAAY,SAASJ,GAChBA,GAAQxB,KAAK6iB,SAAS4E,SAASjmB,IAMpC8gB,kBAAmB,eACdD,EAAS9jB,EAASyB,KAAKC,QAAQggB,qBAC9BoC,SACCpiB,QAAQggB,aAAe,kBAAoB1hB,IAChD8jB,EAA4B9jB,EAAS,MAAO,0CAA2C,CAAEmpB,GAAI1nB,KAAKC,QAAQggB,aAAa5V,OAAO,MAE3HrK,KAAKC,QAAQ6f,UAChBvhB,EAAe8jB,EAAQ,kBAAmB,2BAEtCA,OAASA,EACPriB,KAAKqiB,QAMbsF,UAAW,WACVppB,EAAeyB,KAAK2U,WAAY,qBAAsB,wBAMvDiT,QAAS,WACRrpB,EAAeyB,KAAK2U,WAAY,sBAAuB,uBAMxDkT,mBAAoB,SAASjnB,UACrBZ,KAAKmT,MAAMnT,KAAKyU,OAAOqG,oBAAoBla,KAMnDknB,cAAe,SAAS1b,UAChBpM,KAAKmT,MAAMnT,KAAKyU,OAAO2D,oBAAoBhM,KAMnDnI,SAAU,SAAS7B,EAAM3D,EAAMspB,GAC1B/nB,KAAK+B,MAAM/B,KAAK+B,KAAKK,EAAM3D,EAAMspB,GACjC/nB,KAAKse,MAAMte,KAAKse,KAAKvc,KAAKK,EAAM3D,EAAMspB,IAM3C3W,QAAS,cACJpR,KAAKyU,OAAQ,OAAOzU,KAAKyU,OAAOrD,cAChCgB,EAAOpS,KAAKC,eACTmS,EAAKxG,OAASwG,EAAKvD,QAAQ7J,IAAMoN,EAAKvD,QAAQ3J,QAMtDohB,YAAa,WACRtmB,KAAKC,QAAQ0f,qBACX3B,QAAQ7N,UAOf+V,WAAY,SAAS1P,OAChBpE,EAAUpS,KAAKC,WAEnBmS,EAAKwI,OAAS5a,KAAKgoB,UACnB5V,EAAKyI,OAAS7a,KAAKioB,UAEf7V,EAAK4O,cACJ5O,EAAK0N,SAAU,OAC6B9f,KAAKqiB,OAA9CnX,IAAAA,YAAaC,IAAAA,aACfD,EAAc,IAAekH,EAAKzG,MAAST,GAC3CC,EAAe,KAAciH,EAAKxG,OAAST,EAAe,QACxD,KACA+c,EAAyCloB,KAAKse,KAAKkE,eAAnD0F,YACN9V,EAAK+V,UAA0C/V,EAAK+V,UAAY/V,EAAKzG,MAAQyG,EAAK+V,UAAY/V,EAAKzG,WAC9FgJ,WAAWrU,MAAM8nB,SAAyBhW,EAAK+V,UAAY,KAC5D/V,EAAK+V,UAAYD,IAAa9V,EAAKzG,MAAQuc,EAAc,QAI3D/V,EAAQnS,KAAKyU,OAAS,IAAIxD,EAAMmB,EAAMpS,WAErCsZ,GAAStZ,KAAKyU,OAAO6E,QACrBU,GAASha,KAAKyU,OAAOuF,GAE1B9N,GACEtC,OAAO4M,GACPpO,KAAK+J,EAAMoE,UAEbpE,EACE5O,GAAG,aAAkBvD,KAAKsmB,YAAiCtmB,MAC3DuD,GAAG,cAAkBvD,KAAKiE,SAAS4U,KAAK,kBAAmB7Y,MAC3DuD,GAAG,UAAkBvD,KAAKqoB,gBAAiCroB,MAC3DuD,GAAG,aAAkBvD,KAAKsoB,kBAAiCtoB,MAC3DuD,GAAG,YAAkBvD,KAAKuoB,iBAAiCvoB,MAC3DuD,GAAG,eAAkBvD,KAAKwoB,oBAAiCxoB,MAC3DuD,GAAG,OAAkBvD,KAAK+iB,aAAiC/iB,MAC3DuD,GAAG,iBAAkBvD,KAAKyoB,oBAAiCzoB,MAC3DuD,GAAG,kBAAkBvD,KAAKwmB,aAAiCxmB,WAGxDiE,SAAS,iBACVjE,KAAKC,QAAQiP,QAAQlP,KAAKiE,SAAS,wBAElCA,SAAS,kBAGfoiB,WAAY,2BACN1D,QACHpf,GAAG,wBAAwB,SAACC,OACxBpD,EAAQoD,EAAEpD,MAEd7B,EADY6B,EAAM2e,YAAc3e,EAAM2e,aACjB2J,EAAKzoB,QAAQO,SAASE,UAAY,IAAMgoB,EAAKzoB,QAAQQ,MAAiB,YAAV+C,EAAEpB,MACnF7D,EAAc6B,EAAO,YAAasoB,EAAKC,uBAAuB9P,KAAK6P,GAAwB,YAAVllB,EAAEpB,MACnF7D,EAAc6B,EAAO,WAAasoB,EAAKH,iBAAiB1P,KAAK6P,GAA8B,YAAVllB,EAAEpB,UAItFgkB,YAAa,SAASrK,OACjBlH,EAAyBkH,EAAIwC,QAAQ,iBACpC1J,KACJA,EAAO7U,KAAK4oB,MAAe7M,EAAI8M,WAAW,gBAAiB9M,EAAIwC,QAAQ,iBAAmBxC,EAAIwC,QAAQ,aACjGje,MAAMwoB,OAAgB,IAC3BjU,EAAKvU,MAAM6E,cAAgB,QAGxBnF,KAAK+oB,WAAW/oB,KAAK+oB,UAAU5Y,cAC9B4Y,UAAwBjrB,EAAEgR,IAAI,CAAE+F,KAAM,kBAAmBwJ,MAAMre,KAAKse,WACpEN,QAAwB,IAAIF,EAAO9d,KAAKC,cAExCgE,SAAS,oBAMfgiB,YAAa,SAASzP,MAErBA,EAAU7M,aAAa,iBAAiB,GAEnC3J,KAAKC,QAAQ6f,UACjBhiB,EAAEkM,SACAgf,wBAAwBxS,GAIvB1Y,EAAE8R,QAAQ8P,QACbnhB,EAAKiY,EAAW,QAAS1Y,EAAEkM,SAASif,iBAGrC1qB,EAAKiY,EAAW,aAAcxW,KAAKkpB,mBAAoBlpB,OAElDA,KAAKC,QAAQ6f,SAAU,KACvBqJ,EAAOnpB,KAAKopB,QAAU7qB,EAAS,IAAK,0CAA4CyB,KAAKC,QAAQwf,SAAW,GAAK,iBAAkB,CAAExY,KAAM,IAAKoiB,MAAOvrB,EAAES,EAAE,cAAgBiY,GAEvKxW,KAAKC,QAAQ4f,iBACX8H,YACD3nB,KAAKC,QAAQwf,UAChBlhB,EAAKiY,EAAW,YAAaxW,KAAK4nB,QAAW5nB,MAC7CzB,EAAKiY,EAAW,WAAaxW,KAAK2nB,UAAW3nB,QAE7CzB,EAAK4qB,EAAM,QAASrrB,EAAEkM,SAASsf,MAC/B/qB,EAAK4qB,EAAM,QAASnpB,KAAKupB,QAASvpB,OAGnCzB,EAAK4qB,EAAM,QAASnpB,KAAKupB,QAASvpB,WAE7Bse,KAAK/a,GAAG,QAASvD,KAAK2nB,UAAW3nB,SAQzCmmB,aAAc,SAAS3P,OAClB2I,EAAUnf,KAAKwpB,SAAW,IAAItK,GAAQ,CAAEC,QAASnf,KAAKC,QAAQkf,SAAWnf,MAE7EkM,GACEtC,OAAO4M,GACPpO,KAAK+W,EAAQ5I,eAEVkT,WAAazpB,KAAKwpB,SAAS7U,YAGjC0T,gBAAiB,SAAS7kB,QACpB8iB,mBACAzC,UAAU/lB,EAAEmmB,aAAa,CAACzgB,EAAEmV,UAAU/X,OAAQ4C,EAAEoV,QAAQhY,eAExDqD,SAAS,qBAMfqkB,kBAAmB,SAAS9kB,MACtBxD,KAAKmT,MAAMzW,QAAWsD,KAAKukB,mBAG5BrgB,EAAOlE,KAAK8nB,cAActkB,EAAE4K,WAE5BlK,EAAM,KACLkK,EAAS5K,EAAE4K,OAEXpO,KAAKukB,eAAevkB,KAAKyU,OAAO+I,sBAAsBtZ,EAAMkK,QAE3Dsb,cAAcxlB,QACdsgB,YAAYtgB,GAEblE,KAAKse,MACR/f,EAAWyB,KAAKse,KAAKkE,eAAgB,uBAGjCve,SAAS,kBAAmB,CAAExF,KAAMyF,EAAMkK,OAAQA,SAClDnK,SAAS,iBAAmB,CAAExF,KAAMyF,EAAMkK,OAAQA,OAOzDua,uBAAwB,SAASnlB,MAC3BxD,KAAKmT,MAAMzW,YAIZwH,EAAOlE,KAAK6nB,mBAAmBrkB,EAAE5C,WACjCsD,EAAM,KACLkK,EAASlK,EAAKmI,WAEdrM,KAAKukB,eAAevkB,KAAKyU,OAAO+I,sBAAsBtZ,EAAMkK,QAE3Dsb,cAAcxlB,QAEdD,SAAS,kBAAmB,CAAExF,KAAMyF,EAAMkK,OAAQA,OAOzDma,iBAAkB,WACZvoB,KAAKC,QAAQ6f,gBACZwG,mBACA7R,OAAOmC,yBAGT5W,KAAKse,MACR/f,EAAcyB,KAAKse,KAAKkE,eAAgB,uBAGpCve,SAAS,mBAMfilB,mBAAoB,SAAS1lB,OACxBxD,KAAKse,KAAKqL,kBAAmB3pB,KAAKse,KAAKqL,gBAAgBC,cACvDC,EAAK7pB,KAAKge,QAAQiB,aAAejf,KAAKse,KAAKwL,YAC3C/P,EAAK/Z,KAAKse,KAAKyL,UAAY5qB,KAAK6c,KAAKxY,EAAEwmB,aACtCrT,kBACA2H,KAAK2L,MAAMJ,EAAI9P,KAMrBlY,oBAAqB,SAASqM,mBACxB3K,GAAG,oBAAoB,kBAAM2mB,EAAKzV,OAAO5S,oBAAoBqM,OAMnEuM,kBAAmB,SAASvM,mBACtB3K,GAAG,iBAAiB,kBAAM4mB,EAAK1V,OAAOgG,kBAAkBvM,OAM9DwM,kBAAmB,SAASxM,mBACtB3K,GAAG,iBAAiB,kBAAM6mB,EAAK3V,OAAOiG,kBAAkBxM,OAM9DiM,mBAAoB,SAASjM,mBACvB3K,GAAG,iBAAiB,kBAAM8mB,EAAK5V,OAAO0F,mBAAmBjM,OAM/DmN,oBAAqB,SAASnN,iBACzBA,EAAMiE,MAAO,KACZrQ,EAAQhE,EAAEM,OAAO,GAAI8P,EAAO,CAAE1F,MAAO0F,EAAMiE,aAC1C5O,GAAG,iBAAmB,kBAAM+mB,EAAK7V,OAAO4G,oBAAoBvZ,SAE9DoM,EAAM1M,OAAQ,KACbM,EAAQhE,EAAEM,OAAO,GAAI8P,EAAO,CAAE1F,MAAO0F,EAAM1M,cAC1C+B,GAAG,mBAAmB,kBAAM+mB,EAAKtM,QAAQ3C,oBAAoBvZ,QAOpEwd,iBAAkB,SAASpR,mBACrB3K,GAAG,oBAAqB,kBAAMgnB,EAAKf,SAASlK,iBAAiBpR,OAMnEyI,WAAY,gBACNlC,OAAOkC,kBACP2P,eAMNC,WAAY,WACPvmB,KAAKse,MAAQte,KAAKse,KAAKkM,qBACtB7T,kBACA2P,cACDtmB,KAAKC,QAAQuf,oBACXqE,cAOP2C,aAAc,cAE8B,QAAvCjoB,EAAQyB,KAAK2U,WAAY,gBAEzBvC,EAAOpS,KAAKC,WAEZmS,EAAK4O,WAAY,KAChByJ,KACArY,EAAK0N,SACR2K,GAAYzqB,KAAKqiB,QAAUriB,KAAK2U,YAAYzJ,gBACtC,KACAgd,EAAgBloB,KAAKse,KAAKkE,eAA1B0F,YACNuC,EAAWrY,EAAK+V,UAAYD,EAAcA,EAAc,GAAK9V,EAAK+V,aAE/DsC,EAAU,KACTtY,EAASnS,KAAKyU,OAClBrC,EAAKzG,MAAQ8e,EACTtY,GAASA,EAAMsC,SAClBtC,EAAMsC,OAAOhC,QAAQL,GACrBA,EAAKwI,OAAS5a,KAAKgoB,UACnB5V,EAAKyI,OAAS7a,KAAKioB,eACdlF,sBAKH2H,uBAMNlC,oBAAqB,SAAShlB,QACxBknB,mBAAmBlnB,EAAEyW,SAM3BsP,QAAS,WACJhrB,EAAWyB,KAAK2U,WAAY,sBAC/B3U,KAAK2nB,YAEL3nB,KAAK4nB,WAMPpD,YAAa,SAAStgB,MAChBlE,KAAKC,QAAQigB,cAAiBlgB,KAAKse,UACpCzI,EAAO7V,KAAKse,KAAKyL,UACjB,iBAAoB/pB,KAAKmkB,UACxBtO,EAAO7V,KAAKmkB,WAAUtO,EAAO7V,KAAKmkB,eACjC7F,KAAKqM,QAAQzmB,EAAKtD,OAAQiV,EAAM,CAAE+U,SAAS,EAAMC,SAAU,OACrD7qB,KAAKse,KAAKyF,YAAY+G,SAAS5mB,EAAKtD,cAC1C0d,KAAKqM,QAAQzmB,EAAKtD,OAAQiV,EAAM,CAAE+U,SAAS,EAAMC,SAAU,QAOlEpC,oBAAqB,SAASjlB,cACjBvC,GAAkBuC,EAAxBC,KAAwBD,EAAlBvC,MAAMkO,EAAY3L,EAAZ2L,aAEboV,cAAgBvkB,KAAKyU,OAAOqD,wBAG5B6K,QAAQQ,WAAU,SAAA/iB,GAEtB7B,EADW6B,EAAM2e,YAAc3e,EAAM2e,aACjBgM,EAAK9qB,QAAQO,SAASE,UAAY,IAAMqqB,EAAK9qB,QAAQQ,MAAOsqB,EAAKxG,uBAKjFtkB,QAAQgB,GAASkO,GAAiC,YAAtBnP,KAAKC,QAAQgB,GAAkC,WAAZ,UAG/DjB,KAAKukB,qBACJ9P,OAAOmC,6BACPoH,QAAQ7N,WAOf4S,aAAc,WACkB/iB,KAAK2U,kBAE/B1Q,SAAS,sBACTA,SAAS,sBAETwQ,OAAOwB,OAAO,CAAExX,KAAMuB,KAAKmT,MAAOlT,QAASD,KAAKC,eAEhDqZ,GAAStZ,KAAKyU,OAAO6E,QACrBU,GAASha,KAAKyU,OAAOuF,QAErB/V,SAAS,sBAMfylB,cAAe,SAASxlB,GAClBlE,KAAKge,cACLA,QAAQ/H,OAAO,CACnB8F,IAAc/b,KAAKse,KACnBpa,KAAcA,EACd2a,aAAc7e,KAAK4D,WAAWonB,eAAiB,EAC/C/qB,QAAcD,KAAKC,WAOrBwmB,cAAe,WACTzmB,KAAKge,cACLA,QAAQ/H,UAMdyU,mBAAoB,SAASzQ,QACvBqK,gBAAgB2G,WAAWhR,GAAU,IACtCA,GAAUja,KAAKse,OAASte,KAAKse,KAAK4M,SAASlrB,KAAKskB,uBAC9CA,gBAAgBjG,MAAMre,KAAKse,OAOlCoI,eAAgB,2BACV8C,SAASpK,QAEVpf,KAAKC,QAAQkf,cACXlb,SAAS,oBAEXjE,KAAKC,QAAQ+f,cAAgBhgB,KAAKqlB,oBAChCoE,WAAWpK,WAAa,sCAAwCvhB,EAAES,EAAE,YAAc,cACvFA,EAAS,cAAeyB,KAAKypB,YAAY0B,QAAU,SAAC3nB,GACnDA,EAAE4nB,iBACFC,EAAKpnB,SAAS,oBAAqB,CAAE+b,aAAcqL,EAAKprB,QAAQ+f,aAAcsL,QAAS/sB,EAAWsa,KAAKwS,EAAMA,EAAKhG,mBASrHnU,OAAQ,cACHlR,KAAKyU,OAAQ,OAAOzU,KAAKyU,OAAOvD,aAChCkB,EAAOpS,KAAKC,eACTmS,EAAKzG,MAAQyG,EAAKvD,QAAQ/J,KAAOsN,EAAKvD,QAAQ9J,OAMtDijB,QAAS,kBACJhoB,KAAKurB,WAAUvrB,KAAKurB,SAAWvrB,KAAKC,QAAQ2a,QACzC5a,KAAKurB,UAAYpsB,KAAKK,MAAMQ,KAAKkR,SAAW,KAMpD+W,QAAS,kBACJjoB,KAAKwrB,WAAUxrB,KAAKwrB,SAAWxrB,KAAKC,QAAQ4a,QACzC7a,KAAKwrB,UAAYrsB,KAAKK,MAAMQ,KAAKoR,UAAY,OAQtDtN,GAAU2nB,aAAY,gBAEhBloB,GAAG,kBAAkB,SAASC,OAC9B6T,EAAI7T,EAAExB,MACT+jB,EAAM1O,EAAEqU,OACL3F,IACHA,EAAI9lB,QAAQS,UAAY,mBAErBqlB,GAAOA,EAAI4F,WACd5F,EAAI4F,SAAWC,UAAU7F,EAAI4F,UAC7BtU,EAAEwU,YAAY9F,EAAI4F,SAAU,CAAEG,UAAW,OAAQC,QAAQ,EAAMrL,QAAS,EAAGhgB,UAAW,sBAAuBsrB,uBAI1GzoB,GAAG,qBAAqB,SAASC,GACf,SAAlBA,EAAEwc,cAAkD,mBAAhBiM,YACvC9uB,SAAS+uB,cAAc,IAAID,YAAY,oBAAqB,CAAEhd,OAAQzL,KAC1C,QAAlBA,EAAEwc,eAA6C,IAAnBxc,EAAEwc,cACxCxc,EAAE8nB,kBAIC/nB,GAAG,kBAAkB,SAASC,cAC9BuY,EAAQ/b,KAAKse,KACble,EAAQoD,EAAEpD,MACT2b,GAILA,EAAIxe,KAAK,YAAc,SAACiG,UAAM2oB,EAAKlsB,QAAQuf,eAAiB2M,EAAKtI,UAAUzjB,EAAM2jB,gBAE7EjmB,EAAE8R,QAAQ8P,OAET1f,KAAKC,QAAQO,UAAUJ,EAAMie,MAAMtC,GAKvCjY,GAAUsoB,oBAAsB7tB,EAC/ByB,KAAKgiB,YACqB,mBAAnBlkB,EAAEuuB,eAAgCrsB,KAAKC,QAAQmgB,WACtDtc,GAAUsoB,qBACTpoB,MACD,WAGKmoB,EAAKlsB,QAAQqsB,aAChBxoB,GAAUyoB,sBAAwBhuB,EACjC4tB,EAAKlK,cAC4B,mBAA1BnkB,EAAE0uB,QAAQC,aAA+BN,EAAKlsB,QAAQmgB,WAC7Dtc,GAAUyoB,uBACTvoB,MACD,WACC+X,EAAI2Q,WAAW,aAAa5uB,EAAE0uB,QAAQC,YAClC3uB,EAAEuuB,cAAgBtQ,EAAIuQ,YAAcvQ,EAAIuQ,WAAWnd,YACtD4M,EAAIuQ,WAAW7E,SAASrnB,GACxB2b,EACExY,GAAG,eAAe,SAACC,UAAM2oB,EAAKxD,uBAAuBnlB,MACrDD,GAAG,cAAe,SAACC,UAAM2oB,EAAK5D,iBAAiB/kB,WAOjD2oB,EAAKlsB,QAAQF,gBAChB+D,GAAU6oB,2BAA6BpuB,EACtC4tB,EAAKjK,aACyB,mBAAvBpkB,EAAE4F,kBAAoCyoB,EAAKlsB,QAAQmgB,WAC1Dtc,GAAU6oB,4BACT3oB,MAAK,kBAAMmoB,EAAKlsB,QAAQO,UAAYJ,EAAMie,MAAMtC,MAE9CoQ,EAAKlsB,QAAQO,UAAUJ,EAAMie,MAAMtC,OA9C1CrW,QAAQC,KAAK,yCAuDXinB,EAAW9uB,EAAE+uB,OAAO9Z,UAAU+Z,YAC9BltB,EAAWI,KACflC,EAAE+uB,OAAOE,QAAQ,CAChBD,YAAa,SAAS9V,EAAK5W,MACtBR,EAAQ+iB,QAAQuI,SAAS9qB,GAAQ,KAEhCK,EAAab,EAAQK,QAAQQ,MAAMU,QAAQ,SAAU,IACrDsL,EAAaiI,EAAUjU,IAAU,GACjCR,EAAaG,EAAMH,WAEvBA,EAAQwM,MAASA,EAAMhB,MAAQgB,EAAMnB,MAAQ7K,EAC7CR,EAAQuL,SAAWvL,EAAQwM,MAE3BmgB,EAASxkB,KAAKpI,KAAMgX,EAAK5W,GAErBH,EAAQuL,QAA6B,IAAnBvL,EAAQ0gB,OAAc,KACvCqM,EAA2BhW,EAAIU,0BAA4B,cAC/DV,EAAIU,yBAA2B,mBAC/BV,EAAIO,YAA2B,OAC/BP,EAAIS,UAA4C,KAAjBxX,EAAQ0gB,OACvC3J,EAAIxL,SACJwL,EAAIU,yBAA2BsV,QAIhCJ,EAASxkB,KAAKpI,KAAMgX,EAAK5W,WAMvBmD,GAAG,iBAAiB,gBACnBhG,KAAK,kCAAkC,SAASiG,GAChDxD,KAAKukB,qBACH9P,OAAO+I,sBAAsBha,EAAE/E,KAAM+E,EAAE4K,aACvCqG,OAAO+I,sBAAsBha,EAAE/E,KAAM+E,EAAE4K,cAExCsb,cAAclmB,EAAE/E,eCtmCxBqF,GAAU2nB,aAAY,sBAEjBrZ,EAAWpS,KAAKC,QAChBoZ,EAAW,GAEXrZ,KAAKC,QAAQmU,eACX6Y,gBAAkBjtB,KAAK4hB,kBACvBvN,QAAkB,YAElB4Y,gBAAkB7a,EAAK2N,oBACvB1L,QAAkBjC,EAAKmC,aAGxBhR,GAAG,mBAAmB,SAASC,OAC/B/E,EAAOuB,KAAKmT,MACZ5Q,EAAOiB,EAAEyZ,MAETiQ,EAAQltB,KAAK4D,WACbmX,EAAQmS,EAAM7T,UAAY,EAE1B6D,EAAOze,EAAK8D,GAAG3B,OACfusB,EAAO5qB,EAAI,EAAI9D,EAAK8D,EAAI,GAAG3B,OAASsc,EAEpCkQ,EAAQlQ,EAAKG,WAAW8P,GAAQntB,KAAKitB,gBAEzClS,GAAQ5b,KAAKK,MAAM4tB,EAAQ,IAAO,KAAU,IAE5C3uB,EAAK8D,GAAGwY,KAAOA,EAEfmS,EAAM7T,SAAW0B,UAGbxX,GAAG,iBAAiB,gBAEnBkR,OAAOiG,kBAAkB,CAC7BxN,KAAY,IACZ3D,SAAY,SACZ4D,MAAYnN,KAAKyU,OAAO6E,QAKG,WAAzBtZ,KAAKC,QAAQoZ,eAEX9V,GAAG,iBAAiB,sBAExB8V,EAASjN,EAAQpM,KAAKyU,OAAO6E,GAC7BD,EAASvX,MAAQ9B,KAAKyU,OAAOJ,aAExBI,OAAO0F,mBAAmB,CAC9BjN,KAAU,IACV3D,SAAU,SACV4D,MAAUkM,EAASjN,EACnBtK,MAAUuX,EAASvX,MACnByL,OAAU,GACVD,OAAU,kBAAMmJ,EAAKvF,SAAW,GAChCjQ,KAAU,qBAORqe,iBAAiB,QACT,CACXxd,MAAO,iBACP0G,MAAO,SAAC0kB,UAAWA,EAAM7T,UAAY,GAAGgU,QAAQ,GAAK,SAAWpV,EAAK5D,eClExEvQ,GAAU2nB,aAAY,sBAEjBrZ,EAAWpS,KAAKC,QAChBua,EAAW,GAEXpI,EAAKgC,eACHkZ,cAAgBttB,KAAK6hB,kBACrBvN,QAAgB,YAEhBgZ,cAAgBlb,EAAK+N,kBACrB7L,QAAgBlC,EAAKoC,aAGtBjR,GAAG,mBAAmB,SAASC,OAC/B/E,EAASuB,KAAKmT,MACd5Q,EAASiB,EAAEyZ,MACXlD,EAAStb,EAAK8D,GAAGwX,EAAI/Z,KAAKstB,cAE1BJ,EAASltB,KAAK4D,WACd2pB,EAASL,EAAMlC,gBAAkBlb,EAAAA,EACjC0d,EAASN,EAAMO,eAAkB3d,EAAAA,MAGhC9P,KAAKC,QAAQ8gB,iBAAmBxe,EAAI,EAAG,KACvCmrB,EAAQjvB,EAAK8D,EAAI,GAAGwX,KACpBiB,MAAM0S,GAAQ,KACbC,EAAQ3tB,KAAK4tB,YACbC,EAAQ9T,KACPiB,MAAM2S,IAAW3S,MAAM6S,GAEhB7S,MAAM2S,GAEN3S,MAAM6S,KACjBH,EAAUG,GAFVH,EAAUC,EAFVD,GAAWC,EAAQE,GAAS,GAMxB7S,MAAM0S,GAAQ,OAAOjvB,EAAKqvB,OAAOvrB,EAAI,EAAG,GAC7C9D,EAAK8D,EAAI,GAAGwX,EAAI2T,GAIb1S,MAAMjB,KACVwT,EAASA,EAASxT,EAAIA,EAAIwT,EAC1BC,EAASA,EAASzT,EAAIA,EAAIyT,OACrBI,YAAc7T,GAGpBtb,EAAK8D,GAAGwX,EAAIA,EAEZmT,EAAMlC,cAAgBuC,EACtBL,EAAMO,cAAgBD,UAGlBjqB,GAAG,iBAAiB,gBAEnBkR,OAAOiG,kBAAkB,CAC7BxN,KAAY,IACZ3D,SAAY,OACZ4D,MAAYnN,KAAKyU,OAAOuF,QAKG,WAAzBha,KAAKC,QAAQua,gBAEXjX,GAAG,iBAAiB,WAExBiX,EAASjM,EAAQvO,KAAKyU,OAAOuF,GAC7BQ,EAAS1Y,MAAQ9B,KAAKsU,aAEjBG,OAAO0F,mBAAmB,CAC9BjN,KAAU,IACV3D,SAAU,OACV4D,MAAUqN,EAASjM,EACnBzM,MAAU0Y,EAAS1Y,MACnBwL,QAAW,EACXC,QAAW,EACXtM,KAAU,qBAKPsC,GAAG,iBAAiB,eAEpB9C,EAAaT,KAAKC,QAAQQ,MAAMU,QAAQ,SAAU,IAClDsL,EAAaiI,EAAUjU,IAAU,GACjC8K,EAAcvL,KAAKC,QAAQ6f,SAAYrT,EAAMlB,OAAS,MAAS,EAC/DC,IAAcxL,KAAKC,QAAQ6f,UAAWrT,EAAMjB,YAE3CiJ,OAAOgG,kBAAkB,CAC7BxZ,KAAe,WACfa,MAAe,WACfiK,OAAe,WACfC,OAAe,WACfS,MAAeA,EAAMnB,MAAQ7K,EAC7BiM,YAAelB,GAAU,OACzBmB,cAAe,IACfC,YAAerB,EACf2L,aAAelX,KAAKC,QAAQiX,wBAO1BoI,iBAAiB,QACT,CACXxd,MAAO,kBACP0G,MAAO,SAAC0kB,UAAWA,EAAMlC,eAAiB,GAAGqC,QAAQ,GAAK,SAAW5W,EAAKnC,iBAE/D,CACXxS,MAAO,kBACP0G,MAAO,SAAC0kB,UAAWA,EAAMO,eAAiB,GAAGJ,QAAQ,GAAK,SAAW5W,EAAKnC,eC/G7ExQ,GAAU2nB,aAAY,sBAEjBrZ,EAAOpS,KAAKC,QACZwC,EAAO,GAEXA,EAAKX,MAAcsQ,EAAK2b,WAAc,SACjCC,YAAc5b,EAAKiP,gBAYnB4M,eAAiB7b,EAAK8b,cAAgB,MAAQ9b,EAAK+b,aAAe,GAElE/b,EAAKkP,WAEoB,QAAnBlP,EAAKkP,WACflP,EAAKkP,WAAa,SAAC7e,UAAU,IAAIM,KAAKN,GAAO2rB,sBAChB,QAAnBhc,EAAKkP,aACflP,EAAKkP,WAAa,SAAC7e,UAAU,IAAIM,KAAKN,GAAO4rB,uBAJ7Cjc,EAAKkP,WAAa,SAAC7e,UAAU,IAAIM,KAAKN,GAAO6rB,iBAAiBC,WAAW,IAAK,KAAKA,WAAW,IAAK,MAOpGnc,EAAKoc,YAAcpc,EAAKoc,aAAgB,SAACvvB,UAAMV,EAAaU,GAAG6I,MAAM,KAAK,IAEtEsK,EAAK3P,MAAqB,WAAb2P,EAAK3P,OAAsB3E,EAAE8R,QAAQ8P,aAEhDvF,mBAAmB,CACvBjN,KAAa,IACb3D,SAAa,MACb4D,MAAa,CACZL,KAAa,WACb2D,IAAa,GAEd3O,MAAaW,EAAKX,MAClByL,QAAc,GACdD,OAAa,kBAAMmJ,EAAKvF,UACxBjQ,KAAa,OACboM,WAAa,SAACnO,UAAa,GAALA,EAAS,GAAKkT,EAAKoc,YAAYtvB,IACrDsO,YAAa,SAAAN,GACZA,EAAKtD,OAAO,WACVuG,SACFjD,EAAKuB,UAAU,QACb3B,KAAK,UAAW,KAChBxM,MAAM,cAAe,aACrBA,MAAM,YAAa,QACrB4M,EAAKuB,UAAU,cACb3B,KAAK,KAAM2J,EAAKrF,WAChBtE,KAAK,mBAAoB,GACzBA,KAAK,UAAW,aAMhBvJ,GAAG,kBAAkB,SAASC,OAC9B/E,EAAOuB,KAAKmT,MACZ5Q,EAAOiB,EAAEyZ,UAGRzZ,EAAExB,MAAMQ,OAASgB,EAAExB,MAAMQ,KAAKC,KAAM,CACxCe,EAAExB,MAAMQ,KAAOgB,EAAExB,MAAMQ,MAAQ,OAC3B4qB,EAAS3uB,EAAK8D,GAAGwY,KAAOtc,EAAK8D,EAAI,EAAIA,EAAI,EAAIA,GAAGwY,KAChDmG,EAAQlhB,KAAKiuB,cACjBzqB,EAAExB,MAAMQ,KAAKC,KAAO,IAAIM,KAEtBR,EAAI,EACD9D,EAAK8D,EAAI,GAAGE,KAAKgsB,UAAgBrB,EAAQlM,EAASlhB,KAAKguB,YAAe,IACtEjrB,KAAK2rB,WAKPjsB,EAAOe,EAAExB,MAAMQ,KAAKC,KAGpBA,EAAKgsB,UAAuC,GAA3BhsB,EAAKksB,oBAA2B,KAAS,IAC7DlsB,EAAO,OAGJmsB,EAAWnsB,EACXosB,EAAWtsB,EAAI,EAAI9D,EAAK8D,EAAI,GAAGE,KAAOmsB,EAEtCE,EAAW3vB,KAAK4vB,IAAIH,EAAQC,GAC5BhE,GAAY7qB,KAAK4D,WAAWnB,MAAQ,GAAKqsB,EAE7CrwB,EAAK8D,GAAGE,KAAeA,EACvBhE,EAAK8D,GAAGsoB,SAAeA,OAElBjnB,WAAWnB,KAAOooB,KAGpB7qB,KAAKC,QAAQwC,YAEX4Y,oBAAoB,CACxBpa,KAAM,OACNkR,MAAO,SAACjO,UAASuS,EAAKxW,QAAQqhB,WAAWpd,EAAKzB,cAG1C6c,iBAAiB,SACR,CACZxd,MAAO,eACP0G,MAAO,SAAC0kB,UAAU3uB,EAAa2uB,EAAMzqB,MAAQ,WC3GjDqB,GAAU2nB,aAAY,yBAEhBzrB,KAAKC,QAAQghB,WAEd7O,EAAQpS,KAAKC,QACbghB,EAAQ,GAEZA,EAAMnf,MAAiBsQ,EAAK4c,YAAc,IAEhB,WAAtBhvB,KAAKC,QAAQghB,aAEX9G,mBAAmB,CACvBjN,KAAa,IACb3D,SAAa,QACb4D,MAAa,CACZsD,KAAc,EACdd,IAAa,GAEd1C,YAAa,GACbnL,MAAamf,EAAMnf,MACnBwL,OAAa,GACbC,QAAc,EACdtM,KAAa,eAGTwZ,kBAAkB,CACtBxZ,KAAe,QACfa,MAAe,QACfgK,MAAe,QACfC,OAAe,WACfC,OAAe,QACfS,MAAe,OACfC,YAAe,OACfC,cAAe,MACfC,YAAe,eAKZrJ,GAAG,mBAAmB,SAASC,OAC/B/E,EAAQuB,KAAKmT,MACb5Q,EAAQiB,EAAEyZ,MACVlD,EAAQtb,EAAK8D,GAAGwX,EAChBqT,EAAwD,KAA/C3uB,EAAK8D,GAAGwY,KAAOtc,EAAK8D,EAAI,EAAIA,EAAI,EAAIA,GAAGwY,MAGhDmS,EAAQltB,KAAK4D,WACbqrB,EAAQ/B,EAAMgC,QAAa,EAC3BC,EAAQjC,EAAMkC,SAAa,EAC3BC,EAAQnC,EAAMoC,WAAa,EAC3BC,EAAQrC,EAAMsC,WAAa,EAC3BvO,EAAQ,MAEPjG,MAAMjB,GAAI,KACV0V,EAAUltB,EAAI,EAAIwX,EAAItb,EAAK8D,EAAI,GAAGwX,EAAI,EACtC0V,EAAS,EAAQR,GAAQQ,EACpBA,EAAS,IAAGN,GAAQM,GAEf,IAAVrC,IAAiBnM,EAASwO,EAASrC,EAAS,QAI7CptB,KAAKC,QAAQshB,UAAW,KACvBmO,EAAYntB,EAAI,EAAI0e,EAAQxiB,EAAK8D,EAAI,GAAG0e,MAAQ,EAChD0O,EAAY3vB,KAAKC,QAAQshB,UACzBpiB,KAAK4vB,IAAIW,GAAUC,IACtB1O,EAAcxiB,EAAK8D,EAAI,GAAG0e,MAAQ0O,EAAYxwB,KAAK6c,KAAK0T,OAKtD1vB,KAAKC,QAAQwhB,OAAQ,KACpB1Q,EAAQ/Q,KAAKC,QAAQwhB,OACrBR,EAAQlQ,EAAM,GAASkQ,EAAQlQ,EAAM,GAChCkQ,EAAQlQ,EAAM,KAAIkQ,EAAQlQ,EAAM,KAG1CkQ,EAAQnjB,EAAEK,KAAKwb,UAAUsH,EAAO,IAEpBoO,IAAMA,EAAOpO,GACrBA,EAAQsO,IAAMA,EAAOtO,GAEzBxiB,EAAK8D,GAAG0e,MAAUA,EAElBiM,EAAMgC,OAAYD,EAClB/B,EAAMkC,QAAYD,EAClBjC,EAAMoC,UAAYD,EAClBnC,EAAMsC,UAAYD,UAGdlU,oBAAoB,CACxBpa,KAAM,QACNkR,MAAO,SAACjO,UAASA,EAAK+c,MAAQA,EAAMnf,OACpCN,OAAQ,SAAC0C,UAAS/E,KAAKK,MAAM0E,EAAK+c,OAASA,EAAMnf,cAG7Cwd,iBAAiB,QACT,CACXxd,MAAO,iBACP0G,MAAO,SAAC0kB,UAAU/tB,KAAKK,MAAM0tB,EAAMgC,QAAU,GAAK,SAAWzY,EAAKnC,kBAEtD,CACZxS,MAAO,kBACP0G,MAAO,SAAC0kB,UAAU/tB,KAAKK,MAAM0tB,EAAMkC,SAAW,GAAK,SAAW3Y,EAAKnC,mBAExD,CACXxS,MAAO,cACP0G,MAAO,SAAC0kB,UAAU/tB,KAAKK,MAAM0tB,EAAMsC,WAAa,GAAK,SAAWvO,EAAMnf,iBAE3D,CACXA,MAAO,cACP0G,MAAO,SAAC0kB,UAAU/tB,KAAKK,MAAM0tB,EAAMoC,WAAa,GAAK,SAAWrO,EAAMnf,cC/GzEgC,GAAU2nB,aAAY,cAEhBzrB,KAAKC,QAAQihB,OAAUlhB,KAAKC,QAAQ2vB,kBAErCxd,EAAOpS,KAAKC,QACZihB,EAAQ,GAEZA,EAAMpf,MAAiBsQ,EAAKyd,YAAe/xB,EAAES,EAAEyB,KAAKC,QAAQmU,SAAW,MAAQ,aAC1E0b,aAAkB1d,EAAK+b,aAAe,EAEvCnuB,KAAKC,QAAQihB,OAA+B,WAAtBlhB,KAAKC,QAAQihB,aAEjC/G,mBAAmB,CACvBjN,KAAa,IACb3D,SAAa,QACb4D,MAAa,CACZsD,IAAa,EACbd,IAAa,GAEd1C,YAAa,GACbnL,MAAaof,EAAMpf,MACnBwL,OAAa,GACbC,QAAc,EACdtM,KAAa,eAGTwZ,kBAAkB,CACtBxZ,KAAa,QACba,MAAa,QACbgK,MAAa,QACbC,OAAa,WACbC,OAAa,QACbS,MAAa,UACbC,YAAe,OACfC,cAAe,MACfC,YAAe,eAKZrJ,GAAG,kBAAkB,SAASC,OAC9B/E,EAASuB,KAAKmT,MACd5Q,EAASiB,EAAEyZ,MAEX2R,EAASnwB,EAAK8D,GAAGE,KAGjBqsB,EAASF,GAFArsB,EAAI,EAAI9D,EAAK8D,EAAI,GAAGE,KAAOmsB,GAIpC1B,EAASltB,KAAK4D,WACdyrB,EAASnC,EAAM6C,YAAcjgB,EAAAA,EAC7Byf,EAASrC,EAAM8C,WAAclgB,EAAAA,EAC7BmgB,EAAS/C,EAAMgD,WAAa,EAC5BhP,EAAS,KAET4N,EAAS,EAAG,KACX1B,EAAwD,KAA/C3uB,EAAK8D,GAAGwY,KAAOtc,EAAK8D,EAAI,EAAIA,EAAI,EAAIA,GAAGwY,MACpDmG,EAAQ/hB,KAAK4vB,IAAK3B,EAAQ0B,EAAU9uB,KAAKguB,aAAehuB,KAAK8vB,gBAI1D9vB,KAAKC,QAAQkwB,cAAe,KAC3BT,EAAYntB,EAAI,EAAI2e,EAAQziB,EAAK8D,EAAI,GAAG2e,MAAQ,EAChDyO,EAAY3vB,KAAKC,QAAQkwB,cACzBhxB,KAAK4vB,IAAIW,GAAUC,IACtBzO,EAAcziB,EAAK8D,EAAI,GAAG2e,MAAQyO,EAAYxwB,KAAK6c,KAAK0T,OAKtD1vB,KAAKC,QAAQmwB,WAAY,KACxBrf,EAAQ/Q,KAAKC,QAAQmwB,WACrBlP,EAAQnQ,EAAM,GAASmQ,EAAQnQ,EAAM,GAChCmQ,EAAQnQ,EAAM,KAAImQ,EAAQnQ,EAAM,IAK1Cse,GAFAnO,EAAQpjB,EAAEK,KAAKwb,UAAUuH,EAAO,IAEjBmO,EAAOnO,EAAQmO,EAC9BE,EAAOrO,EAAQqO,EAAOrO,EAAQqO,EAC9BU,GAAQ/O,EAAQ+O,GAAQ,EAExBxxB,EAAK8D,GAAG2e,MAAQA,EAEhBgM,EAAM6C,UAAYV,EAClBnC,EAAM8C,UAAYT,EAClBrC,EAAMgD,UAAYD,KAGfjwB,KAAKC,QAAQihB,aAEX7F,oBAAoB,CACxBpa,KAAM,QACNkR,MAAO,SAACjO,UAASA,EAAKgd,MAAQ,IAAMA,EAAMpf,OAC1CN,OAAQ,SAAC0C,UAAS/E,KAAKK,MAAM0E,EAAKgd,OAAS,IAAMA,EAAMpf,cAGnDwd,iBAAiB,UACP,CACbxd,MAAO,cACP0G,MAAO,SAAC0kB,UAAU/tB,KAAKK,MAAM0tB,EAAM8C,WAAa,GAAK,SAAW9O,EAAMpf,iBAEzD,CACbA,MAAO,cACP0G,MAAO,SAAC0kB,UAAU/tB,KAAKK,MAAM0tB,EAAM6C,WAAa,GAAK,SAAW7O,EAAMpf,iBAE3D,CACXA,MAAO,cACP0G,MAAO,SAAC0kB,UAAU/tB,KAAKK,MAAM0tB,EAAMgD,WAAa,GAAK,SAAWhP,EAAMpf,eC5G1EgC,GAAU2nB,aAAY,cAEhBzrB,KAAKC,QAAQ2vB,kBAEdxd,EAAOpS,KAAKC,QACZ2vB,EAAe,GAEnBA,EAAa9tB,MAAcsQ,EAAKie,mBAAsBvyB,EAAES,EAAEyB,KAAKC,QAAQmU,SAAW,QAAU,aACvFkc,oBAAsBle,EAAKme,oBAAsB,EAErB,WAA7BvwB,KAAKC,QAAQ2vB,oBAEXzV,mBAAmB,CACvBjN,KAAa,IACb3D,SAAa,QACb4D,MAAa,CACZsD,IAAa,EACbd,IAAa,GAEd1C,YAAa,GACbnL,MAAa8tB,EAAa9tB,MAC1BwL,OAAa,GACbC,QAAc,EACdtM,KAAa,sBAGTwZ,kBAAkB,CACtBxZ,KAAa,eACba,MAAa,eACbgK,MAAa,eACbC,OAAa,WACbC,OAAa,eACbS,MAAa,UACbC,YAAe,OACfC,cAAe,MACfC,YAAe,eAKZrJ,GAAG,kBAAkB,SAASC,OAC9B/E,EAASuB,KAAKmT,MACd5Q,EAASiB,EAAEyZ,MAEX2R,EAASnwB,EAAK8D,GAAGE,KAGjBqsB,GAAUF,GAFDrsB,EAAI,EAAI9D,EAAK8D,EAAI,GAAGE,KAAOmsB,IAET,IAE3B1B,EAASltB,KAAK4D,WACdyrB,EAASnC,EAAMsD,mBAAqB1gB,EAAAA,EACpCyf,EAASrC,EAAMuD,kBAAqB3gB,EAAAA,EACpCmgB,EAAS/C,EAAMwD,kBAAoB,EACnCd,EAAe,KAEfd,EAAS,EAAG,KACX5R,EAAWze,EAAK8D,GAAG2e,MAEnBkM,GAAYlQ,GADD3a,EAAI,EAAI9D,EAAK8D,EAAI,GAAG2e,MAAQhE,KACX,IAAOld,KAAKguB,aAC5C4B,EAAezwB,KAAK4vB,IAAK3B,EAAQ0B,GAAW9uB,KAAKswB,uBAI9CtwB,KAAKC,QAAQ0wB,qBAAsB,KAClCC,EAAaruB,EAAI,EAAIqtB,EAAenxB,EAAK8D,EAAI,GAAGqtB,aAAe,EAC/DD,EAAa3vB,KAAKC,QAAQ0wB,qBAC1BxxB,KAAK4vB,IAAI6B,GAAUjB,IACtBC,EAAenxB,EAAK8D,EAAI,GAAGqtB,aAAeD,EAAYxwB,KAAK6c,KAAK4U,OAK9D5wB,KAAKC,QAAQ4wB,kBAAmB,KAC/B9f,EAAQ/Q,KAAKC,QAAQ4wB,kBACrBjB,EAAe7e,EAAM,GAAS6e,EAAe7e,EAAM,GAC9C6e,EAAe7e,EAAM,KAAI6e,EAAe7e,EAAM,KAGxD6e,EAAe9xB,EAAEK,KAAKwb,UAAUiW,EAAc,IAE3BP,IAAMA,EAAOO,GAC5BA,EAAeL,IAAMA,EAAOK,GAChCK,GAAQL,EAAeK,GAAQ,EAE/BxxB,EAAK8D,GAAGqtB,aAAeA,EAEvB1C,EAAMsD,iBAAmBnB,EACzBnC,EAAMuD,iBAAmBlB,EACzBrC,EAAMwD,iBAAmBT,UAGrB5U,oBAAoB,CACxBpa,KAAQ,eACRkR,MAAQ,SAACjO,UAASA,EAAK0rB,aAAe,IAAMA,EAAa9tB,OACzDN,OAAQ,SAAC0C,UAAS/E,KAAKK,MAAM0E,EAAK0rB,cAAgB,IAAMA,EAAa9tB,cAGjEwd,iBAAiB,iBACA,CACpBxd,MAAO,qBACP0G,MAAO,SAAC0kB,UAAU/tB,KAAKK,MAAM0tB,EAAMuD,kBAAoB,GAAK,SAAWb,EAAa9tB,wBAEhE,CACpBA,MAAO,qBACP0G,MAAO,SAAC0kB,UAAU/tB,KAAKK,MAAM0tB,EAAMsD,kBAAoB,GAAK,SAAWZ,EAAa9tB,wBAElE,CAClBA,MAAO,qBACP0G,MAAO,SAAC0kB,UAAU/tB,KAAKK,MAAM0tB,EAAMwD,kBAAoB,GAAK,SAAWd,EAAa9tB,cCjEvFgC,GAAUgtB,MAAQvyB,EAClBuF,GAAUitB,WAAarc,EACvB5Q,GAAUmN,MAAQA,EAElBnT,EAAE8B,QAAQoxB,UAAY,SAAC/wB,UAAY,IAAI6D,GAAU7D"}
|