{
  "version": 3,
  "sources": ["../../../node_modules/leaflet/src/core/Util.js", "../../../node_modules/leaflet/src/core/Class.js", "../../../node_modules/leaflet/src/core/Events.js", "../../../node_modules/leaflet/src/geometry/Point.js", "../../../node_modules/leaflet/src/geometry/Bounds.js", "../../../node_modules/leaflet/src/geo/LatLngBounds.js", "../../../node_modules/leaflet/src/geo/LatLng.js", "../../../node_modules/leaflet/src/geo/crs/CRS.js", "../../../node_modules/leaflet/src/geo/crs/CRS.Earth.js", "../../../node_modules/leaflet/src/geo/projection/Projection.SphericalMercator.js", "../../../node_modules/leaflet/src/geometry/Transformation.js", "../../../node_modules/leaflet/src/geo/crs/CRS.EPSG3857.js", "../../../node_modules/leaflet/src/layer/vector/SVG.Util.js", "../../../node_modules/leaflet/src/core/Browser.js", "../../../node_modules/leaflet/src/dom/DomEvent.Pointer.js", "../../../node_modules/leaflet/src/dom/DomEvent.DoubleTap.js", "../../../node_modules/leaflet/src/dom/DomUtil.js", "../../../node_modules/leaflet/src/dom/DomEvent.js", "../../../node_modules/leaflet/src/dom/PosAnimation.js", "../../../node_modules/leaflet/src/map/Map.js", "../../../node_modules/leaflet/src/control/Control.js", "../../../node_modules/leaflet/src/control/Control.Layers.js", "../../../node_modules/leaflet/src/control/Control.Zoom.js", "../../../node_modules/leaflet/src/control/Control.Scale.js", "../../../node_modules/leaflet/src/control/Control.Attribution.js", "../../../node_modules/leaflet/src/control/index.js", "../../../node_modules/leaflet/src/core/Handler.js", "../../../node_modules/leaflet/src/core/index.js", "../../../node_modules/leaflet/src/dom/Draggable.js", "../../../node_modules/leaflet/src/geometry/PolyUtil.js", "../../../node_modules/leaflet/src/geometry/LineUtil.js", "../../../node_modules/leaflet/src/geo/projection/Projection.LonLat.js", "../../../node_modules/leaflet/src/geo/projection/Projection.Mercator.js", "../../../node_modules/leaflet/src/geo/projection/index.js", "../../../node_modules/leaflet/src/geo/crs/CRS.EPSG3395.js", "../../../node_modules/leaflet/src/geo/crs/CRS.EPSG4326.js", "../../../node_modules/leaflet/src/geo/crs/CRS.Simple.js", "../../../node_modules/leaflet/src/geo/crs/index.js", "../../../node_modules/leaflet/src/layer/Layer.js", "../../../node_modules/leaflet/src/layer/LayerGroup.js", "../../../node_modules/leaflet/src/layer/FeatureGroup.js", "../../../node_modules/leaflet/src/layer/marker/Icon.js", "../../../node_modules/leaflet/src/layer/marker/Icon.Default.js", "../../../node_modules/leaflet/src/layer/marker/Marker.Drag.js", "../../../node_modules/leaflet/src/layer/marker/Marker.js", "../../../node_modules/leaflet/src/layer/vector/Path.js", "../../../node_modules/leaflet/src/layer/vector/CircleMarker.js", "../../../node_modules/leaflet/src/layer/vector/Circle.js", "../../../node_modules/leaflet/src/layer/vector/Polyline.js", "../../../node_modules/leaflet/src/layer/vector/Polygon.js", "../../../node_modules/leaflet/src/layer/GeoJSON.js", "../../../node_modules/leaflet/src/layer/ImageOverlay.js", "../../../node_modules/leaflet/src/layer/VideoOverlay.js", "../../../node_modules/leaflet/src/layer/SVGOverlay.js", "../../../node_modules/leaflet/src/layer/DivOverlay.js", "../../../node_modules/leaflet/src/layer/Popup.js", "../../../node_modules/leaflet/src/layer/Tooltip.js", "../../../node_modules/leaflet/src/layer/marker/DivIcon.js", "../../../node_modules/leaflet/src/layer/marker/index.js", "../../../node_modules/leaflet/src/layer/tile/GridLayer.js", "../../../node_modules/leaflet/src/layer/tile/TileLayer.js", "../../../node_modules/leaflet/src/layer/tile/TileLayer.WMS.js", "../../../node_modules/leaflet/src/layer/tile/index.js", "../../../node_modules/leaflet/src/layer/vector/Renderer.js", "../../../node_modules/leaflet/src/layer/vector/Canvas.js", "../../../node_modules/leaflet/src/layer/vector/SVG.VML.js", "../../../node_modules/leaflet/src/layer/vector/SVG.js", "../../../node_modules/leaflet/src/layer/vector/Renderer.getRenderer.js", "../../../node_modules/leaflet/src/layer/vector/Rectangle.js", "../../../node_modules/leaflet/src/layer/vector/index.js", "../../../node_modules/leaflet/src/layer/index.js", "../../../node_modules/leaflet/src/map/handler/Map.BoxZoom.js", "../../../node_modules/leaflet/src/map/handler/Map.DoubleClickZoom.js", "../../../node_modules/leaflet/src/map/handler/Map.Drag.js", "../../../node_modules/leaflet/src/map/handler/Map.Keyboard.js", "../../../node_modules/leaflet/src/map/handler/Map.ScrollWheelZoom.js", "../../../node_modules/leaflet/src/map/handler/Map.TapHold.js", "../../../node_modules/leaflet/src/map/handler/Map.TouchZoom.js", "../../../node_modules/leaflet/src/map/index.js", "../../../node_modules/wicket/wicket.js", "../../../node_modules/wicket/wicket-leaflet.js", "../../../node_modules/geostats/lib/geostats.min.js", "../../../node_modules/@rails/actioncable/src/adapters.js", "../../../node_modules/@rails/actioncable/src/logger.js", "../../../node_modules/@rails/actioncable/src/connection_monitor.js", "../../../node_modules/@rails/actioncable/src/internal.js", "../../../node_modules/@rails/actioncable/src/connection.js", "../../../node_modules/@rails/actioncable/src/subscription.js", "../../../node_modules/@rails/actioncable/src/subscription_guarantor.js", "../../../node_modules/@rails/actioncable/src/subscriptions.js", "../../../node_modules/@rails/actioncable/src/consumer.js", "../../../node_modules/@rails/actioncable/src/index.js", "../../../node_modules/@hotwired/stimulus/dist/stimulus.js", "../../javascript/controllers/application.js", "../../javascript/controllers/admin_autocomplete_boost_controller.js", "../../javascript/controllers/adr_tier_controller.js", "../../javascript/controllers/amenities_chart_controller.js", "../../javascript/controllers/amenities_dropdown_controller.js", "../../javascript/controllers/amplitude_controller.js", "../../javascript/controllers/application_controller.js", "../../javascript/controllers/auth0_controller.js", "../../javascript/controllers/auth_controller.js", "../../javascript/lib/merge_recent_searches.js", "../../javascript/lib/google_places_country.js", "../../javascript/lib/google_maps.js", "../../javascript/controllers/autocomplete_controller.js", "../../javascript/controllers/bedroom_count_chart_controller.js", "../../javascript/controllers/calendar_controller.js", "../../javascript/controllers/chart_controller.js", "../../javascript/controllers/comp_set_list_row_controller.js", "../../javascript/controllers/contact_form_controller.js", "../../javascript/controllers/daily_occupancy_chart_controller.js", "../../javascript/controllers/desktop_filters_controller.js", "../../javascript/controllers/detection_simulator_controller.js", "../../javascript/controllers/dropdown_controller.js", "../../javascript/controllers/email_exists_modal_controller.js", "../../javascript/controllers/filters_container_controller.js", "../../javascript/controllers/filters_explainer_controller.js", "../../javascript/controllers/gallery_controller.js", "../../javascript/controllers/google_ads_controller.js", "../../javascript/controllers/google_one_tap_controller.js", "../../javascript/controllers/google_places_controller.js", "../../../node_modules/simple-statistics/src/linear_regression.js", "../../../node_modules/simple-statistics/src/linear_regression_line.js", "../../../node_modules/simple-statistics/src/sum.js", "../../../node_modules/simple-statistics/src/mean.js", "../../../node_modules/simple-statistics/src/sum_nth_power_deviations.js", "../../../node_modules/simple-statistics/src/variance.js", "../../../node_modules/simple-statistics/src/standard_deviation.js", "../../../node_modules/simple-statistics/src/r_squared.js", "../../../node_modules/simple-statistics/src/mode_sorted.js", "../../../node_modules/simple-statistics/src/numeric_sort.js", "../../../node_modules/simple-statistics/src/mode.js", "../../../node_modules/simple-statistics/src/mode_fast.js", "../../../node_modules/simple-statistics/src/min.js", "../../../node_modules/simple-statistics/src/max.js", "../../../node_modules/simple-statistics/src/extent.js", "../../../node_modules/simple-statistics/src/min_sorted.js", "../../../node_modules/simple-statistics/src/max_sorted.js", "../../../node_modules/simple-statistics/src/extent_sorted.js", "../../../node_modules/simple-statistics/src/sum_simple.js", "../../../node_modules/simple-statistics/src/product.js", "../../../node_modules/simple-statistics/src/quantile_sorted.js", "../../../node_modules/simple-statistics/src/quickselect.js", "../../../node_modules/simple-statistics/src/quantile.js", "../../../node_modules/simple-statistics/src/quantile_rank_sorted.js", "../../../node_modules/simple-statistics/src/quantile_rank.js", "../../../node_modules/simple-statistics/src/interquartile_range.js", "../../../node_modules/simple-statistics/src/median.js", "../../../node_modules/simple-statistics/src/median_absolute_deviation.js", "../../../node_modules/simple-statistics/src/chunk.js", "../../../node_modules/simple-statistics/src/sample_with_replacement.js", "../../../node_modules/simple-statistics/src/shuffle_in_place.js", "../../../node_modules/simple-statistics/src/shuffle.js", "../../../node_modules/simple-statistics/src/sample.js", "../../../node_modules/simple-statistics/src/make_matrix.js", "../../../node_modules/simple-statistics/src/unique_count_sorted.js", "../../../node_modules/simple-statistics/src/ckmeans.js", "../../../node_modules/simple-statistics/src/jenks_breaks.js", "../../../node_modules/simple-statistics/src/jenks_matrices.js", "../../../node_modules/simple-statistics/src/jenks.js", "../../../node_modules/simple-statistics/src/equal_interval_breaks.js", "../../../node_modules/simple-statistics/src/sample_covariance.js", "../../../node_modules/simple-statistics/src/sample_variance.js", "../../../node_modules/simple-statistics/src/sample_standard_deviation.js", "../../../node_modules/simple-statistics/src/sample_correlation.js", "../../../node_modules/simple-statistics/src/sample_rank_correlation.js", "../../../node_modules/simple-statistics/src/sample_skewness.js", "../../../node_modules/simple-statistics/src/sample_kurtosis.js", "../../../node_modules/simple-statistics/src/permutations_heap.js", "../../../node_modules/simple-statistics/src/combinations.js", "../../../node_modules/simple-statistics/src/combinations_replacement.js", "../../../node_modules/simple-statistics/src/add_to_mean.js", "../../../node_modules/simple-statistics/src/combine_means.js", "../../../node_modules/simple-statistics/src/combine_variances.js", "../../../node_modules/simple-statistics/src/geometric_mean.js", "../../../node_modules/simple-statistics/src/log_average.js", "../../../node_modules/simple-statistics/src/harmonic_mean.js", "../../../node_modules/simple-statistics/src/mean_simple.js", "../../../node_modules/simple-statistics/src/median_sorted.js", "../../../node_modules/simple-statistics/src/subtract_from_mean.js", "../../../node_modules/simple-statistics/src/root_mean_square.js", "../../../node_modules/simple-statistics/src/coefficient_of_variation.js", "../../../node_modules/simple-statistics/src/t_test.js", "../../../node_modules/simple-statistics/src/t_test_two_sample.js", "../../../node_modules/simple-statistics/src/wilcoxon_rank_sum.js", "../../../node_modules/simple-statistics/src/bayesian_classifier.js", "../../../node_modules/simple-statistics/src/perceptron.js", "../../../node_modules/simple-statistics/src/epsilon.js", "../../../node_modules/simple-statistics/src/factorial.js", "../../../node_modules/simple-statistics/src/gamma.js", "../../../node_modules/simple-statistics/src/gammaln.js", "../../../node_modules/simple-statistics/src/bernoulli_distribution.js", "../../../node_modules/simple-statistics/src/binomial_distribution.js", "../../../node_modules/simple-statistics/src/poisson_distribution.js", "../../../node_modules/simple-statistics/src/chi_squared_distribution_table.js", "../../../node_modules/simple-statistics/src/chi_squared_goodness_of_fit.js", "../../../node_modules/simple-statistics/src/kernel_density_estimation.js", "../../../node_modules/simple-statistics/src/z_score.js", "../../../node_modules/simple-statistics/src/standard_normal_table.js", "../../../node_modules/simple-statistics/src/cumulative_std_normal_probability.js", "../../../node_modules/simple-statistics/src/cumulative_std_logistic_probability.js", "../../../node_modules/simple-statistics/src/error_function.js", "../../../node_modules/simple-statistics/src/inverse_error_function.js", "../../../node_modules/simple-statistics/src/probit.js", "../../../node_modules/simple-statistics/src/logit.js", "../../../node_modules/simple-statistics/src/permutation_test.js", "../../../node_modules/simple-statistics/src/sign.js", "../../../node_modules/simple-statistics/src/bisect.js", "../../../node_modules/simple-statistics/src/euclidean_distance.js", "../../../node_modules/simple-statistics/src/k_means_cluster.js", "../../../node_modules/simple-statistics/src/silhouette.js", "../../../node_modules/simple-statistics/src/silhouette_metric.js", "../../../node_modules/simple-statistics/src/relative_error.js", "../../../node_modules/simple-statistics/src/approx_equal.js", "../../javascript/controllers/h3_map_controller.js", "../../../node_modules/h3-js/dist/libh3-browser.js", "../../../node_modules/h3-js/lib/bindings.js", "../../../node_modules/h3-js/lib/errors.js", "../../../node_modules/h3-js/lib/h3core.js", "../../javascript/controllers/h3_map_preview_controller.js", "../../javascript/controllers/image_fallback_controller.js", "../../javascript/controllers/insights_city_tracking_controller.js", "../../javascript/controllers/insights_map_controller.js", "../../javascript/controllers/investment_calculator_landing_controller.js", "../../javascript/controllers/investment_calculator_preview_tracking_controller.js", "../../javascript/controllers/investment_calculator_recent_searches_controller.js", "../../javascript/controllers/landing_page_tracking_controller.js", "../../javascript/controllers/link_interceptor_controller.js", "../../javascript/controllers/listings_chart_controller.js", "../../javascript/controllers/map_expand_controller.js", "../../javascript/controllers/map_modal_controller.js", "../../javascript/controllers/map_switcher_controller.js", "../../javascript/controllers/metric_chart_switcher_controller.js", "../../javascript/controllers/minimal_chart_controller.js", "../../javascript/controllers/mobile_comp_set_filters_controller.js", "../../javascript/controllers/mobile_filters_controller.js", "../../javascript/controllers/paddle_controller.js", "../../javascript/controllers/paywall_controller.js", "../../javascript/controllers/polygon_editor_controller.js", "../../javascript/controllers/polygon_navigation_controller.js", "../../javascript/controllers/polygons_map_controller.js", "../../javascript/controllers/portfolio_controller.js", "../../javascript/controllers/pricing_controller.js", "../../javascript/controllers/pricing_modal_controller.js", "../../javascript/controllers/primary_intent_controller.js", "../../javascript/controllers/rating_count_distribution_chart_controller.js", "../../javascript/controllers/rating_distribution_chart_controller.js", "../../javascript/controllers/recent_searches_controller.js", "../../javascript/controllers/revenue_histogram_controller.js", "../../javascript/controllers/revenue_tier_controller.js", "../../javascript/controllers/scroll_reveal_controller.js", "../../javascript/controllers/signup_form_controller.js", "../../javascript/controllers/slide_panel_controller.js", "../../javascript/controllers/smooth_scroll_controller.js", "../../javascript/controllers/sortable_table_controller.js", "../../javascript/controllers/story_nav_controller.js", "../../javascript/controllers/story_tabs_controller.js", "../../javascript/controllers/submarkets_controller.js", "../../javascript/controllers/subscription_modal_controller.js", "../../javascript/controllers/top_listings_controller.js", "../../javascript/controllers/wkt_map_controller.js", "../../javascript/controllers/index.js", "../../../node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js", "../../javascript/application.js"],
  "sourcesContent": ["/*\r\n * @namespace Util\r\n *\r\n * Various utility functions, used by Leaflet internally.\r\n */\r\n\r\n// @function extend(dest: Object, src?: Object): Object\r\n// Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut.\r\nexport function extend(dest) {\r\n\tvar i, j, len, src;\r\n\r\n\tfor (j = 1, len = arguments.length; j < len; j++) {\r\n\t\tsrc = arguments[j];\r\n\t\tfor (i in src) {\r\n\t\t\tdest[i] = src[i];\r\n\t\t}\r\n\t}\r\n\treturn dest;\r\n}\r\n\r\n// @function create(proto: Object, properties?: Object): Object\r\n// Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create)\r\nexport var create = Object.create || (function () {\r\n\tfunction F() {}\r\n\treturn function (proto) {\r\n\t\tF.prototype = proto;\r\n\t\treturn new F();\r\n\t};\r\n})();\r\n\r\n// @function bind(fn: Function, …): Function\r\n// Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\r\n// Has a `L.bind()` shortcut.\r\nexport function bind(fn, obj) {\r\n\tvar slice = Array.prototype.slice;\r\n\r\n\tif (fn.bind) {\r\n\t\treturn fn.bind.apply(fn, slice.call(arguments, 1));\r\n\t}\r\n\r\n\tvar args = slice.call(arguments, 2);\r\n\r\n\treturn function () {\r\n\t\treturn fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments);\r\n\t};\r\n}\r\n\r\n// @property lastId: Number\r\n// Last unique ID used by [`stamp()`](#util-stamp)\r\nexport var lastId = 0;\r\n\r\n// @function stamp(obj: Object): Number\r\n// Returns the unique ID of an object, assigning it one if it doesn't have it.\r\nexport function stamp(obj) {\r\n\tif (!('_leaflet_id' in obj)) {\r\n\t\tobj['_leaflet_id'] = ++lastId;\r\n\t}\r\n\treturn obj._leaflet_id;\r\n}\r\n\r\n// @function throttle(fn: Function, time: Number, context: Object): Function\r\n// Returns a function which executes function `fn` with the given scope `context`\r\n// (so that the `this` keyword refers to `context` inside `fn`'s code). The function\r\n// `fn` will be called no more than one time per given amount of `time`. The arguments\r\n// received by the bound function will be any arguments passed when binding the\r\n// function, followed by any arguments passed when invoking the bound function.\r\n// Has an `L.throttle` shortcut.\r\nexport function throttle(fn, time, context) {\r\n\tvar lock, args, wrapperFn, later;\r\n\r\n\tlater = function () {\r\n\t\t// reset lock and call if queued\r\n\t\tlock = false;\r\n\t\tif (args) {\r\n\t\t\twrapperFn.apply(context, args);\r\n\t\t\targs = false;\r\n\t\t}\r\n\t};\r\n\r\n\twrapperFn = function () {\r\n\t\tif (lock) {\r\n\t\t\t// called too soon, queue to call later\r\n\t\t\targs = arguments;\r\n\r\n\t\t} else {\r\n\t\t\t// call and lock until later\r\n\t\t\tfn.apply(context, arguments);\r\n\t\t\tsetTimeout(later, time);\r\n\t\t\tlock = true;\r\n\t\t}\r\n\t};\r\n\r\n\treturn wrapperFn;\r\n}\r\n\r\n// @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number\r\n// Returns the number `num` modulo `range` in such a way so it lies within\r\n// `range[0]` and `range[1]`. The returned value will be always smaller than\r\n// `range[1]` unless `includeMax` is set to `true`.\r\nexport function wrapNum(x, range, includeMax) {\r\n\tvar max = range[1],\r\n\t    min = range[0],\r\n\t    d = max - min;\r\n\treturn x === max && includeMax ? x : ((x - min) % d + d) % d + min;\r\n}\r\n\r\n// @function falseFn(): Function\r\n// Returns a function which always returns `false`.\r\nexport function falseFn() { return false; }\r\n\r\n// @function formatNum(num: Number, precision?: Number|false): Number\r\n// Returns the number `num` rounded with specified `precision`.\r\n// The default `precision` value is 6 decimal places.\r\n// `false` can be passed to skip any processing (can be useful to avoid round-off errors).\r\nexport function formatNum(num, precision) {\r\n\tif (precision === false) { return num; }\r\n\tvar pow = Math.pow(10, precision === undefined ? 6 : precision);\r\n\treturn Math.round(num * pow) / pow;\r\n}\r\n\r\n// @function trim(str: String): String\r\n// Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)\r\nexport function trim(str) {\r\n\treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\r\n}\r\n\r\n// @function splitWords(str: String): String[]\r\n// Trims and splits the string on whitespace and returns the array of parts.\r\nexport function splitWords(str) {\r\n\treturn trim(str).split(/\\s+/);\r\n}\r\n\r\n// @function setOptions(obj: Object, options: Object): Object\r\n// Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut.\r\nexport function setOptions(obj, options) {\r\n\tif (!Object.prototype.hasOwnProperty.call(obj, 'options')) {\r\n\t\tobj.options = obj.options ? create(obj.options) : {};\r\n\t}\r\n\tfor (var i in options) {\r\n\t\tobj.options[i] = options[i];\r\n\t}\r\n\treturn obj.options;\r\n}\r\n\r\n// @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String\r\n// Converts an object into a parameter URL string, e.g. `{a: \"foo\", b: \"bar\"}`\r\n// translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will\r\n// be appended at the end. If `uppercase` is `true`, the parameter names will\r\n// be uppercased (e.g. `'?A=foo&B=bar'`)\r\nexport function getParamString(obj, existingUrl, uppercase) {\r\n\tvar params = [];\r\n\tfor (var i in obj) {\r\n\t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\r\n\t}\r\n\treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\r\n}\r\n\r\nvar templateRe = /\\{ *([\\w_ -]+) *\\}/g;\r\n\r\n// @function template(str: String, data: Object): String\r\n// Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`\r\n// and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string\r\n// `('Hello foo, bar')`. You can also specify functions instead of strings for\r\n// data values — they will be evaluated passing `data` as an argument.\r\nexport function template(str, data) {\r\n\treturn str.replace(templateRe, function (str, key) {\r\n\t\tvar value = data[key];\r\n\r\n\t\tif (value === undefined) {\r\n\t\t\tthrow new Error('No value provided for variable ' + str);\r\n\r\n\t\t} else if (typeof value === 'function') {\r\n\t\t\tvalue = value(data);\r\n\t\t}\r\n\t\treturn value;\r\n\t});\r\n}\r\n\r\n// @function isArray(obj): Boolean\r\n// Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)\r\nexport var isArray = Array.isArray || function (obj) {\r\n\treturn (Object.prototype.toString.call(obj) === '[object Array]');\r\n};\r\n\r\n// @function indexOf(array: Array, el: Object): Number\r\n// Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)\r\nexport function indexOf(array, el) {\r\n\tfor (var i = 0; i < array.length; i++) {\r\n\t\tif (array[i] === el) { return i; }\r\n\t}\r\n\treturn -1;\r\n}\r\n\r\n// @property emptyImageUrl: String\r\n// Data URI string containing a base64-encoded empty GIF image.\r\n// Used as a hack to free memory from unused images on WebKit-powered\r\n// mobile devices (by setting image `src` to this string).\r\nexport var emptyImageUrl = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';\r\n\r\n// inspired by https://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\r\nfunction getPrefixed(name) {\r\n\treturn window['webkit' + name] || window['moz' + name] || window['ms' + name];\r\n}\r\n\r\nvar lastTime = 0;\r\n\r\n// fallback for IE 7-8\r\nfunction timeoutDefer(fn) {\r\n\tvar time = +new Date(),\r\n\t    timeToCall = Math.max(0, 16 - (time - lastTime));\r\n\r\n\tlastTime = time + timeToCall;\r\n\treturn window.setTimeout(fn, timeToCall);\r\n}\r\n\r\nexport var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer;\r\nexport var cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') ||\r\n\t\tgetPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); };\r\n\r\n// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number\r\n// Schedules `fn` to be executed when the browser repaints. `fn` is bound to\r\n// `context` if given. When `immediate` is set, `fn` is called immediately if\r\n// the browser doesn't have native support for\r\n// [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame),\r\n// otherwise it's delayed. Returns a request ID that can be used to cancel the request.\r\nexport function requestAnimFrame(fn, context, immediate) {\r\n\tif (immediate && requestFn === timeoutDefer) {\r\n\t\tfn.call(context);\r\n\t} else {\r\n\t\treturn requestFn.call(window, bind(fn, context));\r\n\t}\r\n}\r\n\r\n// @function cancelAnimFrame(id: Number): undefined\r\n// Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame).\r\nexport function cancelAnimFrame(id) {\r\n\tif (id) {\r\n\t\tcancelFn.call(window, id);\r\n\t}\r\n}\r\n", "import * as Util from './Util';\r\n\r\n// @class Class\r\n// @aka L.Class\r\n\r\n// @section\r\n// @uninheritable\r\n\r\n// Thanks to John Resig and Dean Edwards for inspiration!\r\n\r\nexport function Class() {}\r\n\r\nClass.extend = function (props) {\r\n\r\n\t// @function extend(props: Object): Function\r\n\t// [Extends the current class](#class-inheritance) given the properties to be included.\r\n\t// Returns a Javascript function that is a class constructor (to be called with `new`).\r\n\tvar NewClass = function () {\r\n\r\n\t\tUtil.setOptions(this);\r\n\r\n\t\t// call the constructor\r\n\t\tif (this.initialize) {\r\n\t\t\tthis.initialize.apply(this, arguments);\r\n\t\t}\r\n\r\n\t\t// call all constructor hooks\r\n\t\tthis.callInitHooks();\r\n\t};\r\n\r\n\tvar parentProto = NewClass.__super__ = this.prototype;\r\n\r\n\tvar proto = Util.create(parentProto);\r\n\tproto.constructor = NewClass;\r\n\r\n\tNewClass.prototype = proto;\r\n\r\n\t// inherit parent's statics\r\n\tfor (var i in this) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(this, i) && i !== 'prototype' && i !== '__super__') {\r\n\t\t\tNewClass[i] = this[i];\r\n\t\t}\r\n\t}\r\n\r\n\t// mix static properties into the class\r\n\tif (props.statics) {\r\n\t\tUtil.extend(NewClass, props.statics);\r\n\t}\r\n\r\n\t// mix includes into the prototype\r\n\tif (props.includes) {\r\n\t\tcheckDeprecatedMixinEvents(props.includes);\r\n\t\tUtil.extend.apply(null, [proto].concat(props.includes));\r\n\t}\r\n\r\n\t// mix given properties into the prototype\r\n\tUtil.extend(proto, props);\r\n\tdelete proto.statics;\r\n\tdelete proto.includes;\r\n\r\n\t// merge options\r\n\tif (proto.options) {\r\n\t\tproto.options = parentProto.options ? Util.create(parentProto.options) : {};\r\n\t\tUtil.extend(proto.options, props.options);\r\n\t}\r\n\r\n\tproto._initHooks = [];\r\n\r\n\t// add method for calling all hooks\r\n\tproto.callInitHooks = function () {\r\n\r\n\t\tif (this._initHooksCalled) { return; }\r\n\r\n\t\tif (parentProto.callInitHooks) {\r\n\t\t\tparentProto.callInitHooks.call(this);\r\n\t\t}\r\n\r\n\t\tthis._initHooksCalled = true;\r\n\r\n\t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\r\n\t\t\tproto._initHooks[i].call(this);\r\n\t\t}\r\n\t};\r\n\r\n\treturn NewClass;\r\n};\r\n\r\n\r\n// @function include(properties: Object): this\r\n// [Includes a mixin](#class-includes) into the current class.\r\nClass.include = function (props) {\r\n\tvar parentOptions = this.prototype.options;\r\n\tUtil.extend(this.prototype, props);\r\n\tif (props.options) {\r\n\t\tthis.prototype.options = parentOptions;\r\n\t\tthis.mergeOptions(props.options);\r\n\t}\r\n\treturn this;\r\n};\r\n\r\n// @function mergeOptions(options: Object): this\r\n// [Merges `options`](#class-options) into the defaults of the class.\r\nClass.mergeOptions = function (options) {\r\n\tUtil.extend(this.prototype.options, options);\r\n\treturn this;\r\n};\r\n\r\n// @function addInitHook(fn: Function): this\r\n// Adds a [constructor hook](#class-constructor-hooks) to the class.\r\nClass.addInitHook = function (fn) { // (Function) || (String, args...)\r\n\tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\tvar init = typeof fn === 'function' ? fn : function () {\r\n\t\tthis[fn].apply(this, args);\r\n\t};\r\n\r\n\tthis.prototype._initHooks = this.prototype._initHooks || [];\r\n\tthis.prototype._initHooks.push(init);\r\n\treturn this;\r\n};\r\n\r\nfunction checkDeprecatedMixinEvents(includes) {\r\n\t/* global L: true */\r\n\tif (typeof L === 'undefined' || !L || !L.Mixin) { return; }\r\n\r\n\tincludes = Util.isArray(includes) ? includes : [includes];\r\n\r\n\tfor (var i = 0; i < includes.length; i++) {\r\n\t\tif (includes[i] === L.Mixin.Events) {\r\n\t\t\tconsole.warn('Deprecated include of L.Mixin.Events: ' +\r\n\t\t\t\t'this property will be removed in future releases, ' +\r\n\t\t\t\t'please inherit from L.Evented instead.', new Error().stack);\r\n\t\t}\r\n\t}\r\n}\r\n", "import {Class} from './Class';\r\nimport * as Util from './Util';\r\n\r\n/*\r\n * @class Evented\r\n * @aka L.Evented\r\n * @inherits Class\r\n *\r\n * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event).\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * map.on('click', function(e) {\r\n * \talert(e.latlng);\r\n * } );\r\n * ```\r\n *\r\n * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:\r\n *\r\n * ```js\r\n * function onClick(e) { ... }\r\n *\r\n * map.on('click', onClick);\r\n * map.off('click', onClick);\r\n * ```\r\n */\r\n\r\nexport var Events = {\r\n\t/* @method on(type: String, fn: Function, context?: Object): this\r\n\t * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`).\r\n\t *\r\n\t * @alternative\r\n\t * @method on(eventMap: Object): this\r\n\t * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\t */\r\n\ton: function (types, fn, context) {\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\t// we don't process space-separated events here for performance;\r\n\t\t\t\t// it's a hot path since Layer uses the on(obj) syntax\r\n\t\t\t\tthis._on(type, types[type], fn);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\t// types can be a string of space-separated words\r\n\t\t\ttypes = Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._on(types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/* @method off(type: String, fn?: Function, context?: Object): this\r\n\t * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener.\r\n\t *\r\n\t * @alternative\r\n\t * @method off(eventMap: Object): this\r\n\t * Removes a set of type/listener pairs.\r\n\t *\r\n\t * @alternative\r\n\t * @method off: this\r\n\t * Removes all listeners to all events on the object. This includes implicitly attached events.\r\n\t */\r\n\toff: function (types, fn, context) {\r\n\r\n\t\tif (!arguments.length) {\r\n\t\t\t// clear all listeners if called without arguments\r\n\t\t\tdelete this._events;\r\n\r\n\t\t} else if (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\tthis._off(type, types[type], fn);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\ttypes = Util.splitWords(types);\r\n\r\n\t\t\tvar removeAll = arguments.length === 1;\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tif (removeAll) {\r\n\t\t\t\t\tthis._off(types[i]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._off(types[i], fn, context);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// attach listener (without syntactic sugar now)\r\n\t_on: function (type, fn, context, _once) {\r\n\t\tif (typeof fn !== 'function') {\r\n\t\t\tconsole.warn('wrong listener type: ' + typeof fn);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// check if fn already there\r\n\t\tif (this._listens(type, fn, context) !== false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (context === this) {\r\n\t\t\t// Less memory footprint.\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\r\n\t\tvar newListener = {fn: fn, ctx: context};\r\n\t\tif (_once) {\r\n\t\t\tnewListener.once = true;\r\n\t\t}\r\n\r\n\t\tthis._events = this._events || {};\r\n\t\tthis._events[type] = this._events[type] || [];\r\n\t\tthis._events[type].push(newListener);\r\n\t},\r\n\r\n\t_off: function (type, fn, context) {\r\n\t\tvar listeners,\r\n\t\t    i,\r\n\t\t    len;\r\n\r\n\t\tif (!this._events) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlisteners = this._events[type];\r\n\t\tif (!listeners) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (arguments.length === 1) { // remove all\r\n\t\t\tif (this._firingCount) {\r\n\t\t\t\t// Set all removed listeners to noop\r\n\t\t\t\t// so they are not called if remove happens in fire\r\n\t\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tlisteners[i].fn = Util.falseFn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// clear all listeners for a type if function isn't specified\r\n\t\t\tdelete this._events[type];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof fn !== 'function') {\r\n\t\t\tconsole.warn('wrong listener type: ' + typeof fn);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// find fn and remove it\r\n\t\tvar index = this._listens(type, fn, context);\r\n\t\tif (index !== false) {\r\n\t\t\tvar listener = listeners[index];\r\n\t\t\tif (this._firingCount) {\r\n\t\t\t\t// set the removed listener to noop so that's not called if remove happens in fire\r\n\t\t\t\tlistener.fn = Util.falseFn;\r\n\r\n\t\t\t\t/* copy array in case events are being fired */\r\n\t\t\t\tthis._events[type] = listeners = listeners.slice();\r\n\t\t\t}\r\n\t\t\tlisteners.splice(index, 1);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method fire(type: String, data?: Object, propagate?: Boolean): this\r\n\t// Fires an event of the specified type. You can optionally provide a data\r\n\t// object — the first argument of the listener function will contain its\r\n\t// properties. The event can optionally be propagated to event parents.\r\n\tfire: function (type, data, propagate) {\r\n\t\tif (!this.listens(type, propagate)) { return this; }\r\n\r\n\t\tvar event = Util.extend({}, data, {\r\n\t\t\ttype: type,\r\n\t\t\ttarget: this,\r\n\t\t\tsourceTarget: data && data.sourceTarget || this\r\n\t\t});\r\n\r\n\t\tif (this._events) {\r\n\t\t\tvar listeners = this._events[type];\r\n\t\t\tif (listeners) {\r\n\t\t\t\tthis._firingCount = (this._firingCount + 1) || 1;\r\n\t\t\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tvar l = listeners[i];\r\n\t\t\t\t\t// off overwrites l.fn, so we need to copy fn to a var\r\n\t\t\t\t\tvar fn = l.fn;\r\n\t\t\t\t\tif (l.once) {\r\n\t\t\t\t\t\tthis.off(type, fn, l.ctx);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfn.call(l.ctx || this, event);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._firingCount--;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (propagate) {\r\n\t\t\t// propagate the event to parents (set with addEventParent)\r\n\t\t\tthis._propagateEvent(event);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method listens(type: String, propagate?: Boolean): Boolean\r\n\t// @method listens(type: String, fn: Function, context?: Object, propagate?: Boolean): Boolean\r\n\t// Returns `true` if a particular event type has any listeners attached to it.\r\n\t// The verification can optionally be propagated, it will return `true` if parents have the listener attached to it.\r\n\tlistens: function (type, fn, context, propagate) {\r\n\t\tif (typeof type !== 'string') {\r\n\t\t\tconsole.warn('\"string\" type argument expected');\r\n\t\t}\r\n\r\n\t\t// we don't overwrite the input `fn` value, because we need to use it for propagation\r\n\t\tvar _fn = fn;\r\n\t\tif (typeof fn !== 'function') {\r\n\t\t\tpropagate = !!fn;\r\n\t\t\t_fn = undefined;\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\r\n\t\tvar listeners = this._events && this._events[type];\r\n\t\tif (listeners && listeners.length) {\r\n\t\t\tif (this._listens(type, _fn, context) !== false) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (propagate) {\r\n\t\t\t// also check parents for listeners if event propagates\r\n\t\t\tfor (var id in this._eventParents) {\r\n\t\t\t\tif (this._eventParents[id].listens(type, fn, context, propagate)) { return true; }\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t// returns the index (number) or false\r\n\t_listens: function (type, fn, context) {\r\n\t\tif (!this._events) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar listeners = this._events[type] || [];\r\n\t\tif (!fn) {\r\n\t\t\treturn !!listeners.length;\r\n\t\t}\r\n\r\n\t\tif (context === this) {\r\n\t\t\t// Less memory footprint.\r\n\t\t\tcontext = undefined;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\tif (listeners[i].fn === fn && listeners[i].ctx === context) {\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\t// @method once(…): this\r\n\t// Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed.\r\n\tonce: function (types, fn, context) {\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (typeof types === 'object') {\r\n\t\t\tfor (var type in types) {\r\n\t\t\t\t// we don't process space-separated events here for performance;\r\n\t\t\t\t// it's a hot path since Layer uses the on(obj) syntax\r\n\t\t\t\tthis._on(type, types[type], fn, true);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\t// types can be a string of space-separated words\r\n\t\t\ttypes = Util.splitWords(types);\r\n\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tthis._on(types[i], fn, context, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method addEventParent(obj: Evented): this\r\n\t// Adds an event parent - an `Evented` that will receive propagated events\r\n\taddEventParent: function (obj) {\r\n\t\tthis._eventParents = this._eventParents || {};\r\n\t\tthis._eventParents[Util.stamp(obj)] = obj;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeEventParent(obj: Evented): this\r\n\t// Removes an event parent, so it will stop receiving propagated events\r\n\tremoveEventParent: function (obj) {\r\n\t\tif (this._eventParents) {\r\n\t\t\tdelete this._eventParents[Util.stamp(obj)];\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_propagateEvent: function (e) {\r\n\t\tfor (var id in this._eventParents) {\r\n\t\t\tthis._eventParents[id].fire(e.type, Util.extend({\r\n\t\t\t\tlayer: e.target,\r\n\t\t\t\tpropagatedFrom: e.target\r\n\t\t\t}, e), true);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// aliases; we should ditch those eventually\r\n\r\n// @method addEventListener(…): this\r\n// Alias to [`on(…)`](#evented-on)\r\nEvents.addEventListener = Events.on;\r\n\r\n// @method removeEventListener(…): this\r\n// Alias to [`off(…)`](#evented-off)\r\n\r\n// @method clearAllEventListeners(…): this\r\n// Alias to [`off()`](#evented-off)\r\nEvents.removeEventListener = Events.clearAllEventListeners = Events.off;\r\n\r\n// @method addOneTimeEventListener(…): this\r\n// Alias to [`once(…)`](#evented-once)\r\nEvents.addOneTimeEventListener = Events.once;\r\n\r\n// @method fireEvent(…): this\r\n// Alias to [`fire(…)`](#evented-fire)\r\nEvents.fireEvent = Events.fire;\r\n\r\n// @method hasEventListeners(…): Boolean\r\n// Alias to [`listens(…)`](#evented-listens)\r\nEvents.hasEventListeners = Events.listens;\r\n\r\nexport var Evented = Class.extend(Events);\r\n", "import {isArray, formatNum} from '../core/Util';\r\n\r\n/*\r\n * @class Point\r\n * @aka L.Point\r\n *\r\n * Represents a point with `x` and `y` coordinates in pixels.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var point = L.point(200, 300);\r\n * ```\r\n *\r\n * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:\r\n *\r\n * ```js\r\n * map.panBy([200, 300]);\r\n * map.panBy(L.point(200, 300));\r\n * ```\r\n *\r\n * Note that `Point` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\nexport function Point(x, y, round) {\r\n\t// @property x: Number; The `x` coordinate of the point\r\n\tthis.x = (round ? Math.round(x) : x);\r\n\t// @property y: Number; The `y` coordinate of the point\r\n\tthis.y = (round ? Math.round(y) : y);\r\n}\r\n\r\nvar trunc = Math.trunc || function (v) {\r\n\treturn v > 0 ? Math.floor(v) : Math.ceil(v);\r\n};\r\n\r\nPoint.prototype = {\r\n\r\n\t// @method clone(): Point\r\n\t// Returns a copy of the current point.\r\n\tclone: function () {\r\n\t\treturn new Point(this.x, this.y);\r\n\t},\r\n\r\n\t// @method add(otherPoint: Point): Point\r\n\t// Returns the result of addition of the current and the given points.\r\n\tadd: function (point) {\r\n\t\t// non-destructive, returns a new point\r\n\t\treturn this.clone()._add(toPoint(point));\r\n\t},\r\n\r\n\t_add: function (point) {\r\n\t\t// destructive, used directly for performance in situations where it's safe to modify existing point\r\n\t\tthis.x += point.x;\r\n\t\tthis.y += point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method subtract(otherPoint: Point): Point\r\n\t// Returns the result of subtraction of the given point from the current.\r\n\tsubtract: function (point) {\r\n\t\treturn this.clone()._subtract(toPoint(point));\r\n\t},\r\n\r\n\t_subtract: function (point) {\r\n\t\tthis.x -= point.x;\r\n\t\tthis.y -= point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method divideBy(num: Number): Point\r\n\t// Returns the result of division of the current point by the given number.\r\n\tdivideBy: function (num) {\r\n\t\treturn this.clone()._divideBy(num);\r\n\t},\r\n\r\n\t_divideBy: function (num) {\r\n\t\tthis.x /= num;\r\n\t\tthis.y /= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method multiplyBy(num: Number): Point\r\n\t// Returns the result of multiplication of the current point by the given number.\r\n\tmultiplyBy: function (num) {\r\n\t\treturn this.clone()._multiplyBy(num);\r\n\t},\r\n\r\n\t_multiplyBy: function (num) {\r\n\t\tthis.x *= num;\r\n\t\tthis.y *= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method scaleBy(scale: Point): Point\r\n\t// Multiply each coordinate of the current point by each coordinate of\r\n\t// `scale`. In linear algebra terms, multiply the point by the\r\n\t// [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation)\r\n\t// defined by `scale`.\r\n\tscaleBy: function (point) {\r\n\t\treturn new Point(this.x * point.x, this.y * point.y);\r\n\t},\r\n\r\n\t// @method unscaleBy(scale: Point): Point\r\n\t// Inverse of `scaleBy`. Divide each coordinate of the current point by\r\n\t// each coordinate of `scale`.\r\n\tunscaleBy: function (point) {\r\n\t\treturn new Point(this.x / point.x, this.y / point.y);\r\n\t},\r\n\r\n\t// @method round(): Point\r\n\t// Returns a copy of the current point with rounded coordinates.\r\n\tround: function () {\r\n\t\treturn this.clone()._round();\r\n\t},\r\n\r\n\t_round: function () {\r\n\t\tthis.x = Math.round(this.x);\r\n\t\tthis.y = Math.round(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method floor(): Point\r\n\t// Returns a copy of the current point with floored coordinates (rounded down).\r\n\tfloor: function () {\r\n\t\treturn this.clone()._floor();\r\n\t},\r\n\r\n\t_floor: function () {\r\n\t\tthis.x = Math.floor(this.x);\r\n\t\tthis.y = Math.floor(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method ceil(): Point\r\n\t// Returns a copy of the current point with ceiled coordinates (rounded up).\r\n\tceil: function () {\r\n\t\treturn this.clone()._ceil();\r\n\t},\r\n\r\n\t_ceil: function () {\r\n\t\tthis.x = Math.ceil(this.x);\r\n\t\tthis.y = Math.ceil(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method trunc(): Point\r\n\t// Returns a copy of the current point with truncated coordinates (rounded towards zero).\r\n\ttrunc: function () {\r\n\t\treturn this.clone()._trunc();\r\n\t},\r\n\r\n\t_trunc: function () {\r\n\t\tthis.x = trunc(this.x);\r\n\t\tthis.y = trunc(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method distanceTo(otherPoint: Point): Number\r\n\t// Returns the cartesian distance between the current and the given points.\r\n\tdistanceTo: function (point) {\r\n\t\tpoint = toPoint(point);\r\n\r\n\t\tvar x = point.x - this.x,\r\n\t\t    y = point.y - this.y;\r\n\r\n\t\treturn Math.sqrt(x * x + y * y);\r\n\t},\r\n\r\n\t// @method equals(otherPoint: Point): Boolean\r\n\t// Returns `true` if the given point has the same coordinates.\r\n\tequals: function (point) {\r\n\t\tpoint = toPoint(point);\r\n\r\n\t\treturn point.x === this.x &&\r\n\t\t       point.y === this.y;\r\n\t},\r\n\r\n\t// @method contains(otherPoint: Point): Boolean\r\n\t// Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values).\r\n\tcontains: function (point) {\r\n\t\tpoint = toPoint(point);\r\n\r\n\t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\r\n\t\t       Math.abs(point.y) <= Math.abs(this.y);\r\n\t},\r\n\r\n\t// @method toString(): String\r\n\t// Returns a string representation of the point for debugging purposes.\r\n\ttoString: function () {\r\n\t\treturn 'Point(' +\r\n\t\t        formatNum(this.x) + ', ' +\r\n\t\t        formatNum(this.y) + ')';\r\n\t}\r\n};\r\n\r\n// @factory L.point(x: Number, y: Number, round?: Boolean)\r\n// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values.\r\n\r\n// @alternative\r\n// @factory L.point(coords: Number[])\r\n// Expects an array of the form `[x, y]` instead.\r\n\r\n// @alternative\r\n// @factory L.point(coords: Object)\r\n// Expects a plain object of the form `{x: Number, y: Number}` instead.\r\nexport function toPoint(x, y, round) {\r\n\tif (x instanceof Point) {\r\n\t\treturn x;\r\n\t}\r\n\tif (isArray(x)) {\r\n\t\treturn new Point(x[0], x[1]);\r\n\t}\r\n\tif (x === undefined || x === null) {\r\n\t\treturn x;\r\n\t}\r\n\tif (typeof x === 'object' && 'x' in x && 'y' in x) {\r\n\t\treturn new Point(x.x, x.y);\r\n\t}\r\n\treturn new Point(x, y, round);\r\n}\r\n", "import {Point, toPoint} from './Point';\r\n\r\n/*\r\n * @class Bounds\r\n * @aka L.Bounds\r\n *\r\n * Represents a rectangular area in pixel coordinates.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var p1 = L.point(10, 10),\r\n * p2 = L.point(40, 60),\r\n * bounds = L.bounds(p1, p2);\r\n * ```\r\n *\r\n * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:\r\n *\r\n * ```js\r\n * otherBounds.intersects([[10, 10], [40, 60]]);\r\n * ```\r\n *\r\n * Note that `Bounds` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\nexport function Bounds(a, b) {\r\n\tif (!a) { return; }\r\n\r\n\tvar points = b ? [a, b] : a;\r\n\r\n\tfor (var i = 0, len = points.length; i < len; i++) {\r\n\t\tthis.extend(points[i]);\r\n\t}\r\n}\r\n\r\nBounds.prototype = {\r\n\t// @method extend(point: Point): this\r\n\t// Extends the bounds to contain the given point.\r\n\r\n\t// @alternative\r\n\t// @method extend(otherBounds: Bounds): this\r\n\t// Extend the bounds to contain the given bounds\r\n\textend: function (obj) {\r\n\t\tvar min2, max2;\r\n\t\tif (!obj) { return this; }\r\n\r\n\t\tif (obj instanceof Point || typeof obj[0] === 'number' || 'x' in obj) {\r\n\t\t\tmin2 = max2 = toPoint(obj);\r\n\t\t} else {\r\n\t\t\tobj = toBounds(obj);\r\n\t\t\tmin2 = obj.min;\r\n\t\t\tmax2 = obj.max;\r\n\r\n\t\t\tif (!min2 || !max2) { return this; }\r\n\t\t}\r\n\r\n\t\t// @property min: Point\r\n\t\t// The top left corner of the rectangle.\r\n\t\t// @property max: Point\r\n\t\t// The bottom right corner of the rectangle.\r\n\t\tif (!this.min && !this.max) {\r\n\t\t\tthis.min = min2.clone();\r\n\t\t\tthis.max = max2.clone();\r\n\t\t} else {\r\n\t\t\tthis.min.x = Math.min(min2.x, this.min.x);\r\n\t\t\tthis.max.x = Math.max(max2.x, this.max.x);\r\n\t\t\tthis.min.y = Math.min(min2.y, this.min.y);\r\n\t\t\tthis.max.y = Math.max(max2.y, this.max.y);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getCenter(round?: Boolean): Point\r\n\t// Returns the center point of the bounds.\r\n\tgetCenter: function (round) {\r\n\t\treturn toPoint(\r\n\t\t        (this.min.x + this.max.x) / 2,\r\n\t\t        (this.min.y + this.max.y) / 2, round);\r\n\t},\r\n\r\n\t// @method getBottomLeft(): Point\r\n\t// Returns the bottom-left point of the bounds.\r\n\tgetBottomLeft: function () {\r\n\t\treturn toPoint(this.min.x, this.max.y);\r\n\t},\r\n\r\n\t// @method getTopRight(): Point\r\n\t// Returns the top-right point of the bounds.\r\n\tgetTopRight: function () { // -> Point\r\n\t\treturn toPoint(this.max.x, this.min.y);\r\n\t},\r\n\r\n\t// @method getTopLeft(): Point\r\n\t// Returns the top-left point of the bounds (i.e. [`this.min`](#bounds-min)).\r\n\tgetTopLeft: function () {\r\n\t\treturn this.min; // left, top\r\n\t},\r\n\r\n\t// @method getBottomRight(): Point\r\n\t// Returns the bottom-right point of the bounds (i.e. [`this.max`](#bounds-max)).\r\n\tgetBottomRight: function () {\r\n\t\treturn this.max; // right, bottom\r\n\t},\r\n\r\n\t// @method getSize(): Point\r\n\t// Returns the size of the given bounds\r\n\tgetSize: function () {\r\n\t\treturn this.max.subtract(this.min);\r\n\t},\r\n\r\n\t// @method contains(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle contains the given one.\r\n\t// @alternative\r\n\t// @method contains(point: Point): Boolean\r\n\t// Returns `true` if the rectangle contains the given point.\r\n\tcontains: function (obj) {\r\n\t\tvar min, max;\r\n\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof Point) {\r\n\t\t\tobj = toPoint(obj);\r\n\t\t} else {\r\n\t\t\tobj = toBounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof Bounds) {\r\n\t\t\tmin = obj.min;\r\n\t\t\tmax = obj.max;\r\n\t\t} else {\r\n\t\t\tmin = max = obj;\r\n\t\t}\r\n\r\n\t\treturn (min.x >= this.min.x) &&\r\n\t\t       (max.x <= this.max.x) &&\r\n\t\t       (min.y >= this.min.y) &&\r\n\t\t       (max.y <= this.max.y);\r\n\t},\r\n\r\n\t// @method intersects(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle intersects the given bounds. Two bounds\r\n\t// intersect if they have at least one point in common.\r\n\tintersects: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = toBounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t    max = this.max,\r\n\t\t    min2 = bounds.min,\r\n\t\t    max2 = bounds.max,\r\n\t\t    xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\r\n\t\t    yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\r\n\r\n\t\treturn xIntersects && yIntersects;\r\n\t},\r\n\r\n\t// @method overlaps(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle overlaps the given bounds. Two bounds\r\n\t// overlap if their intersection is an area.\r\n\toverlaps: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = toBounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t    max = this.max,\r\n\t\t    min2 = bounds.min,\r\n\t\t    max2 = bounds.max,\r\n\t\t    xOverlaps = (max2.x > min.x) && (min2.x < max.x),\r\n\t\t    yOverlaps = (max2.y > min.y) && (min2.y < max.y);\r\n\r\n\t\treturn xOverlaps && yOverlaps;\r\n\t},\r\n\r\n\t// @method isValid(): Boolean\r\n\t// Returns `true` if the bounds are properly initialized.\r\n\tisValid: function () {\r\n\t\treturn !!(this.min && this.max);\r\n\t},\r\n\r\n\r\n\t// @method pad(bufferRatio: Number): Bounds\r\n\t// Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.\r\n\t// For example, a ratio of 0.5 extends the bounds by 50% in each direction.\r\n\t// Negative values will retract the bounds.\r\n\tpad: function (bufferRatio) {\r\n\t\tvar min = this.min,\r\n\t\tmax = this.max,\r\n\t\theightBuffer = Math.abs(min.x - max.x) * bufferRatio,\r\n\t\twidthBuffer = Math.abs(min.y - max.y) * bufferRatio;\r\n\r\n\r\n\t\treturn toBounds(\r\n\t\t\ttoPoint(min.x - heightBuffer, min.y - widthBuffer),\r\n\t\t\ttoPoint(max.x + heightBuffer, max.y + widthBuffer));\r\n\t},\r\n\r\n\r\n\t// @method equals(otherBounds: Bounds): Boolean\r\n\t// Returns `true` if the rectangle is equivalent to the given bounds.\r\n\tequals: function (bounds) {\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = toBounds(bounds);\r\n\r\n\t\treturn this.min.equals(bounds.getTopLeft()) &&\r\n\t\t\tthis.max.equals(bounds.getBottomRight());\r\n\t},\r\n};\r\n\r\n\r\n// @factory L.bounds(corner1: Point, corner2: Point)\r\n// Creates a Bounds object from two corners coordinate pairs.\r\n// @alternative\r\n// @factory L.bounds(points: Point[])\r\n// Creates a Bounds object from the given array of points.\r\nexport function toBounds(a, b) {\r\n\tif (!a || a instanceof Bounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new Bounds(a, b);\r\n}\r\n", "import {LatLng, toLatLng} from './LatLng';\r\n\r\n/*\r\n * @class LatLngBounds\r\n * @aka L.LatLngBounds\r\n *\r\n * Represents a rectangular geographical area on a map.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var corner1 = L.latLng(40.712, -74.227),\r\n * corner2 = L.latLng(40.774, -74.125),\r\n * bounds = L.latLngBounds(corner1, corner2);\r\n * ```\r\n *\r\n * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:\r\n *\r\n * ```js\r\n * map.fitBounds([\r\n * \t[40.712, -74.227],\r\n * \t[40.774, -74.125]\r\n * ]);\r\n * ```\r\n *\r\n * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range.\r\n *\r\n * Note that `LatLngBounds` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\nexport function LatLngBounds(corner1, corner2) { // (LatLng, LatLng) or (LatLng[])\r\n\tif (!corner1) { return; }\r\n\r\n\tvar latlngs = corner2 ? [corner1, corner2] : corner1;\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\tthis.extend(latlngs[i]);\r\n\t}\r\n}\r\n\r\nLatLngBounds.prototype = {\r\n\r\n\t// @method extend(latlng: LatLng): this\r\n\t// Extend the bounds to contain the given point\r\n\r\n\t// @alternative\r\n\t// @method extend(otherBounds: LatLngBounds): this\r\n\t// Extend the bounds to contain the given bounds\r\n\textend: function (obj) {\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2, ne2;\r\n\r\n\t\tif (obj instanceof LatLng) {\r\n\t\t\tsw2 = obj;\r\n\t\t\tne2 = obj;\r\n\r\n\t\t} else if (obj instanceof LatLngBounds) {\r\n\t\t\tsw2 = obj._southWest;\r\n\t\t\tne2 = obj._northEast;\r\n\r\n\t\t\tif (!sw2 || !ne2) { return this; }\r\n\r\n\t\t} else {\r\n\t\t\treturn obj ? this.extend(toLatLng(obj) || toLatLngBounds(obj)) : this;\r\n\t\t}\r\n\r\n\t\tif (!sw && !ne) {\r\n\t\t\tthis._southWest = new LatLng(sw2.lat, sw2.lng);\r\n\t\t\tthis._northEast = new LatLng(ne2.lat, ne2.lng);\r\n\t\t} else {\r\n\t\t\tsw.lat = Math.min(sw2.lat, sw.lat);\r\n\t\t\tsw.lng = Math.min(sw2.lng, sw.lng);\r\n\t\t\tne.lat = Math.max(ne2.lat, ne.lat);\r\n\t\t\tne.lng = Math.max(ne2.lng, ne.lng);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method pad(bufferRatio: Number): LatLngBounds\r\n\t// Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.\r\n\t// For example, a ratio of 0.5 extends the bounds by 50% in each direction.\r\n\t// Negative values will retract the bounds.\r\n\tpad: function (bufferRatio) {\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\r\n\t\t    widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\r\n\r\n\t\treturn new LatLngBounds(\r\n\t\t        new LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\r\n\t\t        new LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\r\n\t},\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the center point of the bounds.\r\n\tgetCenter: function () {\r\n\t\treturn new LatLng(\r\n\t\t        (this._southWest.lat + this._northEast.lat) / 2,\r\n\t\t        (this._southWest.lng + this._northEast.lng) / 2);\r\n\t},\r\n\r\n\t// @method getSouthWest(): LatLng\r\n\t// Returns the south-west point of the bounds.\r\n\tgetSouthWest: function () {\r\n\t\treturn this._southWest;\r\n\t},\r\n\r\n\t// @method getNorthEast(): LatLng\r\n\t// Returns the north-east point of the bounds.\r\n\tgetNorthEast: function () {\r\n\t\treturn this._northEast;\r\n\t},\r\n\r\n\t// @method getNorthWest(): LatLng\r\n\t// Returns the north-west point of the bounds.\r\n\tgetNorthWest: function () {\r\n\t\treturn new LatLng(this.getNorth(), this.getWest());\r\n\t},\r\n\r\n\t// @method getSouthEast(): LatLng\r\n\t// Returns the south-east point of the bounds.\r\n\tgetSouthEast: function () {\r\n\t\treturn new LatLng(this.getSouth(), this.getEast());\r\n\t},\r\n\r\n\t// @method getWest(): Number\r\n\t// Returns the west longitude of the bounds\r\n\tgetWest: function () {\r\n\t\treturn this._southWest.lng;\r\n\t},\r\n\r\n\t// @method getSouth(): Number\r\n\t// Returns the south latitude of the bounds\r\n\tgetSouth: function () {\r\n\t\treturn this._southWest.lat;\r\n\t},\r\n\r\n\t// @method getEast(): Number\r\n\t// Returns the east longitude of the bounds\r\n\tgetEast: function () {\r\n\t\treturn this._northEast.lng;\r\n\t},\r\n\r\n\t// @method getNorth(): Number\r\n\t// Returns the north latitude of the bounds\r\n\tgetNorth: function () {\r\n\t\treturn this._northEast.lat;\r\n\t},\r\n\r\n\t// @method contains(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle contains the given one.\r\n\r\n\t// @alternative\r\n\t// @method contains (latlng: LatLng): Boolean\r\n\t// Returns `true` if the rectangle contains the given point.\r\n\tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof LatLng || 'lat' in obj) {\r\n\t\t\tobj = toLatLng(obj);\r\n\t\t} else {\r\n\t\t\tobj = toLatLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2, ne2;\r\n\r\n\t\tif (obj instanceof LatLngBounds) {\r\n\t\t\tsw2 = obj.getSouthWest();\r\n\t\t\tne2 = obj.getNorthEast();\r\n\t\t} else {\r\n\t\t\tsw2 = ne2 = obj;\r\n\t\t}\r\n\r\n\t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\r\n\t\t       (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\r\n\t},\r\n\r\n\t// @method intersects(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common.\r\n\tintersects: function (bounds) {\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2 = bounds.getSouthWest(),\r\n\t\t    ne2 = bounds.getNorthEast(),\r\n\r\n\t\t    latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\r\n\t\t    lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\r\n\r\n\t\treturn latIntersects && lngIntersects;\r\n\t},\r\n\r\n\t// @method overlaps(otherBounds: LatLngBounds): Boolean\r\n\t// Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area.\r\n\toverlaps: function (bounds) {\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2 = bounds.getSouthWest(),\r\n\t\t    ne2 = bounds.getNorthEast(),\r\n\r\n\t\t    latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat),\r\n\t\t    lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng);\r\n\r\n\t\treturn latOverlaps && lngOverlaps;\r\n\t},\r\n\r\n\t// @method toBBoxString(): String\r\n\t// Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.\r\n\ttoBBoxString: function () {\r\n\t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\r\n\t},\r\n\r\n\t// @method equals(otherBounds: LatLngBounds, maxMargin?: Number): Boolean\r\n\t// Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting `maxMargin` to a small number.\r\n\tequals: function (bounds, maxMargin) {\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\r\n\t\treturn this._southWest.equals(bounds.getSouthWest(), maxMargin) &&\r\n\t\t       this._northEast.equals(bounds.getNorthEast(), maxMargin);\r\n\t},\r\n\r\n\t// @method isValid(): Boolean\r\n\t// Returns `true` if the bounds are properly initialized.\r\n\tisValid: function () {\r\n\t\treturn !!(this._southWest && this._northEast);\r\n\t}\r\n};\r\n\r\n// TODO International date line?\r\n\r\n// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng)\r\n// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle.\r\n\r\n// @alternative\r\n// @factory L.latLngBounds(latlngs: LatLng[])\r\n// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds).\r\nexport function toLatLngBounds(a, b) {\r\n\tif (a instanceof LatLngBounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new LatLngBounds(a, b);\r\n}\r\n", "import * as Util from '../core/Util';\r\nimport {Earth} from './crs/CRS.Earth';\r\nimport {toLatLngBounds} from './LatLngBounds';\r\n\r\n/* @class LatLng\r\n * @aka L.LatLng\r\n *\r\n * Represents a geographical point with a certain latitude and longitude.\r\n *\r\n * @example\r\n *\r\n * ```\r\n * var latlng = L.latLng(50.5, 30.5);\r\n * ```\r\n *\r\n * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:\r\n *\r\n * ```\r\n * map.panTo([50, 30]);\r\n * map.panTo({lon: 30, lat: 50});\r\n * map.panTo({lat: 50, lng: 30});\r\n * map.panTo(L.latLng(50, 30));\r\n * ```\r\n *\r\n * Note that `LatLng` does not inherit from Leaflet's `Class` object,\r\n * which means new classes can't inherit from it, and new methods\r\n * can't be added to it with the `include` function.\r\n */\r\n\r\nexport function LatLng(lat, lng, alt) {\r\n\tif (isNaN(lat) || isNaN(lng)) {\r\n\t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\r\n\t}\r\n\r\n\t// @property lat: Number\r\n\t// Latitude in degrees\r\n\tthis.lat = +lat;\r\n\r\n\t// @property lng: Number\r\n\t// Longitude in degrees\r\n\tthis.lng = +lng;\r\n\r\n\t// @property alt: Number\r\n\t// Altitude in meters (optional)\r\n\tif (alt !== undefined) {\r\n\t\tthis.alt = +alt;\r\n\t}\r\n}\r\n\r\nLatLng.prototype = {\r\n\t// @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean\r\n\t// Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overridden by setting `maxMargin` to a small number.\r\n\tequals: function (obj, maxMargin) {\r\n\t\tif (!obj) { return false; }\r\n\r\n\t\tobj = toLatLng(obj);\r\n\r\n\t\tvar margin = Math.max(\r\n\t\t        Math.abs(this.lat - obj.lat),\r\n\t\t        Math.abs(this.lng - obj.lng));\r\n\r\n\t\treturn margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin);\r\n\t},\r\n\r\n\t// @method toString(): String\r\n\t// Returns a string representation of the point (for debugging purposes).\r\n\ttoString: function (precision) {\r\n\t\treturn 'LatLng(' +\r\n\t\t        Util.formatNum(this.lat, precision) + ', ' +\r\n\t\t        Util.formatNum(this.lng, precision) + ')';\r\n\t},\r\n\r\n\t// @method distanceTo(otherLatLng: LatLng): Number\r\n\t// Returns the distance (in meters) to the given `LatLng` calculated using the [Spherical Law of Cosines](https://en.wikipedia.org/wiki/Spherical_law_of_cosines).\r\n\tdistanceTo: function (other) {\r\n\t\treturn Earth.distance(this, toLatLng(other));\r\n\t},\r\n\r\n\t// @method wrap(): LatLng\r\n\t// Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees.\r\n\twrap: function () {\r\n\t\treturn Earth.wrapLatLng(this);\r\n\t},\r\n\r\n\t// @method toBounds(sizeInMeters: Number): LatLngBounds\r\n\t// Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`.\r\n\ttoBounds: function (sizeInMeters) {\r\n\t\tvar latAccuracy = 180 * sizeInMeters / 40075017,\r\n\t\t    lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);\r\n\r\n\t\treturn toLatLngBounds(\r\n\t\t        [this.lat - latAccuracy, this.lng - lngAccuracy],\r\n\t\t        [this.lat + latAccuracy, this.lng + lngAccuracy]);\r\n\t},\r\n\r\n\tclone: function () {\r\n\t\treturn new LatLng(this.lat, this.lng, this.alt);\r\n\t}\r\n};\r\n\r\n\r\n\r\n// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng\r\n// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).\r\n\r\n// @alternative\r\n// @factory L.latLng(coords: Array): LatLng\r\n// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead.\r\n\r\n// @alternative\r\n// @factory L.latLng(coords: Object): LatLng\r\n// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead.\r\n\r\nexport function toLatLng(a, b, c) {\r\n\tif (a instanceof LatLng) {\r\n\t\treturn a;\r\n\t}\r\n\tif (Util.isArray(a) && typeof a[0] !== 'object') {\r\n\t\tif (a.length === 3) {\r\n\t\t\treturn new LatLng(a[0], a[1], a[2]);\r\n\t\t}\r\n\t\tif (a.length === 2) {\r\n\t\t\treturn new LatLng(a[0], a[1]);\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\tif (a === undefined || a === null) {\r\n\t\treturn a;\r\n\t}\r\n\tif (typeof a === 'object' && 'lat' in a) {\r\n\t\treturn new LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\r\n\t}\r\n\tif (b === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\treturn new LatLng(a, b, c);\r\n}\r\n", "\r\nimport {Bounds} from '../../geometry/Bounds';\r\nimport {LatLng} from '../LatLng';\r\nimport {LatLngBounds} from '../LatLngBounds';\r\nimport * as Util from '../../core/Util';\r\n\r\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.Base\r\n * Object that defines coordinate reference systems for projecting\r\n * geographical points into pixel (screen) coordinates and back (and to\r\n * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See\r\n * [spatial reference system](https://en.wikipedia.org/wiki/Spatial_reference_system).\r\n *\r\n * Leaflet defines the most usual CRSs by default. If you want to use a\r\n * CRS not defined by default, take a look at the\r\n * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.\r\n *\r\n * Note that the CRS instances do not inherit from Leaflet's `Class` object,\r\n * and can't be instantiated. Also, new classes can't inherit from them,\r\n * and methods can't be added to them with the `include` function.\r\n */\r\n\r\nexport var CRS = {\r\n\t// @method latLngToPoint(latlng: LatLng, zoom: Number): Point\r\n\t// Projects geographical coordinates into pixel coordinates for a given zoom.\r\n\tlatLngToPoint: function (latlng, zoom) {\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t    scale = this.scale(zoom);\r\n\r\n\t\treturn this.transformation._transform(projectedPoint, scale);\r\n\t},\r\n\r\n\t// @method pointToLatLng(point: Point, zoom: Number): LatLng\r\n\t// The inverse of `latLngToPoint`. Projects pixel coordinates on a given\r\n\t// zoom into geographical coordinates.\r\n\tpointToLatLng: function (point, zoom) {\r\n\t\tvar scale = this.scale(zoom),\r\n\t\t    untransformedPoint = this.transformation.untransform(point, scale);\r\n\r\n\t\treturn this.projection.unproject(untransformedPoint);\r\n\t},\r\n\r\n\t// @method project(latlng: LatLng): Point\r\n\t// Projects geographical coordinates into coordinates in units accepted for\r\n\t// this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).\r\n\tproject: function (latlng) {\r\n\t\treturn this.projection.project(latlng);\r\n\t},\r\n\r\n\t// @method unproject(point: Point): LatLng\r\n\t// Given a projected coordinate returns the corresponding LatLng.\r\n\t// The inverse of `project`.\r\n\tunproject: function (point) {\r\n\t\treturn this.projection.unproject(point);\r\n\t},\r\n\r\n\t// @method scale(zoom: Number): Number\r\n\t// Returns the scale used when transforming projected coordinates into\r\n\t// pixel coordinates for a particular zoom. For example, it returns\r\n\t// `256 * 2^zoom` for Mercator-based CRS.\r\n\tscale: function (zoom) {\r\n\t\treturn 256 * Math.pow(2, zoom);\r\n\t},\r\n\r\n\t// @method zoom(scale: Number): Number\r\n\t// Inverse of `scale()`, returns the zoom level corresponding to a scale\r\n\t// factor of `scale`.\r\n\tzoom: function (scale) {\r\n\t\treturn Math.log(scale / 256) / Math.LN2;\r\n\t},\r\n\r\n\t// @method getProjectedBounds(zoom: Number): Bounds\r\n\t// Returns the projection's bounds scaled and transformed for the provided `zoom`.\r\n\tgetProjectedBounds: function (zoom) {\r\n\t\tif (this.infinite) { return null; }\r\n\r\n\t\tvar b = this.projection.bounds,\r\n\t\t    s = this.scale(zoom),\r\n\t\t    min = this.transformation.transform(b.min, s),\r\n\t\t    max = this.transformation.transform(b.max, s);\r\n\r\n\t\treturn new Bounds(min, max);\r\n\t},\r\n\r\n\t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n\t// Returns the distance between two geographical coordinates.\r\n\r\n\t// @property code: String\r\n\t// Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`)\r\n\t//\r\n\t// @property wrapLng: Number[]\r\n\t// An array of two numbers defining whether the longitude (horizontal) coordinate\r\n\t// axis wraps around a given range and how. Defaults to `[-180, 180]` in most\r\n\t// geographical CRSs. If `undefined`, the longitude axis does not wrap around.\r\n\t//\r\n\t// @property wrapLat: Number[]\r\n\t// Like `wrapLng`, but for the latitude (vertical) axis.\r\n\r\n\t// wrapLng: [min, max],\r\n\t// wrapLat: [min, max],\r\n\r\n\t// @property infinite: Boolean\r\n\t// If true, the coordinate space will be unbounded (infinite in both axes)\r\n\tinfinite: false,\r\n\r\n\t// @method wrapLatLng(latlng: LatLng): LatLng\r\n\t// Returns a `LatLng` where lat and lng has been wrapped according to the\r\n\t// CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds.\r\n\twrapLatLng: function (latlng) {\r\n\t\tvar lng = this.wrapLng ? Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng,\r\n\t\t    lat = this.wrapLat ? Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat,\r\n\t\t    alt = latlng.alt;\r\n\r\n\t\treturn new LatLng(lat, lng, alt);\r\n\t},\r\n\r\n\t// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds\r\n\t// Returns a `LatLngBounds` with the same size as the given one, ensuring\r\n\t// that its center is within the CRS's bounds.\r\n\t// Only accepts actual `L.LatLngBounds` instances, not arrays.\r\n\twrapLatLngBounds: function (bounds) {\r\n\t\tvar center = bounds.getCenter(),\r\n\t\t    newCenter = this.wrapLatLng(center),\r\n\t\t    latShift = center.lat - newCenter.lat,\r\n\t\t    lngShift = center.lng - newCenter.lng;\r\n\r\n\t\tif (latShift === 0 && lngShift === 0) {\r\n\t\t\treturn bounds;\r\n\t\t}\r\n\r\n\t\tvar sw = bounds.getSouthWest(),\r\n\t\t    ne = bounds.getNorthEast(),\r\n\t\t    newSw = new LatLng(sw.lat - latShift, sw.lng - lngShift),\r\n\t\t    newNe = new LatLng(ne.lat - latShift, ne.lng - lngShift);\r\n\r\n\t\treturn new LatLngBounds(newSw, newNe);\r\n\t}\r\n};\r\n", "import {CRS} from './CRS';\nimport * as Util from '../../core/Util';\n\n/*\n * @namespace CRS\n * @crs L.CRS.Earth\n *\n * Serves as the base for CRS that are global such that they cover the earth.\n * Can only be used as the base for other CRS and cannot be used directly,\n * since it does not have a `code`, `projection` or `transformation`. `distance()` returns\n * meters.\n */\n\nexport var Earth = Util.extend({}, CRS, {\n\twrapLng: [-180, 180],\n\n\t// Mean Earth Radius, as recommended for use by\n\t// the International Union of Geodesy and Geophysics,\n\t// see https://rosettacode.org/wiki/Haversine_formula\n\tR: 6371000,\n\n\t// distance between two geographical points using spherical law of cosines approximation\n\tdistance: function (latlng1, latlng2) {\n\t\tvar rad = Math.PI / 180,\n\t\t    lat1 = latlng1.lat * rad,\n\t\t    lat2 = latlng2.lat * rad,\n\t\t    sinDLat = Math.sin((latlng2.lat - latlng1.lat) * rad / 2),\n\t\t    sinDLon = Math.sin((latlng2.lng - latlng1.lng) * rad / 2),\n\t\t    a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon,\n\t\t    c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\t\treturn this.R * c;\n\t}\n});\n", "import {LatLng} from '../LatLng';\r\nimport {Bounds} from '../../geometry/Bounds';\r\nimport {Point} from '../../geometry/Point';\r\n\r\n/*\r\n * @namespace Projection\r\n * @projection L.Projection.SphericalMercator\r\n *\r\n * Spherical Mercator projection — the most common projection for online maps,\r\n * used by almost all free and commercial tile providers. Assumes that Earth is\r\n * a sphere. Used by the `EPSG:3857` CRS.\r\n */\r\n\r\nvar earthRadius = 6378137;\r\n\r\nexport var SphericalMercator = {\r\n\r\n\tR: earthRadius,\r\n\tMAX_LATITUDE: 85.0511287798,\r\n\r\n\tproject: function (latlng) {\r\n\t\tvar d = Math.PI / 180,\r\n\t\t    max = this.MAX_LATITUDE,\r\n\t\t    lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t    sin = Math.sin(lat * d);\r\n\r\n\t\treturn new Point(\r\n\t\t\tthis.R * latlng.lng * d,\r\n\t\t\tthis.R * Math.log((1 + sin) / (1 - sin)) / 2);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\tvar d = 180 / Math.PI;\r\n\r\n\t\treturn new LatLng(\r\n\t\t\t(2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\r\n\t\t\tpoint.x * d / this.R);\r\n\t},\r\n\r\n\tbounds: (function () {\r\n\t\tvar d = earthRadius * Math.PI;\r\n\t\treturn new Bounds([-d, -d], [d, d]);\r\n\t})()\r\n};\r\n", "import {Point} from './Point';\r\nimport * as Util from '../core/Util';\r\n\r\n/*\r\n * @class Transformation\r\n * @aka L.Transformation\r\n *\r\n * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d`\r\n * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing\r\n * the reverse. Used by Leaflet in its projections code.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var transformation = L.transformation(2, 5, -1, 10),\r\n * \tp = L.point(1, 2),\r\n * \tp2 = transformation.transform(p), //  L.point(7, 8)\r\n * \tp3 = transformation.untransform(p2); //  L.point(1, 2)\r\n * ```\r\n */\r\n\r\n\r\n// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number)\r\n// Creates a `Transformation` object with the given coefficients.\r\nexport function Transformation(a, b, c, d) {\r\n\tif (Util.isArray(a)) {\r\n\t\t// use array properties\r\n\t\tthis._a = a[0];\r\n\t\tthis._b = a[1];\r\n\t\tthis._c = a[2];\r\n\t\tthis._d = a[3];\r\n\t\treturn;\r\n\t}\r\n\tthis._a = a;\r\n\tthis._b = b;\r\n\tthis._c = c;\r\n\tthis._d = d;\r\n}\r\n\r\nTransformation.prototype = {\r\n\t// @method transform(point: Point, scale?: Number): Point\r\n\t// Returns a transformed point, optionally multiplied by the given scale.\r\n\t// Only accepts actual `L.Point` instances, not arrays.\r\n\ttransform: function (point, scale) { // (Point, Number) -> Point\r\n\t\treturn this._transform(point.clone(), scale);\r\n\t},\r\n\r\n\t// destructive transform (faster)\r\n\t_transform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\tpoint.x = scale * (this._a * point.x + this._b);\r\n\t\tpoint.y = scale * (this._c * point.y + this._d);\r\n\t\treturn point;\r\n\t},\r\n\r\n\t// @method untransform(point: Point, scale?: Number): Point\r\n\t// Returns the reverse transformation of the given point, optionally divided\r\n\t// by the given scale. Only accepts actual `L.Point` instances, not arrays.\r\n\tuntransform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\treturn new Point(\r\n\t\t        (point.x / scale - this._b) / this._a,\r\n\t\t        (point.y / scale - this._d) / this._c);\r\n\t}\r\n};\r\n\r\n// factory L.transformation(a: Number, b: Number, c: Number, d: Number)\r\n\r\n// @factory L.transformation(a: Number, b: Number, c: Number, d: Number)\r\n// Instantiates a Transformation object with the given coefficients.\r\n\r\n// @alternative\r\n// @factory L.transformation(coefficients: Array): Transformation\r\n// Expects an coefficients array of the form\r\n// `[a: Number, b: Number, c: Number, d: Number]`.\r\n\r\nexport function toTransformation(a, b, c, d) {\r\n\treturn new Transformation(a, b, c, d);\r\n}\r\n", "import {Earth} from './CRS.Earth';\r\nimport {SphericalMercator} from '../projection/Projection.SphericalMercator';\r\nimport {toTransformation} from '../../geometry/Transformation';\r\nimport * as Util from '../../core/Util';\r\n\r\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3857\r\n *\r\n * The most common CRS for online maps, used by almost all free and commercial\r\n * tile providers. Uses Spherical Mercator projection. Set in by default in\r\n * Map's `crs` option.\r\n */\r\n\r\nexport var EPSG3857 = Util.extend({}, Earth, {\r\n\tcode: 'EPSG:3857',\r\n\tprojection: SphericalMercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar scale = 0.5 / (Math.PI * SphericalMercator.R);\r\n\t\treturn toTransformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\r\nexport var EPSG900913 = Util.extend({}, EPSG3857, {\r\n\tcode: 'EPSG:900913'\r\n});\r\n", "import Browser from '../../core/Browser';\n\n// @namespace SVG; @section\n// There are several static functions which can be called without instantiating L.SVG:\n\n// @function create(name: String): SVGElement\n// Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement),\n// corresponding to the class name passed. For example, using 'line' will return\n// an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement).\nexport function svgCreate(name) {\n\treturn document.createElementNS('http://www.w3.org/2000/svg', name);\n}\n\n// @function pointsToPath(rings: Point[], closed: Boolean): String\n// Generates a SVG path string for multiple rings, with each ring turning\n// into \"M..L..L..\" instructions\nexport function pointsToPath(rings, closed) {\n\tvar str = '',\n\ti, j, len, len2, points, p;\n\n\tfor (i = 0, len = rings.length; i < len; i++) {\n\t\tpoints = rings[i];\n\n\t\tfor (j = 0, len2 = points.length; j < len2; j++) {\n\t\t\tp = points[j];\n\t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\n\t\t}\n\n\t\t// closes the ring for polygons; \"x\" is VML syntax\n\t\tstr += closed ? (Browser.svg ? 'z' : 'x') : '';\n\t}\n\n\t// SVG complains about empty path strings\n\treturn str || 'M0 0';\n}\n\n\n\n\n", "import * as Util from './Util';\r\nimport {svgCreate} from '../layer/vector/SVG.Util';\r\n\r\n/*\r\n * @namespace Browser\r\n * @aka L.Browser\r\n *\r\n * A namespace with static properties for browser/feature detection used by Leaflet internally.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * if (L.Browser.ielt9) {\r\n *   alert('Upgrade your browser, dude!');\r\n * }\r\n * ```\r\n */\r\n\r\nvar style = document.documentElement.style;\r\n\r\n// @property ie: Boolean; `true` for all Internet Explorer versions (not Edge).\r\nvar ie = 'ActiveXObject' in window;\r\n\r\n// @property ielt9: Boolean; `true` for Internet Explorer versions less than 9.\r\nvar ielt9 = ie && !document.addEventListener;\r\n\r\n// @property edge: Boolean; `true` for the Edge web browser.\r\nvar edge = 'msLaunchUri' in navigator && !('documentMode' in document);\r\n\r\n// @property webkit: Boolean;\r\n// `true` for webkit-based browsers like Chrome and Safari (including mobile versions).\r\nvar webkit = userAgentContains('webkit');\r\n\r\n// @property android: Boolean\r\n// **Deprecated.** `true` for any browser running on an Android platform.\r\nvar android = userAgentContains('android');\r\n\r\n// @property android23: Boolean; **Deprecated.** `true` for browsers running on Android 2 or Android 3.\r\nvar android23 = userAgentContains('android 2') || userAgentContains('android 3');\r\n\r\n/* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */\r\nvar webkitVer = parseInt(/WebKit\\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit\r\n// @property androidStock: Boolean; **Deprecated.** `true` for the Android stock browser (i.e. not Chrome)\r\nvar androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window);\r\n\r\n// @property opera: Boolean; `true` for the Opera browser\r\nvar opera = !!window.opera;\r\n\r\n// @property chrome: Boolean; `true` for the Chrome browser.\r\nvar chrome = !edge && userAgentContains('chrome');\r\n\r\n// @property gecko: Boolean; `true` for gecko-based browsers like Firefox.\r\nvar gecko = userAgentContains('gecko') && !webkit && !opera && !ie;\r\n\r\n// @property safari: Boolean; `true` for the Safari browser.\r\nvar safari = !chrome && userAgentContains('safari');\r\n\r\nvar phantom = userAgentContains('phantom');\r\n\r\n// @property opera12: Boolean\r\n// `true` for the Opera browser supporting CSS transforms (version 12 or later).\r\nvar opera12 = 'OTransition' in style;\r\n\r\n// @property win: Boolean; `true` when the browser is running in a Windows platform\r\nvar win = navigator.platform.indexOf('Win') === 0;\r\n\r\n// @property ie3d: Boolean; `true` for all Internet Explorer versions supporting CSS transforms.\r\nvar ie3d = ie && ('transition' in style);\r\n\r\n// @property webkit3d: Boolean; `true` for webkit-based browsers supporting CSS transforms.\r\nvar webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23;\r\n\r\n// @property gecko3d: Boolean; `true` for gecko-based browsers supporting CSS transforms.\r\nvar gecko3d = 'MozPerspective' in style;\r\n\r\n// @property any3d: Boolean\r\n// `true` for all browsers supporting CSS transforms.\r\nvar any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantom;\r\n\r\n// @property mobile: Boolean; `true` for all browsers running in a mobile device.\r\nvar mobile = typeof orientation !== 'undefined' || userAgentContains('mobile');\r\n\r\n// @property mobileWebkit: Boolean; `true` for all webkit-based browsers in a mobile device.\r\nvar mobileWebkit = mobile && webkit;\r\n\r\n// @property mobileWebkit3d: Boolean\r\n// `true` for all webkit-based browsers in a mobile device supporting CSS transforms.\r\nvar mobileWebkit3d = mobile && webkit3d;\r\n\r\n// @property msPointer: Boolean\r\n// `true` for browsers implementing the Microsoft touch events model (notably IE10).\r\nvar msPointer = !window.PointerEvent && window.MSPointerEvent;\r\n\r\n// @property pointer: Boolean\r\n// `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx).\r\nvar pointer = !!(window.PointerEvent || msPointer);\r\n\r\n// @property touchNative: Boolean\r\n// `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events).\r\n// **This does not necessarily mean** that the browser is running in a computer with\r\n// a touchscreen, it only means that the browser is capable of understanding\r\n// touch events.\r\nvar touchNative = 'ontouchstart' in window || !!window.TouchEvent;\r\n\r\n// @property touch: Boolean\r\n// `true` for all browsers supporting either [touch](#browser-touch) or [pointer](#browser-pointer) events.\r\n// Note: pointer events will be preferred (if available), and processed for all `touch*` listeners.\r\nvar touch = !window.L_NO_TOUCH && (touchNative || pointer);\r\n\r\n// @property mobileOpera: Boolean; `true` for the Opera browser in a mobile device.\r\nvar mobileOpera = mobile && opera;\r\n\r\n// @property mobileGecko: Boolean\r\n// `true` for gecko-based browsers running in a mobile device.\r\nvar mobileGecko = mobile && gecko;\r\n\r\n// @property retina: Boolean\r\n// `true` for browsers on a high-resolution \"retina\" screen or on any screen when browser's display zoom is more than 100%.\r\nvar retina = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1;\r\n\r\n// @property passiveEvents: Boolean\r\n// `true` for browsers that support passive events.\r\nvar passiveEvents = (function () {\r\n\tvar supportsPassiveOption = false;\r\n\ttry {\r\n\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\tget: function () { // eslint-disable-line getter-return\r\n\t\t\t\tsupportsPassiveOption = true;\r\n\t\t\t}\r\n\t\t});\r\n\t\twindow.addEventListener('testPassiveEventSupport', Util.falseFn, opts);\r\n\t\twindow.removeEventListener('testPassiveEventSupport', Util.falseFn, opts);\r\n\t} catch (e) {\r\n\t\t// Errors can safely be ignored since this is only a browser support test.\r\n\t}\r\n\treturn supportsPassiveOption;\r\n}());\r\n\r\n// @property canvas: Boolean\r\n// `true` when the browser supports [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).\r\nvar canvas = (function () {\r\n\treturn !!document.createElement('canvas').getContext;\r\n}());\r\n\r\n// @property svg: Boolean\r\n// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG).\r\nvar svg = !!(document.createElementNS && svgCreate('svg').createSVGRect);\r\n\r\nvar inlineSvg = !!svg && (function () {\r\n\tvar div = document.createElement('div');\r\n\tdiv.innerHTML = '<svg/>';\r\n\treturn (div.firstChild && div.firstChild.namespaceURI) === 'http://www.w3.org/2000/svg';\r\n})();\r\n\r\n// @property vml: Boolean\r\n// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language).\r\nvar vml = !svg && (function () {\r\n\ttry {\r\n\t\tvar div = document.createElement('div');\r\n\t\tdiv.innerHTML = '<v:shape adj=\"1\"/>';\r\n\r\n\t\tvar shape = div.firstChild;\r\n\t\tshape.style.behavior = 'url(#default#VML)';\r\n\r\n\t\treturn shape && (typeof shape.adj === 'object');\r\n\r\n\t} catch (e) {\r\n\t\treturn false;\r\n\t}\r\n}());\r\n\r\n\r\n// @property mac: Boolean; `true` when the browser is running in a Mac platform\r\nvar mac = navigator.platform.indexOf('Mac') === 0;\r\n\r\n// @property mac: Boolean; `true` when the browser is running in a Linux platform\r\nvar linux = navigator.platform.indexOf('Linux') === 0;\r\n\r\nfunction userAgentContains(str) {\r\n\treturn navigator.userAgent.toLowerCase().indexOf(str) >= 0;\r\n}\r\n\r\n\r\nexport default {\r\n\tie: ie,\r\n\tielt9: ielt9,\r\n\tedge: edge,\r\n\twebkit: webkit,\r\n\tandroid: android,\r\n\tandroid23: android23,\r\n\tandroidStock: androidStock,\r\n\topera: opera,\r\n\tchrome: chrome,\r\n\tgecko: gecko,\r\n\tsafari: safari,\r\n\tphantom: phantom,\r\n\topera12: opera12,\r\n\twin: win,\r\n\tie3d: ie3d,\r\n\twebkit3d: webkit3d,\r\n\tgecko3d: gecko3d,\r\n\tany3d: any3d,\r\n\tmobile: mobile,\r\n\tmobileWebkit: mobileWebkit,\r\n\tmobileWebkit3d: mobileWebkit3d,\r\n\tmsPointer: msPointer,\r\n\tpointer: pointer,\r\n\ttouch: touch,\r\n\ttouchNative: touchNative,\r\n\tmobileOpera: mobileOpera,\r\n\tmobileGecko: mobileGecko,\r\n\tretina: retina,\r\n\tpassiveEvents: passiveEvents,\r\n\tcanvas: canvas,\r\n\tsvg: svg,\r\n\tvml: vml,\r\n\tinlineSvg: inlineSvg,\r\n\tmac: mac,\r\n\tlinux: linux\r\n};\r\n", "import * as DomEvent from './DomEvent';\nimport Browser from '../core/Browser';\nimport {falseFn} from '../core/Util';\n\n/*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\nvar POINTER_DOWN =   Browser.msPointer ? 'MSPointerDown'   : 'pointerdown';\nvar POINTER_MOVE =   Browser.msPointer ? 'MSPointerMove'   : 'pointermove';\nvar POINTER_UP =     Browser.msPointer ? 'MSPointerUp'     : 'pointerup';\nvar POINTER_CANCEL = Browser.msPointer ? 'MSPointerCancel' : 'pointercancel';\nvar pEvent = {\n\ttouchstart  : POINTER_DOWN,\n\ttouchmove   : POINTER_MOVE,\n\ttouchend    : POINTER_UP,\n\ttouchcancel : POINTER_CANCEL\n};\nvar handle = {\n\ttouchstart  : _onPointerStart,\n\ttouchmove   : _handlePointer,\n\ttouchend    : _handlePointer,\n\ttouchcancel : _handlePointer\n};\nvar _pointers = {};\nvar _pointerDocListener = false;\n\n// Provides a touch events wrapper for (ms)pointer events.\n// ref https://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\nexport function addPointerListener(obj, type, handler) {\n\tif (type === 'touchstart') {\n\t\t_addPointerDocListener();\n\t}\n\tif (!handle[type]) {\n\t\tconsole.warn('wrong event specified:', type);\n\t\treturn falseFn;\n\t}\n\thandler = handle[type].bind(this, handler);\n\tobj.addEventListener(pEvent[type], handler, false);\n\treturn handler;\n}\n\nexport function removePointerListener(obj, type, handler) {\n\tif (!pEvent[type]) {\n\t\tconsole.warn('wrong event specified:', type);\n\t\treturn;\n\t}\n\tobj.removeEventListener(pEvent[type], handler, false);\n}\n\nfunction _globalPointerDown(e) {\n\t_pointers[e.pointerId] = e;\n}\n\nfunction _globalPointerMove(e) {\n\tif (_pointers[e.pointerId]) {\n\t\t_pointers[e.pointerId] = e;\n\t}\n}\n\nfunction _globalPointerUp(e) {\n\tdelete _pointers[e.pointerId];\n}\n\nfunction _addPointerDocListener() {\n\t// need to keep track of what pointers and how many are active to provide e.touches emulation\n\tif (!_pointerDocListener) {\n\t\t// we listen document as any drags that end by moving the touch off the screen get fired there\n\t\tdocument.addEventListener(POINTER_DOWN, _globalPointerDown, true);\n\t\tdocument.addEventListener(POINTER_MOVE, _globalPointerMove, true);\n\t\tdocument.addEventListener(POINTER_UP, _globalPointerUp, true);\n\t\tdocument.addEventListener(POINTER_CANCEL, _globalPointerUp, true);\n\n\t\t_pointerDocListener = true;\n\t}\n}\n\nfunction _handlePointer(handler, e) {\n\tif (e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) { return; }\n\n\te.touches = [];\n\tfor (var i in _pointers) {\n\t\te.touches.push(_pointers[i]);\n\t}\n\te.changedTouches = [e];\n\n\thandler(e);\n}\n\nfunction _onPointerStart(handler, e) {\n\t// IE10 specific: MsTouch needs preventDefault. See #2000\n\tif (e.MSPOINTER_TYPE_TOUCH && e.pointerType === e.MSPOINTER_TYPE_TOUCH) {\n\t\tDomEvent.preventDefault(e);\n\t}\n\t_handlePointer(handler, e);\n}\n", "import * as DomEvent from './DomEvent';\r\n\r\n/*\r\n * Extends the event handling code with double tap support for mobile browsers.\r\n *\r\n * Note: currently most browsers fire native dblclick, with only a few exceptions\r\n * (see https://github.com/Leaflet/Leaflet/issues/7012#issuecomment-595087386)\r\n */\r\n\r\nfunction makeDblclick(event) {\r\n\t// in modern browsers `type` cannot be just overridden:\r\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only\r\n\tvar newEvent = {},\r\n\t    prop, i;\r\n\tfor (i in event) {\r\n\t\tprop = event[i];\r\n\t\tnewEvent[i] = prop && prop.bind ? prop.bind(event) : prop;\r\n\t}\r\n\tevent = newEvent;\r\n\tnewEvent.type = 'dblclick';\r\n\tnewEvent.detail = 2;\r\n\tnewEvent.isTrusted = false;\r\n\tnewEvent._simulated = true; // for debug purposes\r\n\treturn newEvent;\r\n}\r\n\r\nvar delay = 200;\r\nexport function addDoubleTapListener(obj, handler) {\r\n\t// Most browsers handle double tap natively\r\n\tobj.addEventListener('dblclick', handler);\r\n\r\n\t// On some platforms the browser doesn't fire native dblclicks for touch events.\r\n\t// It seems that in all such cases `detail` property of `click` event is always `1`.\r\n\t// So here we rely on that fact to avoid excessive 'dblclick' simulation when not needed.\r\n\tvar last = 0,\r\n\t    detail;\r\n\tfunction simDblclick(e) {\r\n\t\tif (e.detail !== 1) {\r\n\t\t\tdetail = e.detail; // keep in sync to avoid false dblclick in some cases\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (e.pointerType === 'mouse' ||\r\n\t\t\t(e.sourceCapabilities && !e.sourceCapabilities.firesTouchEvents)) {\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// When clicking on an <input>, the browser generates a click on its\r\n\t\t// <label> (and vice versa) triggering two clicks in quick succession.\r\n\t\t// This ignores clicks on elements which are a label with a 'for'\r\n\t\t// attribute (or children of such a label), but not children of\r\n\t\t// a <input>.\r\n\t\tvar path = DomEvent.getPropagationPath(e);\r\n\t\tif (path.some(function (el) {\r\n\t\t\treturn el instanceof HTMLLabelElement && el.attributes.for;\r\n\t\t}) &&\r\n\t\t\t!path.some(function (el) {\r\n\t\t\t\treturn (\r\n\t\t\t\t\tel instanceof HTMLInputElement ||\r\n\t\t\t\t\tel instanceof HTMLSelectElement\r\n\t\t\t\t);\r\n\t\t\t})\r\n\t\t) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar now = Date.now();\r\n\t\tif (now - last <= delay) {\r\n\t\t\tdetail++;\r\n\t\t\tif (detail === 2) {\r\n\t\t\t\thandler(makeDblclick(e));\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tdetail = 1;\r\n\t\t}\r\n\t\tlast = now;\r\n\t}\r\n\r\n\tobj.addEventListener('click', simDblclick);\r\n\r\n\treturn {\r\n\t\tdblclick: handler,\r\n\t\tsimDblclick: simDblclick\r\n\t};\r\n}\r\n\r\nexport function removeDoubleTapListener(obj, handlers) {\r\n\tobj.removeEventListener('dblclick', handlers.dblclick);\r\n\tobj.removeEventListener('click', handlers.simDblclick);\r\n}\r\n", "import * as DomEvent from './DomEvent';\r\nimport * as Util from '../core/Util';\r\nimport {Point} from '../geometry/Point';\r\nimport Browser from '../core/Browser';\r\n\r\n/*\r\n * @namespace DomUtil\r\n *\r\n * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model)\r\n * tree, used by Leaflet internally.\r\n *\r\n * Most functions expecting or returning a `HTMLElement` also work for\r\n * SVG elements. The only difference is that classes refer to CSS classes\r\n * in HTML and SVG classes in SVG.\r\n */\r\n\r\n\r\n// @property TRANSFORM: String\r\n// Vendor-prefixed transform style name (e.g. `'webkitTransform'` for WebKit).\r\nexport var TRANSFORM = testProp(\r\n\t['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\r\n\r\n// webkitTransition comes first because some browser versions that drop vendor prefix don't do\r\n// the same for the transitionend event, in particular the Android 4.1 stock browser\r\n\r\n// @property TRANSITION: String\r\n// Vendor-prefixed transition style name.\r\nexport var TRANSITION = testProp(\r\n\t['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\r\n\r\n// @property TRANSITION_END: String\r\n// Vendor-prefixed transitionend event name.\r\nexport var TRANSITION_END =\r\n\tTRANSITION === 'webkitTransition' || TRANSITION === 'OTransition' ? TRANSITION + 'End' : 'transitionend';\r\n\r\n\r\n// @function get(id: String|HTMLElement): HTMLElement\r\n// Returns an element given its DOM id, or returns the element itself\r\n// if it was passed directly.\r\nexport function get(id) {\r\n\treturn typeof id === 'string' ? document.getElementById(id) : id;\r\n}\r\n\r\n// @function getStyle(el: HTMLElement, styleAttrib: String): String\r\n// Returns the value for a certain style attribute on an element,\r\n// including computed values or values set through CSS.\r\nexport function getStyle(el, style) {\r\n\tvar value = el.style[style] || (el.currentStyle && el.currentStyle[style]);\r\n\r\n\tif ((!value || value === 'auto') && document.defaultView) {\r\n\t\tvar css = document.defaultView.getComputedStyle(el, null);\r\n\t\tvalue = css ? css[style] : null;\r\n\t}\r\n\treturn value === 'auto' ? null : value;\r\n}\r\n\r\n// @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement\r\n// Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element.\r\nexport function create(tagName, className, container) {\r\n\tvar el = document.createElement(tagName);\r\n\tel.className = className || '';\r\n\r\n\tif (container) {\r\n\t\tcontainer.appendChild(el);\r\n\t}\r\n\treturn el;\r\n}\r\n\r\n// @function remove(el: HTMLElement)\r\n// Removes `el` from its parent element\r\nexport function remove(el) {\r\n\tvar parent = el.parentNode;\r\n\tif (parent) {\r\n\t\tparent.removeChild(el);\r\n\t}\r\n}\r\n\r\n// @function empty(el: HTMLElement)\r\n// Removes all of `el`'s children elements from `el`\r\nexport function empty(el) {\r\n\twhile (el.firstChild) {\r\n\t\tel.removeChild(el.firstChild);\r\n\t}\r\n}\r\n\r\n// @function toFront(el: HTMLElement)\r\n// Makes `el` the last child of its parent, so it renders in front of the other children.\r\nexport function toFront(el) {\r\n\tvar parent = el.parentNode;\r\n\tif (parent && parent.lastChild !== el) {\r\n\t\tparent.appendChild(el);\r\n\t}\r\n}\r\n\r\n// @function toBack(el: HTMLElement)\r\n// Makes `el` the first child of its parent, so it renders behind the other children.\r\nexport function toBack(el) {\r\n\tvar parent = el.parentNode;\r\n\tif (parent && parent.firstChild !== el) {\r\n\t\tparent.insertBefore(el, parent.firstChild);\r\n\t}\r\n}\r\n\r\n// @function hasClass(el: HTMLElement, name: String): Boolean\r\n// Returns `true` if the element's class attribute contains `name`.\r\nexport function hasClass(el, name) {\r\n\tif (el.classList !== undefined) {\r\n\t\treturn el.classList.contains(name);\r\n\t}\r\n\tvar className = getClass(el);\r\n\treturn className.length > 0 && new RegExp('(^|\\\\s)' + name + '(\\\\s|$)').test(className);\r\n}\r\n\r\n// @function addClass(el: HTMLElement, name: String)\r\n// Adds `name` to the element's class attribute.\r\nexport function addClass(el, name) {\r\n\tif (el.classList !== undefined) {\r\n\t\tvar classes = Util.splitWords(name);\r\n\t\tfor (var i = 0, len = classes.length; i < len; i++) {\r\n\t\t\tel.classList.add(classes[i]);\r\n\t\t}\r\n\t} else if (!hasClass(el, name)) {\r\n\t\tvar className = getClass(el);\r\n\t\tsetClass(el, (className ? className + ' ' : '') + name);\r\n\t}\r\n}\r\n\r\n// @function removeClass(el: HTMLElement, name: String)\r\n// Removes `name` from the element's class attribute.\r\nexport function removeClass(el, name) {\r\n\tif (el.classList !== undefined) {\r\n\t\tel.classList.remove(name);\r\n\t} else {\r\n\t\tsetClass(el, Util.trim((' ' + getClass(el) + ' ').replace(' ' + name + ' ', ' ')));\r\n\t}\r\n}\r\n\r\n// @function setClass(el: HTMLElement, name: String)\r\n// Sets the element's class.\r\nexport function setClass(el, name) {\r\n\tif (el.className.baseVal === undefined) {\r\n\t\tel.className = name;\r\n\t} else {\r\n\t\t// in case of SVG element\r\n\t\tel.className.baseVal = name;\r\n\t}\r\n}\r\n\r\n// @function getClass(el: HTMLElement): String\r\n// Returns the element's class.\r\nexport function getClass(el) {\r\n\t// Check if the element is an SVGElementInstance and use the correspondingElement instead\r\n\t// (Required for linked SVG elements in IE11.)\r\n\tif (el.correspondingElement) {\r\n\t\tel = el.correspondingElement;\r\n\t}\r\n\treturn el.className.baseVal === undefined ? el.className : el.className.baseVal;\r\n}\r\n\r\n// @function setOpacity(el: HTMLElement, opacity: Number)\r\n// Set the opacity of an element (including old IE support).\r\n// `opacity` must be a number from `0` to `1`.\r\nexport function setOpacity(el, value) {\r\n\tif ('opacity' in el.style) {\r\n\t\tel.style.opacity = value;\r\n\t} else if ('filter' in el.style) {\r\n\t\t_setOpacityIE(el, value);\r\n\t}\r\n}\r\n\r\nfunction _setOpacityIE(el, value) {\r\n\tvar filter = false,\r\n\t    filterName = 'DXImageTransform.Microsoft.Alpha';\r\n\r\n\t// filters collection throws an error if we try to retrieve a filter that doesn't exist\r\n\ttry {\r\n\t\tfilter = el.filters.item(filterName);\r\n\t} catch (e) {\r\n\t\t// don't set opacity to 1 if we haven't already set an opacity,\r\n\t\t// it isn't needed and breaks transparent pngs.\r\n\t\tif (value === 1) { return; }\r\n\t}\r\n\r\n\tvalue = Math.round(value * 100);\r\n\r\n\tif (filter) {\r\n\t\tfilter.Enabled = (value !== 100);\r\n\t\tfilter.Opacity = value;\r\n\t} else {\r\n\t\tel.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';\r\n\t}\r\n}\r\n\r\n// @function testProp(props: String[]): String|false\r\n// Goes through the array of style names and returns the first name\r\n// that is a valid style name for an element. If no such name is found,\r\n// it returns false. Useful for vendor-prefixed styles like `transform`.\r\nexport function testProp(props) {\r\n\tvar style = document.documentElement.style;\r\n\r\n\tfor (var i = 0; i < props.length; i++) {\r\n\t\tif (props[i] in style) {\r\n\t\t\treturn props[i];\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n// @function setTransform(el: HTMLElement, offset: Point, scale?: Number)\r\n// Resets the 3D CSS transform of `el` so it is translated by `offset` pixels\r\n// and optionally scaled by `scale`. Does not have an effect if the\r\n// browser doesn't support 3D CSS transforms.\r\nexport function setTransform(el, offset, scale) {\r\n\tvar pos = offset || new Point(0, 0);\r\n\r\n\tel.style[TRANSFORM] =\r\n\t\t(Browser.ie3d ?\r\n\t\t\t'translate(' + pos.x + 'px,' + pos.y + 'px)' :\r\n\t\t\t'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') +\r\n\t\t(scale ? ' scale(' + scale + ')' : '');\r\n}\r\n\r\n// @function setPosition(el: HTMLElement, position: Point)\r\n// Sets the position of `el` to coordinates specified by `position`,\r\n// using CSS translate or top/left positioning depending on the browser\r\n// (used by Leaflet internally to position its layers).\r\nexport function setPosition(el, point) {\r\n\r\n\t/*eslint-disable */\r\n\tel._leaflet_pos = point;\r\n\t/* eslint-enable */\r\n\r\n\tif (Browser.any3d) {\r\n\t\tsetTransform(el, point);\r\n\t} else {\r\n\t\tel.style.left = point.x + 'px';\r\n\t\tel.style.top = point.y + 'px';\r\n\t}\r\n}\r\n\r\n// @function getPosition(el: HTMLElement): Point\r\n// Returns the coordinates of an element previously positioned with setPosition.\r\nexport function getPosition(el) {\r\n\t// this method is only used for elements previously positioned using setPosition,\r\n\t// so it's safe to cache the position for performance\r\n\r\n\treturn el._leaflet_pos || new Point(0, 0);\r\n}\r\n\r\n// @function disableTextSelection()\r\n// Prevents the user from generating `selectstart` DOM events, usually generated\r\n// when the user drags the mouse through a page with text. Used internally\r\n// by Leaflet to override the behaviour of any click-and-drag interaction on\r\n// the map. Affects drag interactions on the whole document.\r\n\r\n// @function enableTextSelection()\r\n// Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection).\r\nexport var disableTextSelection;\r\nexport var enableTextSelection;\r\nvar _userSelect;\r\nif ('onselectstart' in document) {\r\n\tdisableTextSelection = function () {\r\n\t\tDomEvent.on(window, 'selectstart', DomEvent.preventDefault);\r\n\t};\r\n\tenableTextSelection = function () {\r\n\t\tDomEvent.off(window, 'selectstart', DomEvent.preventDefault);\r\n\t};\r\n} else {\r\n\tvar userSelectProperty = testProp(\r\n\t\t['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);\r\n\r\n\tdisableTextSelection = function () {\r\n\t\tif (userSelectProperty) {\r\n\t\t\tvar style = document.documentElement.style;\r\n\t\t\t_userSelect = style[userSelectProperty];\r\n\t\t\tstyle[userSelectProperty] = 'none';\r\n\t\t}\r\n\t};\r\n\tenableTextSelection = function () {\r\n\t\tif (userSelectProperty) {\r\n\t\t\tdocument.documentElement.style[userSelectProperty] = _userSelect;\r\n\t\t\t_userSelect = undefined;\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// @function disableImageDrag()\r\n// As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but\r\n// for `dragstart` DOM events, usually generated when the user drags an image.\r\nexport function disableImageDrag() {\r\n\tDomEvent.on(window, 'dragstart', DomEvent.preventDefault);\r\n}\r\n\r\n// @function enableImageDrag()\r\n// Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection).\r\nexport function enableImageDrag() {\r\n\tDomEvent.off(window, 'dragstart', DomEvent.preventDefault);\r\n}\r\n\r\nvar _outlineElement, _outlineStyle;\r\n// @function preventOutline(el: HTMLElement)\r\n// Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline)\r\n// of the element `el` invisible. Used internally by Leaflet to prevent\r\n// focusable elements from displaying an outline when the user performs a\r\n// drag interaction on them.\r\nexport function preventOutline(element) {\r\n\twhile (element.tabIndex === -1) {\r\n\t\telement = element.parentNode;\r\n\t}\r\n\tif (!element.style) { return; }\r\n\trestoreOutline();\r\n\t_outlineElement = element;\r\n\t_outlineStyle = element.style.outlineStyle;\r\n\telement.style.outlineStyle = 'none';\r\n\tDomEvent.on(window, 'keydown', restoreOutline);\r\n}\r\n\r\n// @function restoreOutline()\r\n// Cancels the effects of a previous [`L.DomUtil.preventOutline`]().\r\nexport function restoreOutline() {\r\n\tif (!_outlineElement) { return; }\r\n\t_outlineElement.style.outlineStyle = _outlineStyle;\r\n\t_outlineElement = undefined;\r\n\t_outlineStyle = undefined;\r\n\tDomEvent.off(window, 'keydown', restoreOutline);\r\n}\r\n\r\n// @function getSizedParentNode(el: HTMLElement): HTMLElement\r\n// Finds the closest parent node which size (width and height) is not null.\r\nexport function getSizedParentNode(element) {\r\n\tdo {\r\n\t\telement = element.parentNode;\r\n\t} while ((!element.offsetWidth || !element.offsetHeight) && element !== document.body);\r\n\treturn element;\r\n}\r\n\r\n// @function getScale(el: HTMLElement): Object\r\n// Computes the CSS scale currently applied on the element.\r\n// Returns an object with `x` and `y` members as horizontal and vertical scales respectively,\r\n// and `boundingClientRect` as the result of [`getBoundingClientRect()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect).\r\nexport function getScale(element) {\r\n\tvar rect = element.getBoundingClientRect(); // Read-only in old browsers.\r\n\r\n\treturn {\r\n\t\tx: rect.width / element.offsetWidth || 1,\r\n\t\ty: rect.height / element.offsetHeight || 1,\r\n\t\tboundingClientRect: rect\r\n\t};\r\n}\r\n", "import {Point} from '../geometry/Point';\r\nimport * as Util from '../core/Util';\r\nimport Browser from '../core/Browser';\r\nimport {addPointerListener, removePointerListener} from './DomEvent.Pointer';\r\nimport {addDoubleTapListener, removeDoubleTapListener} from './DomEvent.DoubleTap';\r\nimport {getScale} from './DomUtil';\r\n\r\n/*\r\n * @namespace DomEvent\r\n * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally.\r\n */\r\n\r\n// Inspired by John Resig, Dean Edwards and YUI addEvent implementations.\r\n\r\n// @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this\r\n// Adds a listener function (`fn`) to a particular DOM event type of the\r\n// element `el`. You can optionally specify the context of the listener\r\n// (object the `this` keyword will point to). You can also pass several\r\n// space-separated types (e.g. `'click dblclick'`).\r\n\r\n// @alternative\r\n// @function on(el: HTMLElement, eventMap: Object, context?: Object): this\r\n// Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\nexport function on(obj, types, fn, context) {\r\n\r\n\tif (types && typeof types === 'object') {\r\n\t\tfor (var type in types) {\r\n\t\t\taddOne(obj, type, types[type], fn);\r\n\t\t}\r\n\t} else {\r\n\t\ttypes = Util.splitWords(types);\r\n\r\n\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\taddOne(obj, types[i], fn, context);\r\n\t\t}\r\n\t}\r\n\r\n\treturn this;\r\n}\r\n\r\nvar eventsKey = '_leaflet_events';\r\n\r\n// @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this\r\n// Removes a previously added listener function.\r\n// Note that if you passed a custom context to on, you must pass the same\r\n// context to `off` in order to remove the listener.\r\n\r\n// @alternative\r\n// @function off(el: HTMLElement, eventMap: Object, context?: Object): this\r\n// Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`\r\n\r\n// @alternative\r\n// @function off(el: HTMLElement, types: String): this\r\n// Removes all previously added listeners of given types.\r\n\r\n// @alternative\r\n// @function off(el: HTMLElement): this\r\n// Removes all previously added listeners from given HTMLElement\r\nexport function off(obj, types, fn, context) {\r\n\r\n\tif (arguments.length === 1) {\r\n\t\tbatchRemove(obj);\r\n\t\tdelete obj[eventsKey];\r\n\r\n\t} else if (types && typeof types === 'object') {\r\n\t\tfor (var type in types) {\r\n\t\t\tremoveOne(obj, type, types[type], fn);\r\n\t\t}\r\n\r\n\t} else {\r\n\t\ttypes = Util.splitWords(types);\r\n\r\n\t\tif (arguments.length === 2) {\r\n\t\t\tbatchRemove(obj, function (type) {\r\n\t\t\t\treturn Util.indexOf(types, type) !== -1;\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tfor (var i = 0, len = types.length; i < len; i++) {\r\n\t\t\t\tremoveOne(obj, types[i], fn, context);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn this;\r\n}\r\n\r\nfunction batchRemove(obj, filterFn) {\r\n\tfor (var id in obj[eventsKey]) {\r\n\t\tvar type = id.split(/\\d/)[0];\r\n\t\tif (!filterFn || filterFn(type)) {\r\n\t\t\tremoveOne(obj, type, null, null, id);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvar mouseSubst = {\r\n\tmouseenter: 'mouseover',\r\n\tmouseleave: 'mouseout',\r\n\twheel: !('onwheel' in window) && 'mousewheel'\r\n};\r\n\r\nfunction addOne(obj, type, fn, context) {\r\n\tvar id = type + Util.stamp(fn) + (context ? '_' + Util.stamp(context) : '');\r\n\r\n\tif (obj[eventsKey] && obj[eventsKey][id]) { return this; }\r\n\r\n\tvar handler = function (e) {\r\n\t\treturn fn.call(context || obj, e || window.event);\r\n\t};\r\n\r\n\tvar originalHandler = handler;\r\n\r\n\tif (!Browser.touchNative && Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t// Needs DomEvent.Pointer.js\r\n\t\thandler = addPointerListener(obj, type, handler);\r\n\r\n\t} else if (Browser.touch && (type === 'dblclick')) {\r\n\t\thandler = addDoubleTapListener(obj, handler);\r\n\r\n\t} else if ('addEventListener' in obj) {\r\n\r\n\t\tif (type === 'touchstart' || type === 'touchmove' || type === 'wheel' ||  type === 'mousewheel') {\r\n\t\t\tobj.addEventListener(mouseSubst[type] || type, handler, Browser.passiveEvents ? {passive: false} : false);\r\n\r\n\t\t} else if (type === 'mouseenter' || type === 'mouseleave') {\r\n\t\t\thandler = function (e) {\r\n\t\t\t\te = e || window.event;\r\n\t\t\t\tif (isExternalTarget(obj, e)) {\r\n\t\t\t\t\toriginalHandler(e);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tobj.addEventListener(mouseSubst[type], handler, false);\r\n\r\n\t\t} else {\r\n\t\t\tobj.addEventListener(type, originalHandler, false);\r\n\t\t}\r\n\r\n\t} else {\r\n\t\tobj.attachEvent('on' + type, handler);\r\n\t}\r\n\r\n\tobj[eventsKey] = obj[eventsKey] || {};\r\n\tobj[eventsKey][id] = handler;\r\n}\r\n\r\nfunction removeOne(obj, type, fn, context, id) {\r\n\tid = id || type + Util.stamp(fn) + (context ? '_' + Util.stamp(context) : '');\r\n\tvar handler = obj[eventsKey] && obj[eventsKey][id];\r\n\r\n\tif (!handler) { return this; }\r\n\r\n\tif (!Browser.touchNative && Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\tremovePointerListener(obj, type, handler);\r\n\r\n\t} else if (Browser.touch && (type === 'dblclick')) {\r\n\t\tremoveDoubleTapListener(obj, handler);\r\n\r\n\t} else if ('removeEventListener' in obj) {\r\n\r\n\t\tobj.removeEventListener(mouseSubst[type] || type, handler, false);\r\n\r\n\t} else {\r\n\t\tobj.detachEvent('on' + type, handler);\r\n\t}\r\n\r\n\tobj[eventsKey][id] = null;\r\n}\r\n\r\n// @function stopPropagation(ev: DOMEvent): this\r\n// Stop the given event from propagation to parent elements. Used inside the listener functions:\r\n// ```js\r\n// L.DomEvent.on(div, 'click', function (ev) {\r\n// \tL.DomEvent.stopPropagation(ev);\r\n// });\r\n// ```\r\nexport function stopPropagation(e) {\r\n\r\n\tif (e.stopPropagation) {\r\n\t\te.stopPropagation();\r\n\t} else if (e.originalEvent) {  // In case of Leaflet event.\r\n\t\te.originalEvent._stopped = true;\r\n\t} else {\r\n\t\te.cancelBubble = true;\r\n\t}\r\n\r\n\treturn this;\r\n}\r\n\r\n// @function disableScrollPropagation(el: HTMLElement): this\r\n// Adds `stopPropagation` to the element's `'wheel'` events (plus browser variants).\r\nexport function disableScrollPropagation(el) {\r\n\taddOne(el, 'wheel', stopPropagation);\r\n\treturn this;\r\n}\r\n\r\n// @function disableClickPropagation(el: HTMLElement): this\r\n// Adds `stopPropagation` to the element's `'click'`, `'dblclick'`, `'contextmenu'`,\r\n// `'mousedown'` and `'touchstart'` events (plus browser variants).\r\nexport function disableClickPropagation(el) {\r\n\ton(el, 'mousedown touchstart dblclick contextmenu', stopPropagation);\r\n\tel['_leaflet_disable_click'] = true;\r\n\treturn this;\r\n}\r\n\r\n// @function preventDefault(ev: DOMEvent): this\r\n// Prevents the default action of the DOM Event `ev` from happening (such as\r\n// following a link in the href of the a element, or doing a POST request\r\n// with page reload when a `<form>` is submitted).\r\n// Use it inside listener functions.\r\nexport function preventDefault(e) {\r\n\tif (e.preventDefault) {\r\n\t\te.preventDefault();\r\n\t} else {\r\n\t\te.returnValue = false;\r\n\t}\r\n\treturn this;\r\n}\r\n\r\n// @function stop(ev: DOMEvent): this\r\n// Does `stopPropagation` and `preventDefault` at the same time.\r\nexport function stop(e) {\r\n\tpreventDefault(e);\r\n\tstopPropagation(e);\r\n\treturn this;\r\n}\r\n\r\n// @function getPropagationPath(ev: DOMEvent): Array\r\n// Compatibility polyfill for [`Event.composedPath()`](https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath).\r\n// Returns an array containing the `HTMLElement`s that the given DOM event\r\n// should propagate to (if not stopped).\r\nexport function getPropagationPath(ev) {\r\n\tif (ev.composedPath) {\r\n\t\treturn ev.composedPath();\r\n\t}\r\n\r\n\tvar path = [];\r\n\tvar el = ev.target;\r\n\r\n\twhile (el) {\r\n\t\tpath.push(el);\r\n\t\tel = el.parentNode;\r\n\t}\r\n\treturn path;\r\n}\r\n\r\n\r\n// @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point\r\n// Gets normalized mouse position from a DOM event relative to the\r\n// `container` (border excluded) or to the whole page if not specified.\r\nexport function getMousePosition(e, container) {\r\n\tif (!container) {\r\n\t\treturn new Point(e.clientX, e.clientY);\r\n\t}\r\n\r\n\tvar scale = getScale(container),\r\n\t    offset = scale.boundingClientRect; // left and top  values are in page scale (like the event clientX/Y)\r\n\r\n\treturn new Point(\r\n\t\t// offset.left/top values are in page scale (like clientX/Y),\r\n\t\t// whereas clientLeft/Top (border width) values are the original values (before CSS scale applies).\r\n\t\t(e.clientX - offset.left) / scale.x - container.clientLeft,\r\n\t\t(e.clientY - offset.top) / scale.y - container.clientTop\r\n\t);\r\n}\r\n\r\n\r\n//  except , Safari and\r\n// We need double the scroll pixels (see #7403 and #4538) for all Browsers\r\n// except OSX (Mac) -> 3x, Chrome running on Linux 1x\r\n\r\nvar wheelPxFactor =\r\n\t(Browser.linux && Browser.chrome) ? window.devicePixelRatio :\r\n\tBrowser.mac ? window.devicePixelRatio * 3 :\r\n\twindow.devicePixelRatio > 0 ? 2 * window.devicePixelRatio : 1;\r\n// @function getWheelDelta(ev: DOMEvent): Number\r\n// Gets normalized wheel delta from a wheel DOM event, in vertical\r\n// pixels scrolled (negative if scrolling down).\r\n// Events from pointing devices without precise scrolling are mapped to\r\n// a best guess of 60 pixels.\r\nexport function getWheelDelta(e) {\r\n\treturn (Browser.edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta\r\n\t       (e.deltaY && e.deltaMode === 0) ? -e.deltaY / wheelPxFactor : // Pixels\r\n\t       (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines\r\n\t       (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages\r\n\t       (e.deltaX || e.deltaZ) ? 0 :\t// Skip horizontal/depth wheel events\r\n\t       e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels\r\n\t       (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines\r\n\t       e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages\r\n\t       0;\r\n}\r\n\r\n// check if element really left/entered the event target (for mouseenter/mouseleave)\r\nexport function isExternalTarget(el, e) {\r\n\r\n\tvar related = e.relatedTarget;\r\n\r\n\tif (!related) { return true; }\r\n\r\n\ttry {\r\n\t\twhile (related && (related !== el)) {\r\n\t\t\trelated = related.parentNode;\r\n\t\t}\r\n\t} catch (err) {\r\n\t\treturn false;\r\n\t}\r\n\treturn (related !== el);\r\n}\r\n\r\n// @function addListener(…): this\r\n// Alias to [`L.DomEvent.on`](#domevent-on)\r\nexport {on as addListener};\r\n\r\n// @function removeListener(…): this\r\n// Alias to [`L.DomEvent.off`](#domevent-off)\r\nexport {off as removeListener};\r\n", "import * as Util from '../core/Util';\nimport {Evented} from '../core/Events';\nimport * as DomUtil from '../dom/DomUtil';\n\n\n/*\n * @class PosAnimation\n * @aka L.PosAnimation\n * @inherits Evented\n * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.\n *\n * @example\n * ```js\n * var myPositionMarker = L.marker([48.864716, 2.294694]).addTo(map);\n *\n * myPositionMarker.on(\"click\", function() {\n * \tvar pos = map.latLngToLayerPoint(myPositionMarker.getLatLng());\n * \tpos.y -= 25;\n * \tvar fx = new L.PosAnimation();\n *\n * \tfx.once('end',function() {\n * \t\tpos.y += 25;\n * \t\tfx.run(myPositionMarker._icon, pos, 0.8);\n * \t});\n *\n * \tfx.run(myPositionMarker._icon, pos, 0.3);\n * });\n *\n * ```\n *\n * @constructor L.PosAnimation()\n * Creates a `PosAnimation` object.\n *\n */\n\nexport var PosAnimation = Evented.extend({\n\n\t// @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number)\n\t// Run an animation of a given element to a new position, optionally setting\n\t// duration in seconds (`0.25` by default) and easing linearity factor (3rd\n\t// argument of the [cubic bezier curve](https://cubic-bezier.com/#0,0,.5,1),\n\t// `0.5` by default).\n\trun: function (el, newPos, duration, easeLinearity) {\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._duration = duration || 0.25;\n\t\tthis._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);\n\n\t\tthis._startPos = DomUtil.getPosition(el);\n\t\tthis._offset = newPos.subtract(this._startPos);\n\t\tthis._startTime = +new Date();\n\n\t\t// @event start: Event\n\t\t// Fired when the animation starts\n\t\tthis.fire('start');\n\n\t\tthis._animate();\n\t},\n\n\t// @method stop()\n\t// Stops the animation (if currently running).\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\tthis._step(true);\n\t\tthis._complete();\n\t},\n\n\t_animate: function () {\n\t\t// animation loop\n\t\tthis._animId = Util.requestAnimFrame(this._animate, this);\n\t\tthis._step();\n\t},\n\n\t_step: function (round) {\n\t\tvar elapsed = (+new Date()) - this._startTime,\n\t\t    duration = this._duration * 1000;\n\n\t\tif (elapsed < duration) {\n\t\t\tthis._runFrame(this._easeOut(elapsed / duration), round);\n\t\t} else {\n\t\t\tthis._runFrame(1);\n\t\t\tthis._complete();\n\t\t}\n\t},\n\n\t_runFrame: function (progress, round) {\n\t\tvar pos = this._startPos.add(this._offset.multiplyBy(progress));\n\t\tif (round) {\n\t\t\tpos._round();\n\t\t}\n\t\tDomUtil.setPosition(this._el, pos);\n\n\t\t// @event step: Event\n\t\t// Fired continuously during the animation.\n\t\tthis.fire('step');\n\t},\n\n\t_complete: function () {\n\t\tUtil.cancelAnimFrame(this._animId);\n\n\t\tthis._inProgress = false;\n\t\t// @event end: Event\n\t\t// Fired when the animation ends.\n\t\tthis.fire('end');\n\t},\n\n\t_easeOut: function (t) {\n\t\treturn 1 - Math.pow(1 - t, this._easeOutPower);\n\t}\n});\n", "import * as Util from '../core/Util';\r\nimport {Evented} from '../core/Events';\r\nimport {EPSG3857} from '../geo/crs/CRS.EPSG3857';\r\nimport {Point, toPoint} from '../geometry/Point';\r\nimport {Bounds, toBounds} from '../geometry/Bounds';\r\nimport {LatLng, toLatLng} from '../geo/LatLng';\r\nimport {LatLngBounds, toLatLngBounds} from '../geo/LatLngBounds';\r\nimport Browser from '../core/Browser';\r\nimport * as DomEvent from '../dom/DomEvent';\r\nimport * as DomUtil from '../dom/DomUtil';\r\nimport {PosAnimation} from '../dom/PosAnimation';\r\n\r\n/*\r\n * @class Map\r\n * @aka L.Map\r\n * @inherits Evented\r\n *\r\n * The central class of the API — it is used to create a map on a page and manipulate it.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * // initialize the map on the \"map\" div with a given center and zoom\r\n * var map = L.map('map', {\r\n * \tcenter: [51.505, -0.09],\r\n * \tzoom: 13\r\n * });\r\n * ```\r\n *\r\n */\r\n\r\nexport var Map = Evented.extend({\r\n\r\n\toptions: {\r\n\t\t// @section Map State Options\r\n\t\t// @option crs: CRS = L.CRS.EPSG3857\r\n\t\t// The [Coordinate Reference System](#crs) to use. Don't change this if you're not\r\n\t\t// sure what it means.\r\n\t\tcrs: EPSG3857,\r\n\r\n\t\t// @option center: LatLng = undefined\r\n\t\t// Initial geographic center of the map\r\n\t\tcenter: undefined,\r\n\r\n\t\t// @option zoom: Number = undefined\r\n\t\t// Initial map zoom level\r\n\t\tzoom: undefined,\r\n\r\n\t\t// @option minZoom: Number = *\r\n\t\t// Minimum zoom level of the map.\r\n\t\t// If not specified and at least one `GridLayer` or `TileLayer` is in the map,\r\n\t\t// the lowest of their `minZoom` options will be used instead.\r\n\t\tminZoom: undefined,\r\n\r\n\t\t// @option maxZoom: Number = *\r\n\t\t// Maximum zoom level of the map.\r\n\t\t// If not specified and at least one `GridLayer` or `TileLayer` is in the map,\r\n\t\t// the highest of their `maxZoom` options will be used instead.\r\n\t\tmaxZoom: undefined,\r\n\r\n\t\t// @option layers: Layer[] = []\r\n\t\t// Array of layers that will be added to the map initially\r\n\t\tlayers: [],\r\n\r\n\t\t// @option maxBounds: LatLngBounds = null\r\n\t\t// When this option is set, the map restricts the view to the given\r\n\t\t// geographical bounds, bouncing the user back if the user tries to pan\r\n\t\t// outside the view. To set the restriction dynamically, use\r\n\t\t// [`setMaxBounds`](#map-setmaxbounds) method.\r\n\t\tmaxBounds: undefined,\r\n\r\n\t\t// @option renderer: Renderer = *\r\n\t\t// The default method for drawing vector layers on the map. `L.SVG`\r\n\t\t// or `L.Canvas` by default depending on browser support.\r\n\t\trenderer: undefined,\r\n\r\n\r\n\t\t// @section Animation Options\r\n\t\t// @option zoomAnimation: Boolean = true\r\n\t\t// Whether the map zoom animation is enabled. By default it's enabled\r\n\t\t// in all browsers that support CSS3 Transitions except Android.\r\n\t\tzoomAnimation: true,\r\n\r\n\t\t// @option zoomAnimationThreshold: Number = 4\r\n\t\t// Won't animate zoom if the zoom difference exceeds this value.\r\n\t\tzoomAnimationThreshold: 4,\r\n\r\n\t\t// @option fadeAnimation: Boolean = true\r\n\t\t// Whether the tile fade animation is enabled. By default it's enabled\r\n\t\t// in all browsers that support CSS3 Transitions except Android.\r\n\t\tfadeAnimation: true,\r\n\r\n\t\t// @option markerZoomAnimation: Boolean = true\r\n\t\t// Whether markers animate their zoom with the zoom animation, if disabled\r\n\t\t// they will disappear for the length of the animation. By default it's\r\n\t\t// enabled in all browsers that support CSS3 Transitions except Android.\r\n\t\tmarkerZoomAnimation: true,\r\n\r\n\t\t// @option transform3DLimit: Number = 2^23\r\n\t\t// Defines the maximum size of a CSS translation transform. The default\r\n\t\t// value should not be changed unless a web browser positions layers in\r\n\t\t// the wrong place after doing a large `panBy`.\r\n\t\ttransform3DLimit: 8388608, // Precision limit of a 32-bit float\r\n\r\n\t\t// @section Interaction Options\r\n\t\t// @option zoomSnap: Number = 1\r\n\t\t// Forces the map's zoom level to always be a multiple of this, particularly\r\n\t\t// right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom.\r\n\t\t// By default, the zoom level snaps to the nearest integer; lower values\r\n\t\t// (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0`\r\n\t\t// means the zoom level will not be snapped after `fitBounds` or a pinch-zoom.\r\n\t\tzoomSnap: 1,\r\n\r\n\t\t// @option zoomDelta: Number = 1\r\n\t\t// Controls how much the map's zoom level will change after a\r\n\t\t// [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+`\r\n\t\t// or `-` on the keyboard, or using the [zoom controls](#control-zoom).\r\n\t\t// Values smaller than `1` (e.g. `0.5`) allow for greater granularity.\r\n\t\tzoomDelta: 1,\r\n\r\n\t\t// @option trackResize: Boolean = true\r\n\t\t// Whether the map automatically handles browser window resize to update itself.\r\n\t\ttrackResize: true\r\n\t},\r\n\r\n\tinitialize: function (id, options) { // (HTMLElement or String, Object)\r\n\t\toptions = Util.setOptions(this, options);\r\n\r\n\t\t// Make sure to assign internal flags at the beginning,\r\n\t\t// to avoid inconsistent state in some edge cases.\r\n\t\tthis._handlers = [];\r\n\t\tthis._layers = {};\r\n\t\tthis._zoomBoundLayers = {};\r\n\t\tthis._sizeChanged = true;\r\n\r\n\t\tthis._initContainer(id);\r\n\t\tthis._initLayout();\r\n\r\n\t\t// hack for https://github.com/Leaflet/Leaflet/issues/1980\r\n\t\tthis._onResize = Util.bind(this._onResize, this);\r\n\r\n\t\tthis._initEvents();\r\n\r\n\t\tif (options.maxBounds) {\r\n\t\t\tthis.setMaxBounds(options.maxBounds);\r\n\t\t}\r\n\r\n\t\tif (options.zoom !== undefined) {\r\n\t\t\tthis._zoom = this._limitZoom(options.zoom);\r\n\t\t}\r\n\r\n\t\tif (options.center && options.zoom !== undefined) {\r\n\t\t\tthis.setView(toLatLng(options.center), options.zoom, {reset: true});\r\n\t\t}\r\n\r\n\t\tthis.callInitHooks();\r\n\r\n\t\t// don't animate on browsers without hardware-accelerated transitions or old Android/Opera\r\n\t\tthis._zoomAnimated = DomUtil.TRANSITION && Browser.any3d && !Browser.mobileOpera &&\r\n\t\t\t\tthis.options.zoomAnimation;\r\n\r\n\t\t// zoom transitions run with the same duration for all layers, so if one of transitionend events\r\n\t\t// happens after starting zoom animation (propagating to the map pane), we know that it ended globally\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tthis._createAnimProxy();\r\n\t\t\tDomEvent.on(this._proxy, DomUtil.TRANSITION_END, this._catchTransitionEnd, this);\r\n\t\t}\r\n\r\n\t\tthis._addLayers(this.options.layers);\r\n\t},\r\n\r\n\r\n\t// @section Methods for modifying map state\r\n\r\n\t// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this\r\n\t// Sets the view of the map (geographical center and zoom) with the given\r\n\t// animation options.\r\n\tsetView: function (center, zoom, options) {\r\n\r\n\t\tzoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);\r\n\t\tcenter = this._limitCenter(toLatLng(center), zoom, this.options.maxBounds);\r\n\t\toptions = options || {};\r\n\r\n\t\tthis._stop();\r\n\r\n\t\tif (this._loaded && !options.reset && options !== true) {\r\n\r\n\t\t\tif (options.animate !== undefined) {\r\n\t\t\t\toptions.zoom = Util.extend({animate: options.animate}, options.zoom);\r\n\t\t\t\toptions.pan = Util.extend({animate: options.animate, duration: options.duration}, options.pan);\r\n\t\t\t}\r\n\r\n\t\t\t// try animating pan or zoom\r\n\t\t\tvar moved = (this._zoom !== zoom) ?\r\n\t\t\t\tthis._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :\r\n\t\t\t\tthis._tryAnimatedPan(center, options.pan);\r\n\r\n\t\t\tif (moved) {\r\n\t\t\t\t// prevent resize handler call, the view will refresh after animation anyway\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// animation didn't start, just reset the map view\r\n\t\tthis._resetView(center, zoom, options.pan && options.pan.noMoveStart);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setZoom(zoom: Number, options?: Zoom/pan options): this\r\n\t// Sets the zoom of the map.\r\n\tsetZoom: function (zoom, options) {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthis._zoom = zoom;\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\treturn this.setView(this.getCenter(), zoom, {zoom: options});\r\n\t},\r\n\r\n\t// @method zoomIn(delta?: Number, options?: Zoom options): this\r\n\t// Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).\r\n\tzoomIn: function (delta, options) {\r\n\t\tdelta = delta || (Browser.any3d ? this.options.zoomDelta : 1);\r\n\t\treturn this.setZoom(this._zoom + delta, options);\r\n\t},\r\n\r\n\t// @method zoomOut(delta?: Number, options?: Zoom options): this\r\n\t// Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default).\r\n\tzoomOut: function (delta, options) {\r\n\t\tdelta = delta || (Browser.any3d ? this.options.zoomDelta : 1);\r\n\t\treturn this.setZoom(this._zoom - delta, options);\r\n\t},\r\n\r\n\t// @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this\r\n\t// Zooms the map while keeping a specified geographical point on the map\r\n\t// stationary (e.g. used internally for scroll zoom and double-click zoom).\r\n\t// @alternative\r\n\t// @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this\r\n\t// Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary.\r\n\tsetZoomAround: function (latlng, zoom, options) {\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t    viewHalf = this.getSize().divideBy(2),\r\n\t\t    containerPoint = latlng instanceof Point ? latlng : this.latLngToContainerPoint(latlng),\r\n\r\n\t\t    centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),\r\n\t\t    newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));\r\n\r\n\t\treturn this.setView(newCenter, zoom, {zoom: options});\r\n\t},\r\n\r\n\t_getBoundsCenterZoom: function (bounds, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tbounds = bounds.getBounds ? bounds.getBounds() : toLatLngBounds(bounds);\r\n\r\n\t\tvar paddingTL = toPoint(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t    paddingBR = toPoint(options.paddingBottomRight || options.padding || [0, 0]),\r\n\r\n\t\t    zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));\r\n\r\n\t\tzoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom;\r\n\r\n\t\tif (zoom === Infinity) {\r\n\t\t\treturn {\r\n\t\t\t\tcenter: bounds.getCenter(),\r\n\t\t\t\tzoom: zoom\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tvar paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),\r\n\r\n\t\t    swPoint = this.project(bounds.getSouthWest(), zoom),\r\n\t\t    nePoint = this.project(bounds.getNorthEast(), zoom),\r\n\t\t    center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);\r\n\r\n\t\treturn {\r\n\t\t\tcenter: center,\r\n\t\t\tzoom: zoom\r\n\t\t};\r\n\t},\r\n\r\n\t// @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this\r\n\t// Sets a map view that contains the given geographical bounds with the\r\n\t// maximum zoom level possible.\r\n\tfitBounds: function (bounds, options) {\r\n\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\r\n\t\tif (!bounds.isValid()) {\r\n\t\t\tthrow new Error('Bounds are not valid.');\r\n\t\t}\r\n\r\n\t\tvar target = this._getBoundsCenterZoom(bounds, options);\r\n\t\treturn this.setView(target.center, target.zoom, options);\r\n\t},\r\n\r\n\t// @method fitWorld(options?: fitBounds options): this\r\n\t// Sets a map view that mostly contains the whole world with the maximum\r\n\t// zoom level possible.\r\n\tfitWorld: function (options) {\r\n\t\treturn this.fitBounds([[-90, -180], [90, 180]], options);\r\n\t},\r\n\r\n\t// @method panTo(latlng: LatLng, options?: Pan options): this\r\n\t// Pans the map to a given center.\r\n\tpanTo: function (center, options) { // (LatLng)\r\n\t\treturn this.setView(center, this._zoom, {pan: options});\r\n\t},\r\n\r\n\t// @method panBy(offset: Point, options?: Pan options): this\r\n\t// Pans the map by a given number of pixels (animated).\r\n\tpanBy: function (offset, options) {\r\n\t\toffset = toPoint(offset).round();\r\n\t\toptions = options || {};\r\n\r\n\t\tif (!offset.x && !offset.y) {\r\n\t\t\treturn this.fire('moveend');\r\n\t\t}\r\n\t\t// If we pan too far, Chrome gets issues with tiles\r\n\t\t// and makes them disappear or appear in the wrong place (slightly offset) #2602\r\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) {\r\n\t\t\tthis._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom());\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (!this._panAnim) {\r\n\t\t\tthis._panAnim = new PosAnimation();\r\n\r\n\t\t\tthis._panAnim.on({\r\n\t\t\t\t'step': this._onPanTransitionStep,\r\n\t\t\t\t'end': this._onPanTransitionEnd\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\t// don't fire movestart if animating inertia\r\n\t\tif (!options.noMoveStart) {\r\n\t\t\tthis.fire('movestart');\r\n\t\t}\r\n\r\n\t\t// animate pan unless animate: false specified\r\n\t\tif (options.animate !== false) {\r\n\t\t\tDomUtil.addClass(this._mapPane, 'leaflet-pan-anim');\r\n\r\n\t\t\tvar newPos = this._getMapPanePos().subtract(offset).round();\r\n\t\t\tthis._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);\r\n\t\t} else {\r\n\t\t\tthis._rawPanBy(offset);\r\n\t\t\tthis.fire('move').fire('moveend');\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this\r\n\t// Sets the view of the map (geographical center and zoom) performing a smooth\r\n\t// pan-zoom animation.\r\n\tflyTo: function (targetCenter, targetZoom, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tif (options.animate === false || !Browser.any3d) {\r\n\t\t\treturn this.setView(targetCenter, targetZoom, options);\r\n\t\t}\r\n\r\n\t\tthis._stop();\r\n\r\n\t\tvar from = this.project(this.getCenter()),\r\n\t\t    to = this.project(targetCenter),\r\n\t\t    size = this.getSize(),\r\n\t\t    startZoom = this._zoom;\r\n\r\n\t\ttargetCenter = toLatLng(targetCenter);\r\n\t\ttargetZoom = targetZoom === undefined ? startZoom : targetZoom;\r\n\r\n\t\tvar w0 = Math.max(size.x, size.y),\r\n\t\t    w1 = w0 * this.getZoomScale(startZoom, targetZoom),\r\n\t\t    u1 = (to.distanceTo(from)) || 1,\r\n\t\t    rho = 1.42,\r\n\t\t    rho2 = rho * rho;\r\n\r\n\t\tfunction r(i) {\r\n\t\t\tvar s1 = i ? -1 : 1,\r\n\t\t\t    s2 = i ? w1 : w0,\r\n\t\t\t    t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1,\r\n\t\t\t    b1 = 2 * s2 * rho2 * u1,\r\n\t\t\t    b = t1 / b1,\r\n\t\t\t    sq = Math.sqrt(b * b + 1) - b;\r\n\r\n\t\t\t    // workaround for floating point precision bug when sq = 0, log = -Infinite,\r\n\t\t\t    // thus triggering an infinite loop in flyTo\r\n\t\t\t    var log = sq < 0.000000001 ? -18 : Math.log(sq);\r\n\r\n\t\t\treturn log;\r\n\t\t}\r\n\r\n\t\tfunction sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\r\n\t\tfunction cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\r\n\t\tfunction tanh(n) { return sinh(n) / cosh(n); }\r\n\r\n\t\tvar r0 = r(0);\r\n\r\n\t\tfunction w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); }\r\n\t\tfunction u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; }\r\n\r\n\t\tfunction easeOut(t) { return 1 - Math.pow(1 - t, 1.5); }\r\n\r\n\t\tvar start = Date.now(),\r\n\t\t    S = (r(1) - r0) / rho,\r\n\t\t    duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8;\r\n\r\n\t\tfunction frame() {\r\n\t\t\tvar t = (Date.now() - start) / duration,\r\n\t\t\t    s = easeOut(t) * S;\r\n\r\n\t\t\tif (t <= 1) {\r\n\t\t\t\tthis._flyToFrame = Util.requestAnimFrame(frame, this);\r\n\r\n\t\t\t\tthis._move(\r\n\t\t\t\t\tthis.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom),\r\n\t\t\t\t\tthis.getScaleZoom(w0 / w(s), startZoom),\r\n\t\t\t\t\t{flyTo: true});\r\n\r\n\t\t\t} else {\r\n\t\t\t\tthis\r\n\t\t\t\t\t._move(targetCenter, targetZoom)\r\n\t\t\t\t\t._moveEnd(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._moveStart(true, options.noMoveStart);\r\n\r\n\t\tframe.call(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this\r\n\t// Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto),\r\n\t// but takes a bounds parameter like [`fitBounds`](#map-fitbounds).\r\n\tflyToBounds: function (bounds, options) {\r\n\t\tvar target = this._getBoundsCenterZoom(bounds, options);\r\n\t\treturn this.flyTo(target.center, target.zoom, options);\r\n\t},\r\n\r\n\t// @method setMaxBounds(bounds: LatLngBounds): this\r\n\t// Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option).\r\n\tsetMaxBounds: function (bounds) {\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\r\n\t\tif (this.listens('moveend', this._panInsideMaxBounds)) {\r\n\t\t\tthis.off('moveend', this._panInsideMaxBounds);\r\n\t\t}\r\n\r\n\t\tif (!bounds.isValid()) {\r\n\t\t\tthis.options.maxBounds = null;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tthis.options.maxBounds = bounds;\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._panInsideMaxBounds();\r\n\t\t}\r\n\r\n\t\treturn this.on('moveend', this._panInsideMaxBounds);\r\n\t},\r\n\r\n\t// @method setMinZoom(zoom: Number): this\r\n\t// Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option).\r\n\tsetMinZoom: function (zoom) {\r\n\t\tvar oldZoom = this.options.minZoom;\r\n\t\tthis.options.minZoom = zoom;\r\n\r\n\t\tif (this._loaded && oldZoom !== zoom) {\r\n\t\t\tthis.fire('zoomlevelschange');\r\n\r\n\t\t\tif (this.getZoom() < this.options.minZoom) {\r\n\t\t\t\treturn this.setZoom(zoom);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setMaxZoom(zoom: Number): this\r\n\t// Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option).\r\n\tsetMaxZoom: function (zoom) {\r\n\t\tvar oldZoom = this.options.maxZoom;\r\n\t\tthis.options.maxZoom = zoom;\r\n\r\n\t\tif (this._loaded && oldZoom !== zoom) {\r\n\t\t\tthis.fire('zoomlevelschange');\r\n\r\n\t\t\tif (this.getZoom() > this.options.maxZoom) {\r\n\t\t\t\treturn this.setZoom(zoom);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this\r\n\t// Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any.\r\n\tpanInsideBounds: function (bounds, options) {\r\n\t\tthis._enforcingBounds = true;\r\n\t\tvar center = this.getCenter(),\r\n\t\t    newCenter = this._limitCenter(center, this._zoom, toLatLngBounds(bounds));\r\n\r\n\t\tif (!center.equals(newCenter)) {\r\n\t\t\tthis.panTo(newCenter, options);\r\n\t\t}\r\n\r\n\t\tthis._enforcingBounds = false;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method panInside(latlng: LatLng, options?: padding options): this\r\n\t// Pans the map the minimum amount to make the `latlng` visible. Use\r\n\t// padding options to fit the display to more restricted bounds.\r\n\t// If `latlng` is already within the (optionally padded) display bounds,\r\n\t// the map will not be panned.\r\n\tpanInside: function (latlng, options) {\r\n\t\toptions = options || {};\r\n\r\n\t\tvar paddingTL = toPoint(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t    paddingBR = toPoint(options.paddingBottomRight || options.padding || [0, 0]),\r\n\t\t    pixelCenter = this.project(this.getCenter()),\r\n\t\t    pixelPoint = this.project(latlng),\r\n\t\t    pixelBounds = this.getPixelBounds(),\r\n\t\t    paddedBounds = toBounds([pixelBounds.min.add(paddingTL), pixelBounds.max.subtract(paddingBR)]),\r\n\t\t    paddedSize = paddedBounds.getSize();\r\n\r\n\t\tif (!paddedBounds.contains(pixelPoint)) {\r\n\t\t\tthis._enforcingBounds = true;\r\n\t\t\tvar centerOffset = pixelPoint.subtract(paddedBounds.getCenter());\r\n\t\t\tvar offset = paddedBounds.extend(pixelPoint).getSize().subtract(paddedSize);\r\n\t\t\tpixelCenter.x += centerOffset.x < 0 ? -offset.x : offset.x;\r\n\t\t\tpixelCenter.y += centerOffset.y < 0 ? -offset.y : offset.y;\r\n\t\t\tthis.panTo(this.unproject(pixelCenter), options);\r\n\t\t\tthis._enforcingBounds = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method invalidateSize(options: Zoom/pan options): this\r\n\t// Checks if the map container size changed and updates the map if so —\r\n\t// call it after you've changed the map size dynamically, also animating\r\n\t// pan by default. If `options.pan` is `false`, panning will not occur.\r\n\t// If `options.debounceMoveend` is `true`, it will delay `moveend` event so\r\n\t// that it doesn't happen often even if the method is called many\r\n\t// times in a row.\r\n\r\n\t// @alternative\r\n\t// @method invalidateSize(animate: Boolean): this\r\n\t// Checks if the map container size changed and updates the map if so —\r\n\t// call it after you've changed the map size dynamically, also animating\r\n\t// pan by default.\r\n\tinvalidateSize: function (options) {\r\n\t\tif (!this._loaded) { return this; }\r\n\r\n\t\toptions = Util.extend({\r\n\t\t\tanimate: false,\r\n\t\t\tpan: true\r\n\t\t}, options === true ? {animate: true} : options);\r\n\r\n\t\tvar oldSize = this.getSize();\r\n\t\tthis._sizeChanged = true;\r\n\t\tthis._lastCenter = null;\r\n\r\n\t\tvar newSize = this.getSize(),\r\n\t\t    oldCenter = oldSize.divideBy(2).round(),\r\n\t\t    newCenter = newSize.divideBy(2).round(),\r\n\t\t    offset = oldCenter.subtract(newCenter);\r\n\r\n\t\tif (!offset.x && !offset.y) { return this; }\r\n\r\n\t\tif (options.animate && options.pan) {\r\n\t\t\tthis.panBy(offset);\r\n\r\n\t\t} else {\r\n\t\t\tif (options.pan) {\r\n\t\t\t\tthis._rawPanBy(offset);\r\n\t\t\t}\r\n\r\n\t\t\tthis.fire('move');\r\n\r\n\t\t\tif (options.debounceMoveend) {\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\tthis._sizeTimer = setTimeout(Util.bind(this.fire, this, 'moveend'), 200);\r\n\t\t\t} else {\r\n\t\t\t\tthis.fire('moveend');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// @section Map state change events\r\n\t\t// @event resize: ResizeEvent\r\n\t\t// Fired when the map is resized.\r\n\t\treturn this.fire('resize', {\r\n\t\t\toldSize: oldSize,\r\n\t\t\tnewSize: newSize\r\n\t\t});\r\n\t},\r\n\r\n\t// @section Methods for modifying map state\r\n\t// @method stop(): this\r\n\t// Stops the currently running `panTo` or `flyTo` animation, if any.\r\n\tstop: function () {\r\n\t\tthis.setZoom(this._limitZoom(this._zoom));\r\n\t\tif (!this.options.zoomSnap) {\r\n\t\t\tthis.fire('viewreset');\r\n\t\t}\r\n\t\treturn this._stop();\r\n\t},\r\n\r\n\t// @section Geolocation methods\r\n\t// @method locate(options?: Locate options): this\r\n\t// Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound)\r\n\t// event with location data on success or a [`locationerror`](#map-locationerror) event on failure,\r\n\t// and optionally sets the map view to the user's location with respect to\r\n\t// detection accuracy (or to the world view if geolocation failed).\r\n\t// Note that, if your page doesn't use HTTPS, this method will fail in\r\n\t// modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins))\r\n\t// See `Locate options` for more details.\r\n\tlocate: function (options) {\r\n\r\n\t\toptions = this._locateOptions = Util.extend({\r\n\t\t\ttimeout: 10000,\r\n\t\t\twatch: false\r\n\t\t\t// setView: false\r\n\t\t\t// maxZoom: <Number>\r\n\t\t\t// maximumAge: 0\r\n\t\t\t// enableHighAccuracy: false\r\n\t\t}, options);\r\n\r\n\t\tif (!('geolocation' in navigator)) {\r\n\t\t\tthis._handleGeolocationError({\r\n\t\t\t\tcode: 0,\r\n\t\t\t\tmessage: 'Geolocation not supported.'\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar onResponse = Util.bind(this._handleGeolocationResponse, this),\r\n\t\t    onError = Util.bind(this._handleGeolocationError, this);\r\n\r\n\t\tif (options.watch) {\r\n\t\t\tthis._locationWatchId =\r\n\t\t\t        navigator.geolocation.watchPosition(onResponse, onError, options);\r\n\t\t} else {\r\n\t\t\tnavigator.geolocation.getCurrentPosition(onResponse, onError, options);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method stopLocate(): this\r\n\t// Stops watching location previously initiated by `map.locate({watch: true})`\r\n\t// and aborts resetting the map view if map.locate was called with\r\n\t// `{setView: true}`.\r\n\tstopLocate: function () {\r\n\t\tif (navigator.geolocation && navigator.geolocation.clearWatch) {\r\n\t\t\tnavigator.geolocation.clearWatch(this._locationWatchId);\r\n\t\t}\r\n\t\tif (this._locateOptions) {\r\n\t\t\tthis._locateOptions.setView = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_handleGeolocationError: function (error) {\r\n\t\tif (!this._container._leaflet_id) { return; }\r\n\r\n\t\tvar c = error.code,\r\n\t\t    message = error.message ||\r\n\t\t            (c === 1 ? 'permission denied' :\r\n\t\t            (c === 2 ? 'position unavailable' : 'timeout'));\r\n\r\n\t\tif (this._locateOptions.setView && !this._loaded) {\r\n\t\t\tthis.fitWorld();\r\n\t\t}\r\n\r\n\t\t// @section Location events\r\n\t\t// @event locationerror: ErrorEvent\r\n\t\t// Fired when geolocation (using the [`locate`](#map-locate) method) failed.\r\n\t\tthis.fire('locationerror', {\r\n\t\t\tcode: c,\r\n\t\t\tmessage: 'Geolocation error: ' + message + '.'\r\n\t\t});\r\n\t},\r\n\r\n\t_handleGeolocationResponse: function (pos) {\r\n\t\tif (!this._container._leaflet_id) { return; }\r\n\r\n\t\tvar lat = pos.coords.latitude,\r\n\t\t    lng = pos.coords.longitude,\r\n\t\t    latlng = new LatLng(lat, lng),\r\n\t\t    bounds = latlng.toBounds(pos.coords.accuracy * 2),\r\n\t\t    options = this._locateOptions;\r\n\r\n\t\tif (options.setView) {\r\n\t\t\tvar zoom = this.getBoundsZoom(bounds);\r\n\t\t\tthis.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tbounds: bounds,\r\n\t\t\ttimestamp: pos.timestamp\r\n\t\t};\r\n\r\n\t\tfor (var i in pos.coords) {\r\n\t\t\tif (typeof pos.coords[i] === 'number') {\r\n\t\t\t\tdata[i] = pos.coords[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// @event locationfound: LocationEvent\r\n\t\t// Fired when geolocation (using the [`locate`](#map-locate) method)\r\n\t\t// went successfully.\r\n\t\tthis.fire('locationfound', data);\r\n\t},\r\n\r\n\t// TODO Appropriate docs section?\r\n\t// @section Other Methods\r\n\t// @method addHandler(name: String, HandlerClass: Function): this\r\n\t// Adds a new `Handler` to the map, given its name and constructor function.\r\n\taddHandler: function (name, HandlerClass) {\r\n\t\tif (!HandlerClass) { return this; }\r\n\r\n\t\tvar handler = this[name] = new HandlerClass(this);\r\n\r\n\t\tthis._handlers.push(handler);\r\n\r\n\t\tif (this.options[name]) {\r\n\t\t\thandler.enable();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method remove(): this\r\n\t// Destroys the map and clears all related event listeners.\r\n\tremove: function () {\r\n\r\n\t\tthis._initEvents(true);\r\n\t\tif (this.options.maxBounds) { this.off('moveend', this._panInsideMaxBounds); }\r\n\r\n\t\tif (this._containerId !== this._container._leaflet_id) {\r\n\t\t\tthrow new Error('Map container is being reused by another instance');\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\t// throws error in IE6-8\r\n\t\t\tdelete this._container._leaflet_id;\r\n\t\t\tdelete this._containerId;\r\n\t\t} catch (e) {\r\n\t\t\t/*eslint-disable */\r\n\t\t\tthis._container._leaflet_id = undefined;\r\n\t\t\t/* eslint-enable */\r\n\t\t\tthis._containerId = undefined;\r\n\t\t}\r\n\r\n\t\tif (this._locationWatchId !== undefined) {\r\n\t\t\tthis.stopLocate();\r\n\t\t}\r\n\r\n\t\tthis._stop();\r\n\r\n\t\tDomUtil.remove(this._mapPane);\r\n\r\n\t\tif (this._clearControlPos) {\r\n\t\t\tthis._clearControlPos();\r\n\t\t}\r\n\t\tif (this._resizeRequest) {\r\n\t\t\tUtil.cancelAnimFrame(this._resizeRequest);\r\n\t\t\tthis._resizeRequest = null;\r\n\t\t}\r\n\r\n\t\tthis._clearHandlers();\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\t// @section Map state change events\r\n\t\t\t// @event unload: Event\r\n\t\t\t// Fired when the map is destroyed with [remove](#map-remove) method.\r\n\t\t\tthis.fire('unload');\r\n\t\t}\r\n\r\n\t\tvar i;\r\n\t\tfor (i in this._layers) {\r\n\t\t\tthis._layers[i].remove();\r\n\t\t}\r\n\t\tfor (i in this._panes) {\r\n\t\t\tDomUtil.remove(this._panes[i]);\r\n\t\t}\r\n\r\n\t\tthis._layers = [];\r\n\t\tthis._panes = [];\r\n\t\tdelete this._mapPane;\r\n\t\tdelete this._renderer;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\t// @method createPane(name: String, container?: HTMLElement): HTMLElement\r\n\t// Creates a new [map pane](#map-pane) with the given name if it doesn't exist already,\r\n\t// then returns it. The pane is created as a child of `container`, or\r\n\t// as a child of the main map pane if not set.\r\n\tcreatePane: function (name, container) {\r\n\t\tvar className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''),\r\n\t\t    pane = DomUtil.create('div', className, container || this._mapPane);\r\n\r\n\t\tif (name) {\r\n\t\t\tthis._panes[name] = pane;\r\n\t\t}\r\n\t\treturn pane;\r\n\t},\r\n\r\n\t// @section Methods for Getting Map State\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the geographical center of the map view\r\n\tgetCenter: function () {\r\n\t\tthis._checkIfLoaded();\r\n\r\n\t\tif (this._lastCenter && !this._moved()) {\r\n\t\t\treturn this._lastCenter.clone();\r\n\t\t}\r\n\t\treturn this.layerPointToLatLng(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// @method getZoom(): Number\r\n\t// Returns the current zoom level of the map view\r\n\tgetZoom: function () {\r\n\t\treturn this._zoom;\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Returns the geographical bounds visible in the current map view\r\n\tgetBounds: function () {\r\n\t\tvar bounds = this.getPixelBounds(),\r\n\t\t    sw = this.unproject(bounds.getBottomLeft()),\r\n\t\t    ne = this.unproject(bounds.getTopRight());\r\n\r\n\t\treturn new LatLngBounds(sw, ne);\r\n\t},\r\n\r\n\t// @method getMinZoom(): Number\r\n\t// Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default.\r\n\tgetMinZoom: function () {\r\n\t\treturn this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom;\r\n\t},\r\n\r\n\t// @method getMaxZoom(): Number\r\n\t// Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers).\r\n\tgetMaxZoom: function () {\r\n\t\treturn this.options.maxZoom === undefined ?\r\n\t\t\t(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :\r\n\t\t\tthis.options.maxZoom;\r\n\t},\r\n\r\n\t// @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean, padding?: Point): Number\r\n\t// Returns the maximum zoom level on which the given bounds fit to the map\r\n\t// view in its entirety. If `inside` (optional) is set to `true`, the method\r\n\t// instead returns the minimum zoom level on which the map view fits into\r\n\t// the given bounds in its entirety.\r\n\tgetBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number\r\n\t\tbounds = toLatLngBounds(bounds);\r\n\t\tpadding = toPoint(padding || [0, 0]);\r\n\r\n\t\tvar zoom = this.getZoom() || 0,\r\n\t\t    min = this.getMinZoom(),\r\n\t\t    max = this.getMaxZoom(),\r\n\t\t    nw = bounds.getNorthWest(),\r\n\t\t    se = bounds.getSouthEast(),\r\n\t\t    size = this.getSize().subtract(padding),\r\n\t\t    boundsSize = toBounds(this.project(se, zoom), this.project(nw, zoom)).getSize(),\r\n\t\t    snap = Browser.any3d ? this.options.zoomSnap : 1,\r\n\t\t    scalex = size.x / boundsSize.x,\r\n\t\t    scaley = size.y / boundsSize.y,\r\n\t\t    scale = inside ? Math.max(scalex, scaley) : Math.min(scalex, scaley);\r\n\r\n\t\tzoom = this.getScaleZoom(scale, zoom);\r\n\r\n\t\tif (snap) {\r\n\t\t\tzoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level\r\n\t\t\tzoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap;\r\n\t\t}\r\n\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t},\r\n\r\n\t// @method getSize(): Point\r\n\t// Returns the current size of the map container (in pixels).\r\n\tgetSize: function () {\r\n\t\tif (!this._size || this._sizeChanged) {\r\n\t\t\tthis._size = new Point(\r\n\t\t\t\tthis._container.clientWidth || 0,\r\n\t\t\t\tthis._container.clientHeight || 0);\r\n\r\n\t\t\tthis._sizeChanged = false;\r\n\t\t}\r\n\t\treturn this._size.clone();\r\n\t},\r\n\r\n\t// @method getPixelBounds(): Bounds\r\n\t// Returns the bounds of the current map view in projected pixel\r\n\t// coordinates (sometimes useful in layer and overlay implementations).\r\n\tgetPixelBounds: function (center, zoom) {\r\n\t\tvar topLeftPoint = this._getTopLeftPoint(center, zoom);\r\n\t\treturn new Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));\r\n\t},\r\n\r\n\t// TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to\r\n\t// the map pane? \"left point of the map layer\" can be confusing, specially\r\n\t// since there can be negative offsets.\r\n\t// @method getPixelOrigin(): Point\r\n\t// Returns the projected pixel coordinates of the top left point of\r\n\t// the map layer (useful in custom layer and overlay implementations).\r\n\tgetPixelOrigin: function () {\r\n\t\tthis._checkIfLoaded();\r\n\t\treturn this._pixelOrigin;\r\n\t},\r\n\r\n\t// @method getPixelWorldBounds(zoom?: Number): Bounds\r\n\t// Returns the world's bounds in pixel coordinates for zoom level `zoom`.\r\n\t// If `zoom` is omitted, the map's current zoom level is used.\r\n\tgetPixelWorldBounds: function (zoom) {\r\n\t\treturn this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom);\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\r\n\t// @method getPane(pane: String|HTMLElement): HTMLElement\r\n\t// Returns a [map pane](#map-pane), given its name or its HTML element (its identity).\r\n\tgetPane: function (pane) {\r\n\t\treturn typeof pane === 'string' ? this._panes[pane] : pane;\r\n\t},\r\n\r\n\t// @method getPanes(): Object\r\n\t// Returns a plain object containing the names of all [panes](#map-pane) as keys and\r\n\t// the panes as values.\r\n\tgetPanes: function () {\r\n\t\treturn this._panes;\r\n\t},\r\n\r\n\t// @method getContainer: HTMLElement\r\n\t// Returns the HTML element that contains the map.\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\r\n\t// @section Conversion Methods\r\n\r\n\t// @method getZoomScale(toZoom: Number, fromZoom: Number): Number\r\n\t// Returns the scale factor to be applied to a map transition from zoom level\r\n\t// `fromZoom` to `toZoom`. Used internally to help with zoom animations.\r\n\tgetZoomScale: function (toZoom, fromZoom) {\r\n\t\t// TODO replace with universal implementation after refactoring projections\r\n\t\tvar crs = this.options.crs;\r\n\t\tfromZoom = fromZoom === undefined ? this._zoom : fromZoom;\r\n\t\treturn crs.scale(toZoom) / crs.scale(fromZoom);\r\n\t},\r\n\r\n\t// @method getScaleZoom(scale: Number, fromZoom: Number): Number\r\n\t// Returns the zoom level that the map would end up at, if it is at `fromZoom`\r\n\t// level and everything is scaled by a factor of `scale`. Inverse of\r\n\t// [`getZoomScale`](#map-getZoomScale).\r\n\tgetScaleZoom: function (scale, fromZoom) {\r\n\t\tvar crs = this.options.crs;\r\n\t\tfromZoom = fromZoom === undefined ? this._zoom : fromZoom;\r\n\t\tvar zoom = crs.zoom(scale * crs.scale(fromZoom));\r\n\t\treturn isNaN(zoom) ? Infinity : zoom;\r\n\t},\r\n\r\n\t// @method project(latlng: LatLng, zoom: Number): Point\r\n\t// Projects a geographical coordinate `LatLng` according to the projection\r\n\t// of the map's CRS, then scales it according to `zoom` and the CRS's\r\n\t// `Transformation`. The result is pixel coordinate relative to\r\n\t// the CRS origin.\r\n\tproject: function (latlng, zoom) {\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.latLngToPoint(toLatLng(latlng), zoom);\r\n\t},\r\n\r\n\t// @method unproject(point: Point, zoom: Number): LatLng\r\n\t// Inverse of [`project`](#map-project).\r\n\tunproject: function (point, zoom) {\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.pointToLatLng(toPoint(point), zoom);\r\n\t},\r\n\r\n\t// @method layerPointToLatLng(point: Point): LatLng\r\n\t// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),\r\n\t// returns the corresponding geographical coordinate (for the current zoom level).\r\n\tlayerPointToLatLng: function (point) {\r\n\t\tvar projectedPoint = toPoint(point).add(this.getPixelOrigin());\r\n\t\treturn this.unproject(projectedPoint);\r\n\t},\r\n\r\n\t// @method latLngToLayerPoint(latlng: LatLng): Point\r\n\t// Given a geographical coordinate, returns the corresponding pixel coordinate\r\n\t// relative to the [origin pixel](#map-getpixelorigin).\r\n\tlatLngToLayerPoint: function (latlng) {\r\n\t\tvar projectedPoint = this.project(toLatLng(latlng))._round();\r\n\t\treturn projectedPoint._subtract(this.getPixelOrigin());\r\n\t},\r\n\r\n\t// @method wrapLatLng(latlng: LatLng): LatLng\r\n\t// Returns a `LatLng` where `lat` and `lng` has been wrapped according to the\r\n\t// map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the\r\n\t// CRS's bounds.\r\n\t// By default this means longitude is wrapped around the dateline so its\r\n\t// value is between -180 and +180 degrees.\r\n\twrapLatLng: function (latlng) {\r\n\t\treturn this.options.crs.wrapLatLng(toLatLng(latlng));\r\n\t},\r\n\r\n\t// @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds\r\n\t// Returns a `LatLngBounds` with the same size as the given one, ensuring that\r\n\t// its center is within the CRS's bounds.\r\n\t// By default this means the center longitude is wrapped around the dateline so its\r\n\t// value is between -180 and +180 degrees, and the majority of the bounds\r\n\t// overlaps the CRS's bounds.\r\n\twrapLatLngBounds: function (latlng) {\r\n\t\treturn this.options.crs.wrapLatLngBounds(toLatLngBounds(latlng));\r\n\t},\r\n\r\n\t// @method distance(latlng1: LatLng, latlng2: LatLng): Number\r\n\t// Returns the distance between two geographical coordinates according to\r\n\t// the map's CRS. By default this measures distance in meters.\r\n\tdistance: function (latlng1, latlng2) {\r\n\t\treturn this.options.crs.distance(toLatLng(latlng1), toLatLng(latlng2));\r\n\t},\r\n\r\n\t// @method containerPointToLayerPoint(point: Point): Point\r\n\t// Given a pixel coordinate relative to the map container, returns the corresponding\r\n\t// pixel coordinate relative to the [origin pixel](#map-getpixelorigin).\r\n\tcontainerPointToLayerPoint: function (point) { // (Point)\r\n\t\treturn toPoint(point).subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t// @method layerPointToContainerPoint(point: Point): Point\r\n\t// Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin),\r\n\t// returns the corresponding pixel coordinate relative to the map container.\r\n\tlayerPointToContainerPoint: function (point) { // (Point)\r\n\t\treturn toPoint(point).add(this._getMapPanePos());\r\n\t},\r\n\r\n\t// @method containerPointToLatLng(point: Point): LatLng\r\n\t// Given a pixel coordinate relative to the map container, returns\r\n\t// the corresponding geographical coordinate (for the current zoom level).\r\n\tcontainerPointToLatLng: function (point) {\r\n\t\tvar layerPoint = this.containerPointToLayerPoint(toPoint(point));\r\n\t\treturn this.layerPointToLatLng(layerPoint);\r\n\t},\r\n\r\n\t// @method latLngToContainerPoint(latlng: LatLng): Point\r\n\t// Given a geographical coordinate, returns the corresponding pixel coordinate\r\n\t// relative to the map container.\r\n\tlatLngToContainerPoint: function (latlng) {\r\n\t\treturn this.layerPointToContainerPoint(this.latLngToLayerPoint(toLatLng(latlng)));\r\n\t},\r\n\r\n\t// @method mouseEventToContainerPoint(ev: MouseEvent): Point\r\n\t// Given a MouseEvent object, returns the pixel coordinate relative to the\r\n\t// map container where the event took place.\r\n\tmouseEventToContainerPoint: function (e) {\r\n\t\treturn DomEvent.getMousePosition(e, this._container);\r\n\t},\r\n\r\n\t// @method mouseEventToLayerPoint(ev: MouseEvent): Point\r\n\t// Given a MouseEvent object, returns the pixel coordinate relative to\r\n\t// the [origin pixel](#map-getpixelorigin) where the event took place.\r\n\tmouseEventToLayerPoint: function (e) {\r\n\t\treturn this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));\r\n\t},\r\n\r\n\t// @method mouseEventToLatLng(ev: MouseEvent): LatLng\r\n\t// Given a MouseEvent object, returns geographical coordinate where the\r\n\t// event took place.\r\n\tmouseEventToLatLng: function (e) { // (MouseEvent)\r\n\t\treturn this.layerPointToLatLng(this.mouseEventToLayerPoint(e));\r\n\t},\r\n\r\n\r\n\t// map initialization methods\r\n\r\n\t_initContainer: function (id) {\r\n\t\tvar container = this._container = DomUtil.get(id);\r\n\r\n\t\tif (!container) {\r\n\t\t\tthrow new Error('Map container not found.');\r\n\t\t} else if (container._leaflet_id) {\r\n\t\t\tthrow new Error('Map container is already initialized.');\r\n\t\t}\r\n\r\n\t\tDomEvent.on(container, 'scroll', this._onScroll, this);\r\n\t\tthis._containerId = Util.stamp(container);\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar container = this._container;\r\n\r\n\t\tthis._fadeAnimated = this.options.fadeAnimation && Browser.any3d;\r\n\r\n\t\tDomUtil.addClass(container, 'leaflet-container' +\r\n\t\t\t(Browser.touch ? ' leaflet-touch' : '') +\r\n\t\t\t(Browser.retina ? ' leaflet-retina' : '') +\r\n\t\t\t(Browser.ielt9 ? ' leaflet-oldie' : '') +\r\n\t\t\t(Browser.safari ? ' leaflet-safari' : '') +\r\n\t\t\t(this._fadeAnimated ? ' leaflet-fade-anim' : ''));\r\n\r\n\t\tvar position = DomUtil.getStyle(container, 'position');\r\n\r\n\t\tif (position !== 'absolute' && position !== 'relative' && position !== 'fixed' && position !== 'sticky') {\r\n\t\t\tcontainer.style.position = 'relative';\r\n\t\t}\r\n\r\n\t\tthis._initPanes();\r\n\r\n\t\tif (this._initControlPos) {\r\n\t\t\tthis._initControlPos();\r\n\t\t}\r\n\t},\r\n\r\n\t_initPanes: function () {\r\n\t\tvar panes = this._panes = {};\r\n\t\tthis._paneRenderers = {};\r\n\r\n\t\t// @section\r\n\t\t//\r\n\t\t// Panes are DOM elements used to control the ordering of layers on the map. You\r\n\t\t// can access panes with [`map.getPane`](#map-getpane) or\r\n\t\t// [`map.getPanes`](#map-getpanes) methods. New panes can be created with the\r\n\t\t// [`map.createPane`](#map-createpane) method.\r\n\t\t//\r\n\t\t// Every map has the following default panes that differ only in zIndex.\r\n\t\t//\r\n\t\t// @pane mapPane: HTMLElement = 'auto'\r\n\t\t// Pane that contains all other map panes\r\n\r\n\t\tthis._mapPane = this.createPane('mapPane', this._container);\r\n\t\tDomUtil.setPosition(this._mapPane, new Point(0, 0));\r\n\r\n\t\t// @pane tilePane: HTMLElement = 200\r\n\t\t// Pane for `GridLayer`s and `TileLayer`s\r\n\t\tthis.createPane('tilePane');\r\n\t\t// @pane overlayPane: HTMLElement = 400\r\n\t\t// Pane for vectors (`Path`s, like `Polyline`s and `Polygon`s), `ImageOverlay`s and `VideoOverlay`s\r\n\t\tthis.createPane('overlayPane');\r\n\t\t// @pane shadowPane: HTMLElement = 500\r\n\t\t// Pane for overlay shadows (e.g. `Marker` shadows)\r\n\t\tthis.createPane('shadowPane');\r\n\t\t// @pane markerPane: HTMLElement = 600\r\n\t\t// Pane for `Icon`s of `Marker`s\r\n\t\tthis.createPane('markerPane');\r\n\t\t// @pane tooltipPane: HTMLElement = 650\r\n\t\t// Pane for `Tooltip`s.\r\n\t\tthis.createPane('tooltipPane');\r\n\t\t// @pane popupPane: HTMLElement = 700\r\n\t\t// Pane for `Popup`s.\r\n\t\tthis.createPane('popupPane');\r\n\r\n\t\tif (!this.options.markerZoomAnimation) {\r\n\t\t\tDomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide');\r\n\t\t\tDomUtil.addClass(panes.shadowPane, 'leaflet-zoom-hide');\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// private methods that modify map state\r\n\r\n\t// @section Map state change events\r\n\t_resetView: function (center, zoom, noMoveStart) {\r\n\t\tDomUtil.setPosition(this._mapPane, new Point(0, 0));\r\n\r\n\t\tvar loading = !this._loaded;\r\n\t\tthis._loaded = true;\r\n\t\tzoom = this._limitZoom(zoom);\r\n\r\n\t\tthis.fire('viewprereset');\r\n\r\n\t\tvar zoomChanged = this._zoom !== zoom;\r\n\t\tthis\r\n\t\t\t._moveStart(zoomChanged, noMoveStart)\r\n\t\t\t._move(center, zoom)\r\n\t\t\t._moveEnd(zoomChanged);\r\n\r\n\t\t// @event viewreset: Event\r\n\t\t// Fired when the map needs to redraw its content (this usually happens\r\n\t\t// on map zoom or load). Very useful for creating custom overlays.\r\n\t\tthis.fire('viewreset');\r\n\r\n\t\t// @event load: Event\r\n\t\t// Fired when the map is initialized (when its center and zoom are set\r\n\t\t// for the first time).\r\n\t\tif (loading) {\r\n\t\t\tthis.fire('load');\r\n\t\t}\r\n\t},\r\n\r\n\t_moveStart: function (zoomChanged, noMoveStart) {\r\n\t\t// @event zoomstart: Event\r\n\t\t// Fired when the map zoom is about to change (e.g. before zoom animation).\r\n\t\t// @event movestart: Event\r\n\t\t// Fired when the view of the map starts changing (e.g. user starts dragging the map).\r\n\t\tif (zoomChanged) {\r\n\t\t\tthis.fire('zoomstart');\r\n\t\t}\r\n\t\tif (!noMoveStart) {\r\n\t\t\tthis.fire('movestart');\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_move: function (center, zoom, data, supressEvent) {\r\n\t\tif (zoom === undefined) {\r\n\t\t\tzoom = this._zoom;\r\n\t\t}\r\n\t\tvar zoomChanged = this._zoom !== zoom;\r\n\r\n\t\tthis._zoom = zoom;\r\n\t\tthis._lastCenter = center;\r\n\t\tthis._pixelOrigin = this._getNewPixelOrigin(center);\r\n\r\n\t\tif (!supressEvent) {\r\n\t\t\t// @event zoom: Event\r\n\t\t\t// Fired repeatedly during any change in zoom level,\r\n\t\t\t// including zoom and fly animations.\r\n\t\t\tif (zoomChanged || (data && data.pinch)) {\t// Always fire 'zoom' if pinching because #3530\r\n\t\t\t\tthis.fire('zoom', data);\r\n\t\t\t}\r\n\r\n\t\t\t// @event move: Event\r\n\t\t\t// Fired repeatedly during any movement of the map,\r\n\t\t\t// including pan and fly animations.\r\n\t\t\tthis.fire('move', data);\r\n\t\t} else if (data && data.pinch) {\t// Always fire 'zoom' if pinching because #3530\r\n\t\t\tthis.fire('zoom', data);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_moveEnd: function (zoomChanged) {\r\n\t\t// @event zoomend: Event\r\n\t\t// Fired when the map zoom changed, after any animations.\r\n\t\tif (zoomChanged) {\r\n\t\t\tthis.fire('zoomend');\r\n\t\t}\r\n\r\n\t\t// @event moveend: Event\r\n\t\t// Fired when the center of the map stops changing\r\n\t\t// (e.g. user stopped dragging the map or after non-centered zoom).\r\n\t\treturn this.fire('moveend');\r\n\t},\r\n\r\n\t_stop: function () {\r\n\t\tUtil.cancelAnimFrame(this._flyToFrame);\r\n\t\tif (this._panAnim) {\r\n\t\t\tthis._panAnim.stop();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_rawPanBy: function (offset) {\r\n\t\tDomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));\r\n\t},\r\n\r\n\t_getZoomSpan: function () {\r\n\t\treturn this.getMaxZoom() - this.getMinZoom();\r\n\t},\r\n\r\n\t_panInsideMaxBounds: function () {\r\n\t\tif (!this._enforcingBounds) {\r\n\t\t\tthis.panInsideBounds(this.options.maxBounds);\r\n\t\t}\r\n\t},\r\n\r\n\t_checkIfLoaded: function () {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthrow new Error('Set map center and zoom first.');\r\n\t\t}\r\n\t},\r\n\r\n\t// DOM event handling\r\n\r\n\t// @section Interaction events\r\n\t_initEvents: function (remove) {\r\n\t\tthis._targets = {};\r\n\t\tthis._targets[Util.stamp(this._container)] = this;\r\n\r\n\t\tvar onOff = remove ? DomEvent.off : DomEvent.on;\r\n\r\n\t\t// @event click: MouseEvent\r\n\t\t// Fired when the user clicks (or taps) the map.\r\n\t\t// @event dblclick: MouseEvent\r\n\t\t// Fired when the user double-clicks (or double-taps) the map.\r\n\t\t// @event mousedown: MouseEvent\r\n\t\t// Fired when the user pushes the mouse button on the map.\r\n\t\t// @event mouseup: MouseEvent\r\n\t\t// Fired when the user releases the mouse button on the map.\r\n\t\t// @event mouseover: MouseEvent\r\n\t\t// Fired when the mouse enters the map.\r\n\t\t// @event mouseout: MouseEvent\r\n\t\t// Fired when the mouse leaves the map.\r\n\t\t// @event mousemove: MouseEvent\r\n\t\t// Fired while the mouse moves over the map.\r\n\t\t// @event contextmenu: MouseEvent\r\n\t\t// Fired when the user pushes the right mouse button on the map, prevents\r\n\t\t// default browser context menu from showing if there are listeners on\r\n\t\t// this event. Also fired on mobile when the user holds a single touch\r\n\t\t// for a second (also called long press).\r\n\t\t// @event keypress: KeyboardEvent\r\n\t\t// Fired when the user presses a key from the keyboard that produces a character value while the map is focused.\r\n\t\t// @event keydown: KeyboardEvent\r\n\t\t// Fired when the user presses a key from the keyboard while the map is focused. Unlike the `keypress` event,\r\n\t\t// the `keydown` event is fired for keys that produce a character value and for keys\r\n\t\t// that do not produce a character value.\r\n\t\t// @event keyup: KeyboardEvent\r\n\t\t// Fired when the user releases a key from the keyboard while the map is focused.\r\n\t\tonOff(this._container, 'click dblclick mousedown mouseup ' +\r\n\t\t\t'mouseover mouseout mousemove contextmenu keypress keydown keyup', this._handleDOMEvent, this);\r\n\r\n\t\tif (this.options.trackResize) {\r\n\t\t\tonOff(window, 'resize', this._onResize, this);\r\n\t\t}\r\n\r\n\t\tif (Browser.any3d && this.options.transform3DLimit) {\r\n\t\t\t(remove ? this.off : this.on).call(this, 'moveend', this._onMoveEnd);\r\n\t\t}\r\n\t},\r\n\r\n\t_onResize: function () {\r\n\t\tUtil.cancelAnimFrame(this._resizeRequest);\r\n\t\tthis._resizeRequest = Util.requestAnimFrame(\r\n\t\t        function () { this.invalidateSize({debounceMoveend: true}); }, this);\r\n\t},\r\n\r\n\t_onScroll: function () {\r\n\t\tthis._container.scrollTop  = 0;\r\n\t\tthis._container.scrollLeft = 0;\r\n\t},\r\n\r\n\t_onMoveEnd: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\tif (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) {\r\n\t\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have\r\n\t\t\t// a pixel offset on very high values, see: https://jsfiddle.net/dg6r5hhb/\r\n\t\t\tthis._resetView(this.getCenter(), this.getZoom());\r\n\t\t}\r\n\t},\r\n\r\n\t_findEventTargets: function (e, type) {\r\n\t\tvar targets = [],\r\n\t\t    target,\r\n\t\t    isHover = type === 'mouseout' || type === 'mouseover',\r\n\t\t    src = e.target || e.srcElement,\r\n\t\t    dragging = false;\r\n\r\n\t\twhile (src) {\r\n\t\t\ttarget = this._targets[Util.stamp(src)];\r\n\t\t\tif (target && (type === 'click' || type === 'preclick') && this._draggableMoved(target)) {\r\n\t\t\t\t// Prevent firing click after you just dragged an object.\r\n\t\t\t\tdragging = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (target && target.listens(type, true)) {\r\n\t\t\t\tif (isHover && !DomEvent.isExternalTarget(src, e)) { break; }\r\n\t\t\t\ttargets.push(target);\r\n\t\t\t\tif (isHover) { break; }\r\n\t\t\t}\r\n\t\t\tif (src === this._container) { break; }\r\n\t\t\tsrc = src.parentNode;\r\n\t\t}\r\n\t\tif (!targets.length && !dragging && !isHover && this.listens(type, true)) {\r\n\t\t\ttargets = [this];\r\n\t\t}\r\n\t\treturn targets;\r\n\t},\r\n\r\n\t_isClickDisabled: function (el) {\r\n\t\twhile (el && el !== this._container) {\r\n\t\t\tif (el['_leaflet_disable_click']) { return true; }\r\n\t\t\tel = el.parentNode;\r\n\t\t}\r\n\t},\r\n\r\n\t_handleDOMEvent: function (e) {\r\n\t\tvar el = (e.target || e.srcElement);\r\n\t\tif (!this._loaded || el['_leaflet_disable_events'] || e.type === 'click' && this._isClickDisabled(el)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar type = e.type;\r\n\r\n\t\tif (type === 'mousedown') {\r\n\t\t\t// prevents outline when clicking on keyboard-focusable element\r\n\t\t\tDomUtil.preventOutline(el);\r\n\t\t}\r\n\r\n\t\tthis._fireDOMEvent(e, type);\r\n\t},\r\n\r\n\t_mouseEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu'],\r\n\r\n\t_fireDOMEvent: function (e, type, canvasTargets) {\r\n\r\n\t\tif (e.type === 'click') {\r\n\t\t\t// Fire a synthetic 'preclick' event which propagates up (mainly for closing popups).\r\n\t\t\t// @event preclick: MouseEvent\r\n\t\t\t// Fired before mouse click on the map (sometimes useful when you\r\n\t\t\t// want something to happen on click before any existing click\r\n\t\t\t// handlers start running).\r\n\t\t\tvar synth = Util.extend({}, e);\r\n\t\t\tsynth.type = 'preclick';\r\n\t\t\tthis._fireDOMEvent(synth, synth.type, canvasTargets);\r\n\t\t}\r\n\r\n\t\t// Find the layer the event is propagating from and its parents.\r\n\t\tvar targets = this._findEventTargets(e, type);\r\n\r\n\t\tif (canvasTargets) {\r\n\t\t\tvar filtered = []; // pick only targets with listeners\r\n\t\t\tfor (var i = 0; i < canvasTargets.length; i++) {\r\n\t\t\t\tif (canvasTargets[i].listens(type, true)) {\r\n\t\t\t\t\tfiltered.push(canvasTargets[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\ttargets = filtered.concat(targets);\r\n\t\t}\r\n\r\n\t\tif (!targets.length) { return; }\r\n\r\n\t\tif (type === 'contextmenu') {\r\n\t\t\tDomEvent.preventDefault(e);\r\n\t\t}\r\n\r\n\t\tvar target = targets[0];\r\n\t\tvar data = {\r\n\t\t\toriginalEvent: e\r\n\t\t};\r\n\r\n\t\tif (e.type !== 'keypress' && e.type !== 'keydown' && e.type !== 'keyup') {\r\n\t\t\tvar isMarker = target.getLatLng && (!target._radius || target._radius <= 10);\r\n\t\t\tdata.containerPoint = isMarker ?\r\n\t\t\t\tthis.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);\r\n\t\t\tdata.layerPoint = this.containerPointToLayerPoint(data.containerPoint);\r\n\t\t\tdata.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint);\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < targets.length; i++) {\r\n\t\t\ttargets[i].fire(type, data, true);\r\n\t\t\tif (data.originalEvent._stopped ||\r\n\t\t\t\t(targets[i].options.bubblingMouseEvents === false && Util.indexOf(this._mouseEvents, type) !== -1)) { return; }\r\n\t\t}\r\n\t},\r\n\r\n\t_draggableMoved: function (obj) {\r\n\t\tobj = obj.dragging && obj.dragging.enabled() ? obj : this;\r\n\t\treturn (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved());\r\n\t},\r\n\r\n\t_clearHandlers: function () {\r\n\t\tfor (var i = 0, len = this._handlers.length; i < len; i++) {\r\n\t\t\tthis._handlers[i].disable();\r\n\t\t}\r\n\t},\r\n\r\n\t// @section Other Methods\r\n\r\n\t// @method whenReady(fn: Function, context?: Object): this\r\n\t// Runs the given function `fn` when the map gets initialized with\r\n\t// a view (center and zoom) and at least one layer, or immediately\r\n\t// if it's already initialized, optionally passing a function context.\r\n\twhenReady: function (callback, context) {\r\n\t\tif (this._loaded) {\r\n\t\t\tcallback.call(context || this, {target: this});\r\n\t\t} else {\r\n\t\t\tthis.on('load', callback, context);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\r\n\t// private methods for getting map state\r\n\r\n\t_getMapPanePos: function () {\r\n\t\treturn DomUtil.getPosition(this._mapPane) || new Point(0, 0);\r\n\t},\r\n\r\n\t_moved: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\treturn pos && !pos.equals([0, 0]);\r\n\t},\r\n\r\n\t_getTopLeftPoint: function (center, zoom) {\r\n\t\tvar pixelOrigin = center && zoom !== undefined ?\r\n\t\t\tthis._getNewPixelOrigin(center, zoom) :\r\n\t\t\tthis.getPixelOrigin();\r\n\t\treturn pixelOrigin.subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t_getNewPixelOrigin: function (center, zoom) {\r\n\t\tvar viewHalf = this.getSize()._divideBy(2);\r\n\t\treturn this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round();\r\n\t},\r\n\r\n\t_latLngToNewLayerPoint: function (latlng, zoom, center) {\r\n\t\tvar topLeft = this._getNewPixelOrigin(center, zoom);\r\n\t\treturn this.project(latlng, zoom)._subtract(topLeft);\r\n\t},\r\n\r\n\t_latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) {\r\n\t\tvar topLeft = this._getNewPixelOrigin(center, zoom);\r\n\t\treturn toBounds([\r\n\t\t\tthis.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft),\r\n\t\t\tthis.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft)\r\n\t\t]);\r\n\t},\r\n\r\n\t// layer point of the current center\r\n\t_getCenterLayerPoint: function () {\r\n\t\treturn this.containerPointToLayerPoint(this.getSize()._divideBy(2));\r\n\t},\r\n\r\n\t// offset of the specified place to the current center in pixels\r\n\t_getCenterOffset: function (latlng) {\r\n\t\treturn this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// adjust center for view to get inside bounds\r\n\t_limitCenter: function (center, zoom, bounds) {\r\n\r\n\t\tif (!bounds) { return center; }\r\n\r\n\t\tvar centerPoint = this.project(center, zoom),\r\n\t\t    viewHalf = this.getSize().divideBy(2),\r\n\t\t    viewBounds = new Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),\r\n\t\t    offset = this._getBoundsOffset(viewBounds, bounds, zoom);\r\n\r\n\t\t// If offset is less than a pixel, ignore.\r\n\t\t// This prevents unstable projections from getting into\r\n\t\t// an infinite loop of tiny offsets.\r\n\t\tif (Math.abs(offset.x) <= 1 && Math.abs(offset.y) <= 1) {\r\n\t\t\treturn center;\r\n\t\t}\r\n\r\n\t\treturn this.unproject(centerPoint.add(offset), zoom);\r\n\t},\r\n\r\n\t// adjust offset for view to get inside bounds\r\n\t_limitOffset: function (offset, bounds) {\r\n\t\tif (!bounds) { return offset; }\r\n\r\n\t\tvar viewBounds = this.getPixelBounds(),\r\n\t\t    newBounds = new Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));\r\n\r\n\t\treturn offset.add(this._getBoundsOffset(newBounds, bounds));\r\n\t},\r\n\r\n\t// returns offset needed for pxBounds to get inside maxBounds at a specified zoom\r\n\t_getBoundsOffset: function (pxBounds, maxBounds, zoom) {\r\n\t\tvar projectedMaxBounds = toBounds(\r\n\t\t        this.project(maxBounds.getNorthEast(), zoom),\r\n\t\t        this.project(maxBounds.getSouthWest(), zoom)\r\n\t\t    ),\r\n\t\t    minOffset = projectedMaxBounds.min.subtract(pxBounds.min),\r\n\t\t    maxOffset = projectedMaxBounds.max.subtract(pxBounds.max),\r\n\r\n\t\t    dx = this._rebound(minOffset.x, -maxOffset.x),\r\n\t\t    dy = this._rebound(minOffset.y, -maxOffset.y);\r\n\r\n\t\treturn new Point(dx, dy);\r\n\t},\r\n\r\n\t_rebound: function (left, right) {\r\n\t\treturn left + right > 0 ?\r\n\t\t\tMath.round(left - right) / 2 :\r\n\t\t\tMath.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));\r\n\t},\r\n\r\n\t_limitZoom: function (zoom) {\r\n\t\tvar min = this.getMinZoom(),\r\n\t\t    max = this.getMaxZoom(),\r\n\t\t    snap = Browser.any3d ? this.options.zoomSnap : 1;\r\n\t\tif (snap) {\r\n\t\t\tzoom = Math.round(zoom / snap) * snap;\r\n\t\t}\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t},\r\n\r\n\t_onPanTransitionStep: function () {\r\n\t\tthis.fire('move');\r\n\t},\r\n\r\n\t_onPanTransitionEnd: function () {\r\n\t\tDomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');\r\n\t\tthis.fire('moveend');\r\n\t},\r\n\r\n\t_tryAnimatedPan: function (center, options) {\r\n\t\t// difference between the new and current centers in pixels\r\n\t\tvar offset = this._getCenterOffset(center)._trunc();\r\n\r\n\t\t// don't animate too far unless animate: true specified in options\r\n\t\tif ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }\r\n\r\n\t\tthis.panBy(offset, options);\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_createAnimProxy: function () {\r\n\r\n\t\tvar proxy = this._proxy = DomUtil.create('div', 'leaflet-proxy leaflet-zoom-animated');\r\n\t\tthis._panes.mapPane.appendChild(proxy);\r\n\r\n\t\tthis.on('zoomanim', function (e) {\r\n\t\t\tvar prop = DomUtil.TRANSFORM,\r\n\t\t\t    transform = this._proxy.style[prop];\r\n\r\n\t\t\tDomUtil.setTransform(this._proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1));\r\n\r\n\t\t\t// workaround for case when transform is the same and so transitionend event is not fired\r\n\t\t\tif (transform === this._proxy.style[prop] && this._animatingZoom) {\r\n\t\t\t\tthis._onZoomTransitionEnd();\r\n\t\t\t}\r\n\t\t}, this);\r\n\r\n\t\tthis.on('load moveend', this._animMoveEnd, this);\r\n\r\n\t\tthis._on('unload', this._destroyAnimProxy, this);\r\n\t},\r\n\r\n\t_destroyAnimProxy: function () {\r\n\t\tDomUtil.remove(this._proxy);\r\n\t\tthis.off('load moveend', this._animMoveEnd, this);\r\n\t\tdelete this._proxy;\r\n\t},\r\n\r\n\t_animMoveEnd: function () {\r\n\t\tvar c = this.getCenter(),\r\n\t\t    z = this.getZoom();\r\n\t\tDomUtil.setTransform(this._proxy, this.project(c, z), this.getZoomScale(z, 1));\r\n\t},\r\n\r\n\t_catchTransitionEnd: function (e) {\r\n\t\tif (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {\r\n\t\t\tthis._onZoomTransitionEnd();\r\n\t\t}\r\n\t},\r\n\r\n\t_nothingToAnimate: function () {\r\n\t\treturn !this._container.getElementsByClassName('leaflet-zoom-animated').length;\r\n\t},\r\n\r\n\t_tryAnimatedZoom: function (center, zoom, options) {\r\n\r\n\t\tif (this._animatingZoom) { return true; }\r\n\r\n\t\toptions = options || {};\r\n\r\n\t\t// don't animate if disabled, not supported or zoom difference is too large\r\n\t\tif (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||\r\n\t\t        Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }\r\n\r\n\t\t// offset is the pixel coords of the zoom origin relative to the current center\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t    offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale);\r\n\r\n\t\t// don't animate if the zoom origin isn't within one screen from the current center, unless forced\r\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) { return false; }\r\n\r\n\t\tUtil.requestAnimFrame(function () {\r\n\t\t\tthis\r\n\t\t\t    ._moveStart(true, options.noMoveStart || false)\r\n\t\t\t    ._animateZoom(center, zoom, true);\r\n\t\t}, this);\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_animateZoom: function (center, zoom, startAnim, noUpdate) {\r\n\t\tif (!this._mapPane) { return; }\r\n\r\n\t\tif (startAnim) {\r\n\t\t\tthis._animatingZoom = true;\r\n\r\n\t\t\t// remember what center/zoom to set after animation\r\n\t\t\tthis._animateToCenter = center;\r\n\t\t\tthis._animateToZoom = zoom;\r\n\r\n\t\t\tDomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');\r\n\t\t}\r\n\r\n\t\t// @section Other Events\r\n\t\t// @event zoomanim: ZoomAnimEvent\r\n\t\t// Fired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom.\r\n\t\tthis.fire('zoomanim', {\r\n\t\t\tcenter: center,\r\n\t\t\tzoom: zoom,\r\n\t\t\tnoUpdate: noUpdate\r\n\t\t});\r\n\r\n\t\tif (!this._tempFireZoomEvent) {\r\n\t\t\tthis._tempFireZoomEvent = this._zoom !== this._animateToZoom;\r\n\t\t}\r\n\r\n\t\tthis._move(this._animateToCenter, this._animateToZoom, undefined, true);\r\n\r\n\t\t// Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693\r\n\t\tsetTimeout(Util.bind(this._onZoomTransitionEnd, this), 250);\r\n\t},\r\n\r\n\t_onZoomTransitionEnd: function () {\r\n\t\tif (!this._animatingZoom) { return; }\r\n\r\n\t\tif (this._mapPane) {\r\n\t\t\tDomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');\r\n\t\t}\r\n\r\n\t\tthis._animatingZoom = false;\r\n\r\n\t\tthis._move(this._animateToCenter, this._animateToZoom, undefined, true);\r\n\r\n\t\tif (this._tempFireZoomEvent) {\r\n\t\t\tthis.fire('zoom');\r\n\t\t}\r\n\t\tdelete this._tempFireZoomEvent;\r\n\r\n\t\tthis.fire('move');\r\n\r\n\t\tthis._moveEnd(true);\r\n\t}\r\n});\r\n\r\n// @section\r\n\r\n// @factory L.map(id: String, options?: Map options)\r\n// Instantiates a map object given the DOM ID of a `<div>` element\r\n// and optionally an object literal with `Map options`.\r\n//\r\n// @alternative\r\n// @factory L.map(el: HTMLElement, options?: Map options)\r\n// Instantiates a map object given an instance of a `<div>` HTML element\r\n// and optionally an object literal with `Map options`.\r\nexport function createMap(id, options) {\r\n\treturn new Map(id, options);\r\n}\r\n", "\r\nimport {Class} from '../core/Class';\r\nimport {Map} from '../map/Map';\r\nimport * as Util from '../core/Util';\r\nimport * as DomUtil from '../dom/DomUtil';\r\n\r\n/*\r\n * @class Control\r\n * @aka L.Control\r\n * @inherits Class\r\n *\r\n * L.Control is a base class for implementing map controls. Handles positioning.\r\n * All other controls extend from this class.\r\n */\r\n\r\nexport var Control = Class.extend({\r\n\t// @section\r\n\t// @aka Control Options\r\n\toptions: {\r\n\t\t// @option position: String = 'topright'\r\n\t\t// The position of the control (one of the map corners). Possible values are `'topleft'`,\r\n\t\t// `'topright'`, `'bottomleft'` or `'bottomright'`\r\n\t\tposition: 'topright'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tUtil.setOptions(this, options);\r\n\t},\r\n\r\n\t/* @section\r\n\t * Classes extending L.Control will inherit the following methods:\r\n\t *\r\n\t * @method getPosition: string\r\n\t * Returns the position of the control.\r\n\t */\r\n\tgetPosition: function () {\r\n\t\treturn this.options.position;\r\n\t},\r\n\r\n\t// @method setPosition(position: string): this\r\n\t// Sets the position of the control.\r\n\tsetPosition: function (position) {\r\n\t\tvar map = this._map;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.removeControl(this);\r\n\t\t}\r\n\r\n\t\tthis.options.position = position;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.addControl(this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getContainer: HTMLElement\r\n\t// Returns the HTMLElement that contains the control.\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method addTo(map: Map): this\r\n\t// Adds the control to the given map.\r\n\taddTo: function (map) {\r\n\t\tthis.remove();\r\n\t\tthis._map = map;\r\n\r\n\t\tvar container = this._container = this.onAdd(map),\r\n\t\t    pos = this.getPosition(),\r\n\t\t    corner = map._controlCorners[pos];\r\n\r\n\t\tDomUtil.addClass(container, 'leaflet-control');\r\n\r\n\t\tif (pos.indexOf('bottom') !== -1) {\r\n\t\t\tcorner.insertBefore(container, corner.firstChild);\r\n\t\t} else {\r\n\t\t\tcorner.appendChild(container);\r\n\t\t}\r\n\r\n\t\tthis._map.on('unload', this.remove, this);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method remove: this\r\n\t// Removes the control from the map it is currently active on.\r\n\tremove: function () {\r\n\t\tif (!this._map) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tDomUtil.remove(this._container);\r\n\r\n\t\tif (this.onRemove) {\r\n\t\t\tthis.onRemove(this._map);\r\n\t\t}\r\n\r\n\t\tthis._map.off('unload', this.remove, this);\r\n\t\tthis._map = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_refocusOnMap: function (e) {\r\n\t\t// if map exists and event is not a keyboard event\r\n\t\tif (this._map && e && e.screenX > 0 && e.screenY > 0) {\r\n\t\t\tthis._map.getContainer().focus();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nexport var control = function (options) {\r\n\treturn new Control(options);\r\n};\r\n\r\n/* @section Extension methods\r\n * @uninheritable\r\n *\r\n * Every control should extend from `L.Control` and (re-)implement the following methods.\r\n *\r\n * @method onAdd(map: Map): HTMLElement\r\n * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo).\r\n *\r\n * @method onRemove(map: Map)\r\n * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove).\r\n */\r\n\r\n/* @namespace Map\r\n * @section Methods for Layers and Controls\r\n */\r\nMap.include({\r\n\t// @method addControl(control: Control): this\r\n\t// Adds the given control to the map\r\n\taddControl: function (control) {\r\n\t\tcontrol.addTo(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeControl(control: Control): this\r\n\t// Removes the given control from the map\r\n\tremoveControl: function (control) {\r\n\t\tcontrol.remove();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initControlPos: function () {\r\n\t\tvar corners = this._controlCorners = {},\r\n\t\t    l = 'leaflet-',\r\n\t\t    container = this._controlContainer =\r\n\t\t            DomUtil.create('div', l + 'control-container', this._container);\r\n\r\n\t\tfunction createCorner(vSide, hSide) {\r\n\t\t\tvar className = l + vSide + ' ' + l + hSide;\r\n\r\n\t\t\tcorners[vSide + hSide] = DomUtil.create('div', className, container);\r\n\t\t}\r\n\r\n\t\tcreateCorner('top', 'left');\r\n\t\tcreateCorner('top', 'right');\r\n\t\tcreateCorner('bottom', 'left');\r\n\t\tcreateCorner('bottom', 'right');\r\n\t},\r\n\r\n\t_clearControlPos: function () {\r\n\t\tfor (var i in this._controlCorners) {\r\n\t\t\tDomUtil.remove(this._controlCorners[i]);\r\n\t\t}\r\n\t\tDomUtil.remove(this._controlContainer);\r\n\t\tdelete this._controlCorners;\r\n\t\tdelete this._controlContainer;\r\n\t}\r\n});\r\n", "\r\nimport {Control} from './Control';\r\nimport * as Util from '../core/Util';\r\nimport * as DomEvent from '../dom/DomEvent';\r\nimport * as DomUtil from '../dom/DomUtil';\r\n\r\n/*\r\n * @class Control.Layers\r\n * @aka L.Control.Layers\r\n * @inherits Control\r\n *\r\n * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](https://leafletjs.com/examples/layers-control/)). Extends `Control`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var baseLayers = {\r\n * \t\"Mapbox\": mapbox,\r\n * \t\"OpenStreetMap\": osm\r\n * };\r\n *\r\n * var overlays = {\r\n * \t\"Marker\": marker,\r\n * \t\"Roads\": roadsLayer\r\n * };\r\n *\r\n * L.control.layers(baseLayers, overlays).addTo(map);\r\n * ```\r\n *\r\n * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values:\r\n *\r\n * ```js\r\n * {\r\n *     \"<someName1>\": layer1,\r\n *     \"<someName2>\": layer2\r\n * }\r\n * ```\r\n *\r\n * The layer names can contain HTML, which allows you to add additional styling to the items:\r\n *\r\n * ```js\r\n * {\"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>\": myLayer}\r\n * ```\r\n */\r\n\r\nexport var Layers = Control.extend({\r\n\t// @section\r\n\t// @aka Control.Layers options\r\n\toptions: {\r\n\t\t// @option collapsed: Boolean = true\r\n\t\t// If `true`, the control will be collapsed into an icon and expanded on mouse hover, touch, or keyboard activation.\r\n\t\tcollapsed: true,\r\n\t\tposition: 'topright',\r\n\r\n\t\t// @option autoZIndex: Boolean = true\r\n\t\t// If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off.\r\n\t\tautoZIndex: true,\r\n\r\n\t\t// @option hideSingleBase: Boolean = false\r\n\t\t// If `true`, the base layers in the control will be hidden when there is only one.\r\n\t\thideSingleBase: false,\r\n\r\n\t\t// @option sortLayers: Boolean = false\r\n\t\t// Whether to sort the layers. When `false`, layers will keep the order\r\n\t\t// in which they were added to the control.\r\n\t\tsortLayers: false,\r\n\r\n\t\t// @option sortFunction: Function = *\r\n\t\t// A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)\r\n\t\t// that will be used for sorting the layers, when `sortLayers` is `true`.\r\n\t\t// The function receives both the `L.Layer` instances and their names, as in\r\n\t\t// `sortFunction(layerA, layerB, nameA, nameB)`.\r\n\t\t// By default, it sorts layers alphabetically by their name.\r\n\t\tsortFunction: function (layerA, layerB, nameA, nameB) {\r\n\t\t\treturn nameA < nameB ? -1 : (nameB < nameA ? 1 : 0);\r\n\t\t}\r\n\t},\r\n\r\n\tinitialize: function (baseLayers, overlays, options) {\r\n\t\tUtil.setOptions(this, options);\r\n\r\n\t\tthis._layerControlInputs = [];\r\n\t\tthis._layers = [];\r\n\t\tthis._lastZIndex = 0;\r\n\t\tthis._handlingClick = false;\r\n\t\tthis._preventClick = false;\r\n\r\n\t\tfor (var i in baseLayers) {\r\n\t\t\tthis._addLayer(baseLayers[i], i);\r\n\t\t}\r\n\r\n\t\tfor (i in overlays) {\r\n\t\t\tthis._addLayer(overlays[i], i, true);\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._initLayout();\r\n\t\tthis._update();\r\n\r\n\t\tthis._map = map;\r\n\t\tmap.on('zoomend', this._checkDisabledLayers, this);\r\n\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\t\t\tthis._layers[i].layer.on('add remove', this._onLayerChange, this);\r\n\t\t}\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tControl.prototype.addTo.call(this, map);\r\n\t\t// Trigger expand after Layers Control has been inserted into DOM so that is now has an actual height.\r\n\t\treturn this._expandIfNotCollapsed();\r\n\t},\r\n\r\n\tonRemove: function () {\r\n\t\tthis._map.off('zoomend', this._checkDisabledLayers, this);\r\n\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\t\t\tthis._layers[i].layer.off('add remove', this._onLayerChange, this);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addBaseLayer(layer: Layer, name: String): this\r\n\t// Adds a base layer (radio button entry) with the given name to the control.\r\n\taddBaseLayer: function (layer, name) {\r\n\t\tthis._addLayer(layer, name);\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method addOverlay(layer: Layer, name: String): this\r\n\t// Adds an overlay (checkbox entry) with the given name to the control.\r\n\taddOverlay: function (layer, name) {\r\n\t\tthis._addLayer(layer, name, true);\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method removeLayer(layer: Layer): this\r\n\t// Remove the given layer from the control.\r\n\tremoveLayer: function (layer) {\r\n\t\tlayer.off('add remove', this._onLayerChange, this);\r\n\r\n\t\tvar obj = this._getLayer(Util.stamp(layer));\r\n\t\tif (obj) {\r\n\t\t\tthis._layers.splice(this._layers.indexOf(obj), 1);\r\n\t\t}\r\n\t\treturn (this._map) ? this._update() : this;\r\n\t},\r\n\r\n\t// @method expand(): this\r\n\t// Expand the control container if collapsed.\r\n\texpand: function () {\r\n\t\tDomUtil.addClass(this._container, 'leaflet-control-layers-expanded');\r\n\t\tthis._section.style.height = null;\r\n\t\tvar acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50);\r\n\t\tif (acceptableHeight < this._section.clientHeight) {\r\n\t\t\tDomUtil.addClass(this._section, 'leaflet-control-layers-scrollbar');\r\n\t\t\tthis._section.style.height = acceptableHeight + 'px';\r\n\t\t} else {\r\n\t\t\tDomUtil.removeClass(this._section, 'leaflet-control-layers-scrollbar');\r\n\t\t}\r\n\t\tthis._checkDisabledLayers();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method collapse(): this\r\n\t// Collapse the control container if expanded.\r\n\tcollapse: function () {\r\n\t\tDomUtil.removeClass(this._container, 'leaflet-control-layers-expanded');\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar className = 'leaflet-control-layers',\r\n\t\t    container = this._container = DomUtil.create('div', className),\r\n\t\t    collapsed = this.options.collapsed;\r\n\r\n\t\t// makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released\r\n\t\tcontainer.setAttribute('aria-haspopup', true);\r\n\r\n\t\tDomEvent.disableClickPropagation(container);\r\n\t\tDomEvent.disableScrollPropagation(container);\r\n\r\n\t\tvar section = this._section = DomUtil.create('section', className + '-list');\r\n\r\n\t\tif (collapsed) {\r\n\t\t\tthis._map.on('click', this.collapse, this);\r\n\r\n\t\t\tDomEvent.on(container, {\r\n\t\t\t\tmouseenter: this._expandSafely,\r\n\t\t\t\tmouseleave: this.collapse\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\tvar link = this._layersLink = DomUtil.create('a', className + '-toggle', container);\r\n\t\tlink.href = '#';\r\n\t\tlink.title = 'Layers';\r\n\t\tlink.setAttribute('role', 'button');\r\n\r\n\t\tDomEvent.on(link, {\r\n\t\t\tkeydown: function (e) {\r\n\t\t\t\tif (e.keyCode === 13) {\r\n\t\t\t\t\tthis._expandSafely();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// Certain screen readers intercept the key event and instead send a click event\r\n\t\t\tclick: function (e) {\r\n\t\t\t\tDomEvent.preventDefault(e);\r\n\t\t\t\tthis._expandSafely();\r\n\t\t\t}\r\n\t\t}, this);\r\n\r\n\t\tif (!collapsed) {\r\n\t\t\tthis.expand();\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList = DomUtil.create('div', className + '-base', section);\r\n\t\tthis._separator = DomUtil.create('div', className + '-separator', section);\r\n\t\tthis._overlaysList = DomUtil.create('div', className + '-overlays', section);\r\n\r\n\t\tcontainer.appendChild(section);\r\n\t},\r\n\r\n\t_getLayer: function (id) {\r\n\t\tfor (var i = 0; i < this._layers.length; i++) {\r\n\r\n\t\t\tif (this._layers[i] && Util.stamp(this._layers[i].layer) === id) {\r\n\t\t\t\treturn this._layers[i];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_addLayer: function (layer, name, overlay) {\r\n\t\tif (this._map) {\r\n\t\t\tlayer.on('add remove', this._onLayerChange, this);\r\n\t\t}\r\n\r\n\t\tthis._layers.push({\r\n\t\t\tlayer: layer,\r\n\t\t\tname: name,\r\n\t\t\toverlay: overlay\r\n\t\t});\r\n\r\n\t\tif (this.options.sortLayers) {\r\n\t\t\tthis._layers.sort(Util.bind(function (a, b) {\r\n\t\t\t\treturn this.options.sortFunction(a.layer, b.layer, a.name, b.name);\r\n\t\t\t}, this));\r\n\t\t}\r\n\r\n\t\tif (this.options.autoZIndex && layer.setZIndex) {\r\n\t\t\tthis._lastZIndex++;\r\n\t\t\tlayer.setZIndex(this._lastZIndex);\r\n\t\t}\r\n\r\n\t\tthis._expandIfNotCollapsed();\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._container) { return this; }\r\n\r\n\t\tDomUtil.empty(this._baseLayersList);\r\n\t\tDomUtil.empty(this._overlaysList);\r\n\r\n\t\tthis._layerControlInputs = [];\r\n\t\tvar baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0;\r\n\r\n\t\tfor (i = 0; i < this._layers.length; i++) {\r\n\t\t\tobj = this._layers[i];\r\n\t\t\tthis._addItem(obj);\r\n\t\t\toverlaysPresent = overlaysPresent || obj.overlay;\r\n\t\t\tbaseLayersPresent = baseLayersPresent || !obj.overlay;\r\n\t\t\tbaseLayersCount += !obj.overlay ? 1 : 0;\r\n\t\t}\r\n\r\n\t\t// Hide base layers section if there's only one layer.\r\n\t\tif (this.options.hideSingleBase) {\r\n\t\t\tbaseLayersPresent = baseLayersPresent && baseLayersCount > 1;\r\n\t\t\tthis._baseLayersList.style.display = baseLayersPresent ? '' : 'none';\r\n\t\t}\r\n\r\n\t\tthis._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_onLayerChange: function (e) {\r\n\t\tif (!this._handlingClick) {\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tvar obj = this._getLayer(Util.stamp(e.target));\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Layer events\r\n\t\t// @event baselayerchange: LayersControlEvent\r\n\t\t// Fired when the base layer is changed through the [layers control](#control-layers).\r\n\t\t// @event overlayadd: LayersControlEvent\r\n\t\t// Fired when an overlay is selected through the [layers control](#control-layers).\r\n\t\t// @event overlayremove: LayersControlEvent\r\n\t\t// Fired when an overlay is deselected through the [layers control](#control-layers).\r\n\t\t// @namespace Control.Layers\r\n\t\tvar type = obj.overlay ?\r\n\t\t\t(e.type === 'add' ? 'overlayadd' : 'overlayremove') :\r\n\t\t\t(e.type === 'add' ? 'baselayerchange' : null);\r\n\r\n\t\tif (type) {\r\n\t\t\tthis._map.fire(type, obj);\r\n\t\t}\r\n\t},\r\n\r\n\t// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see https://stackoverflow.com/a/119079)\r\n\t_createRadioElement: function (name, checked) {\r\n\r\n\t\tvar radioHtml = '<input type=\"radio\" class=\"leaflet-control-layers-selector\" name=\"' +\r\n\t\t\t\tname + '\"' + (checked ? ' checked=\"checked\"' : '') + '/>';\r\n\r\n\t\tvar radioFragment = document.createElement('div');\r\n\t\tradioFragment.innerHTML = radioHtml;\r\n\r\n\t\treturn radioFragment.firstChild;\r\n\t},\r\n\r\n\t_addItem: function (obj) {\r\n\t\tvar label = document.createElement('label'),\r\n\t\t    checked = this._map.hasLayer(obj.layer),\r\n\t\t    input;\r\n\r\n\t\tif (obj.overlay) {\r\n\t\t\tinput = document.createElement('input');\r\n\t\t\tinput.type = 'checkbox';\r\n\t\t\tinput.className = 'leaflet-control-layers-selector';\r\n\t\t\tinput.defaultChecked = checked;\r\n\t\t} else {\r\n\t\t\tinput = this._createRadioElement('leaflet-base-layers_' + Util.stamp(this), checked);\r\n\t\t}\r\n\r\n\t\tthis._layerControlInputs.push(input);\r\n\t\tinput.layerId = Util.stamp(obj.layer);\r\n\r\n\t\tDomEvent.on(input, 'click', this._onInputClick, this);\r\n\r\n\t\tvar name = document.createElement('span');\r\n\t\tname.innerHTML = ' ' + obj.name;\r\n\r\n\t\t// Helps from preventing layer control flicker when checkboxes are disabled\r\n\t\t// https://github.com/Leaflet/Leaflet/issues/2771\r\n\t\tvar holder = document.createElement('span');\r\n\r\n\t\tlabel.appendChild(holder);\r\n\t\tholder.appendChild(input);\r\n\t\tholder.appendChild(name);\r\n\r\n\t\tvar container = obj.overlay ? this._overlaysList : this._baseLayersList;\r\n\t\tcontainer.appendChild(label);\r\n\r\n\t\tthis._checkDisabledLayers();\r\n\t\treturn label;\r\n\t},\r\n\r\n\t_onInputClick: function () {\r\n\t\t// expanding the control on mobile with a click can cause adding a layer - we don't want this\r\n\t\tif (this._preventClick) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar inputs = this._layerControlInputs,\r\n\t\t    input, layer;\r\n\t\tvar addedLayers = [],\r\n\t\t    removedLayers = [];\r\n\r\n\t\tthis._handlingClick = true;\r\n\r\n\t\tfor (var i = inputs.length - 1; i >= 0; i--) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tlayer = this._getLayer(input.layerId).layer;\r\n\r\n\t\t\tif (input.checked) {\r\n\t\t\t\taddedLayers.push(layer);\r\n\t\t\t} else if (!input.checked) {\r\n\t\t\t\tremovedLayers.push(layer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Bugfix issue 2318: Should remove all old layers before readding new ones\r\n\t\tfor (i = 0; i < removedLayers.length; i++) {\r\n\t\t\tif (this._map.hasLayer(removedLayers[i])) {\r\n\t\t\t\tthis._map.removeLayer(removedLayers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (i = 0; i < addedLayers.length; i++) {\r\n\t\t\tif (!this._map.hasLayer(addedLayers[i])) {\r\n\t\t\t\tthis._map.addLayer(addedLayers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tthis._refocusOnMap();\r\n\t},\r\n\r\n\t_checkDisabledLayers: function () {\r\n\t\tvar inputs = this._layerControlInputs,\r\n\t\t    input,\r\n\t\t    layer,\r\n\t\t    zoom = this._map.getZoom();\r\n\r\n\t\tfor (var i = inputs.length - 1; i >= 0; i--) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tlayer = this._getLayer(input.layerId).layer;\r\n\t\t\tinput.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) ||\r\n\t\t\t                 (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom);\r\n\r\n\t\t}\r\n\t},\r\n\r\n\t_expandIfNotCollapsed: function () {\r\n\t\tif (this._map && !this.options.collapsed) {\r\n\t\t\tthis.expand();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_expandSafely: function () {\r\n\t\tvar section = this._section;\r\n\t\tthis._preventClick = true;\r\n\t\tDomEvent.on(section, 'click', DomEvent.preventDefault);\r\n\t\tthis.expand();\r\n\t\tvar that = this;\r\n\t\tsetTimeout(function () {\r\n\t\t\tDomEvent.off(section, 'click', DomEvent.preventDefault);\r\n\t\t\tthat._preventClick = false;\r\n\t\t});\r\n\t}\r\n\r\n});\r\n\r\n\r\n// @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options)\r\n// Creates a layers control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation.\r\nexport var layers = function (baseLayers, overlays, options) {\r\n\treturn new Layers(baseLayers, overlays, options);\r\n};\r\n", "\r\nimport {Control} from './Control';\r\nimport {Map} from '../map/Map';\r\nimport * as DomUtil from '../dom/DomUtil';\r\nimport * as DomEvent from '../dom/DomEvent';\r\n\r\n/*\r\n * @class Control.Zoom\r\n * @aka L.Control.Zoom\r\n * @inherits Control\r\n *\r\n * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`.\r\n */\r\n\r\nexport var Zoom = Control.extend({\r\n\t// @section\r\n\t// @aka Control.Zoom options\r\n\toptions: {\r\n\t\tposition: 'topleft',\r\n\r\n\t\t// @option zoomInText: String = '<span aria-hidden=\"true\">+</span>'\r\n\t\t// The text set on the 'zoom in' button.\r\n\t\tzoomInText: '<span aria-hidden=\"true\">+</span>',\r\n\r\n\t\t// @option zoomInTitle: String = 'Zoom in'\r\n\t\t// The title set on the 'zoom in' button.\r\n\t\tzoomInTitle: 'Zoom in',\r\n\r\n\t\t// @option zoomOutText: String = '<span aria-hidden=\"true\">&#x2212;</span>'\r\n\t\t// The text set on the 'zoom out' button.\r\n\t\tzoomOutText: '<span aria-hidden=\"true\">&#x2212;</span>',\r\n\r\n\t\t// @option zoomOutTitle: String = 'Zoom out'\r\n\t\t// The title set on the 'zoom out' button.\r\n\t\tzoomOutTitle: 'Zoom out'\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tvar zoomName = 'leaflet-control-zoom',\r\n\t\t    container = DomUtil.create('div', zoomName + ' leaflet-bar'),\r\n\t\t    options = this.options;\r\n\r\n\t\tthis._zoomInButton  = this._createButton(options.zoomInText, options.zoomInTitle,\r\n\t\t        zoomName + '-in',  container, this._zoomIn);\r\n\t\tthis._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle,\r\n\t\t        zoomName + '-out', container, this._zoomOut);\r\n\r\n\t\tthis._updateDisabled();\r\n\t\tmap.on('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\t},\r\n\r\n\tdisable: function () {\r\n\t\tthis._disabled = true;\r\n\t\tthis._updateDisabled();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tenable: function () {\r\n\t\tthis._disabled = false;\r\n\t\tthis._updateDisabled();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_zoomIn: function (e) {\r\n\t\tif (!this._disabled && this._map._zoom < this._map.getMaxZoom()) {\r\n\t\t\tthis._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));\r\n\t\t}\r\n\t},\r\n\r\n\t_zoomOut: function (e) {\r\n\t\tif (!this._disabled && this._map._zoom > this._map.getMinZoom()) {\r\n\t\t\tthis._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1));\r\n\t\t}\r\n\t},\r\n\r\n\t_createButton: function (html, title, className, container, fn) {\r\n\t\tvar link = DomUtil.create('a', className, container);\r\n\t\tlink.innerHTML = html;\r\n\t\tlink.href = '#';\r\n\t\tlink.title = title;\r\n\r\n\t\t/*\r\n\t\t * Will force screen readers like VoiceOver to read this as \"Zoom in - button\"\r\n\t\t */\r\n\t\tlink.setAttribute('role', 'button');\r\n\t\tlink.setAttribute('aria-label', title);\r\n\r\n\t\tDomEvent.disableClickPropagation(link);\r\n\t\tDomEvent.on(link, 'click', DomEvent.stop);\r\n\t\tDomEvent.on(link, 'click', fn, this);\r\n\t\tDomEvent.on(link, 'click', this._refocusOnMap, this);\r\n\r\n\t\treturn link;\r\n\t},\r\n\r\n\t_updateDisabled: function () {\r\n\t\tvar map = this._map,\r\n\t\t    className = 'leaflet-disabled';\r\n\r\n\t\tDomUtil.removeClass(this._zoomInButton, className);\r\n\t\tDomUtil.removeClass(this._zoomOutButton, className);\r\n\t\tthis._zoomInButton.setAttribute('aria-disabled', 'false');\r\n\t\tthis._zoomOutButton.setAttribute('aria-disabled', 'false');\r\n\r\n\t\tif (this._disabled || map._zoom === map.getMinZoom()) {\r\n\t\t\tDomUtil.addClass(this._zoomOutButton, className);\r\n\t\t\tthis._zoomOutButton.setAttribute('aria-disabled', 'true');\r\n\t\t}\r\n\t\tif (this._disabled || map._zoom === map.getMaxZoom()) {\r\n\t\t\tDomUtil.addClass(this._zoomInButton, className);\r\n\t\t\tthis._zoomInButton.setAttribute('aria-disabled', 'true');\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// @namespace Map\r\n// @section Control options\r\n// @option zoomControl: Boolean = true\r\n// Whether a [zoom control](#control-zoom) is added to the map by default.\r\nMap.mergeOptions({\r\n\tzoomControl: true\r\n});\r\n\r\nMap.addInitHook(function () {\r\n\tif (this.options.zoomControl) {\r\n\t\t// @section Controls\r\n\t\t// @property zoomControl: Control.Zoom\r\n\t\t// The default zoom control (only available if the\r\n\t\t// [`zoomControl` option](#map-zoomcontrol) was `true` when creating the map).\r\n\t\tthis.zoomControl = new Zoom();\r\n\t\tthis.addControl(this.zoomControl);\r\n\t}\r\n});\r\n\r\n// @namespace Control.Zoom\r\n// @factory L.control.zoom(options: Control.Zoom options)\r\n// Creates a zoom control\r\nexport var zoom = function (options) {\r\n\treturn new Zoom(options);\r\n};\r\n", "\nimport {Control} from './Control';\nimport * as DomUtil from '../dom/DomUtil';\n\n/*\n * @class Control.Scale\n * @aka L.Control.Scale\n * @inherits Control\n *\n * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`.\n *\n * @example\n *\n * ```js\n * L.control.scale().addTo(map);\n * ```\n */\n\nexport var Scale = Control.extend({\n\t// @section\n\t// @aka Control.Scale options\n\toptions: {\n\t\tposition: 'bottomleft',\n\n\t\t// @option maxWidth: Number = 100\n\t\t// Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).\n\t\tmaxWidth: 100,\n\n\t\t// @option metric: Boolean = True\n\t\t// Whether to show the metric scale line (m/km).\n\t\tmetric: true,\n\n\t\t// @option imperial: Boolean = True\n\t\t// Whether to show the imperial scale line (mi/ft).\n\t\timperial: true\n\n\t\t// @option updateWhenIdle: Boolean = false\n\t\t// If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)).\n\t},\n\n\tonAdd: function (map) {\n\t\tvar className = 'leaflet-control-scale',\n\t\t    container = DomUtil.create('div', className),\n\t\t    options = this.options;\n\n\t\tthis._addScales(options, className + '-line', container);\n\n\t\tmap.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t\tmap.whenReady(this._update, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t},\n\n\t_addScales: function (options, className, container) {\n\t\tif (options.metric) {\n\t\t\tthis._mScale = DomUtil.create('div', className, container);\n\t\t}\n\t\tif (options.imperial) {\n\t\t\tthis._iScale = DomUtil.create('div', className, container);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tvar map = this._map,\n\t\t    y = map.getSize().y / 2;\n\n\t\tvar maxMeters = map.distance(\n\t\t\tmap.containerPointToLatLng([0, y]),\n\t\t\tmap.containerPointToLatLng([this.options.maxWidth, y]));\n\n\t\tthis._updateScales(maxMeters);\n\t},\n\n\t_updateScales: function (maxMeters) {\n\t\tif (this.options.metric && maxMeters) {\n\t\t\tthis._updateMetric(maxMeters);\n\t\t}\n\t\tif (this.options.imperial && maxMeters) {\n\t\t\tthis._updateImperial(maxMeters);\n\t\t}\n\t},\n\n\t_updateMetric: function (maxMeters) {\n\t\tvar meters = this._getRoundNum(maxMeters),\n\t\t    label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\n\t\tthis._updateScale(this._mScale, label, meters / maxMeters);\n\t},\n\n\t_updateImperial: function (maxMeters) {\n\t\tvar maxFeet = maxMeters * 3.2808399,\n\t\t    maxMiles, miles, feet;\n\n\t\tif (maxFeet > 5280) {\n\t\t\tmaxMiles = maxFeet / 5280;\n\t\t\tmiles = this._getRoundNum(maxMiles);\n\t\t\tthis._updateScale(this._iScale, miles + ' mi', miles / maxMiles);\n\n\t\t} else {\n\t\t\tfeet = this._getRoundNum(maxFeet);\n\t\t\tthis._updateScale(this._iScale, feet + ' ft', feet / maxFeet);\n\t\t}\n\t},\n\n\t_updateScale: function (scale, text, ratio) {\n\t\tscale.style.width = Math.round(this.options.maxWidth * ratio) + 'px';\n\t\tscale.innerHTML = text;\n\t},\n\n\t_getRoundNum: function (num) {\n\t\tvar pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n\t\t    d = num / pow10;\n\n\t\td = d >= 10 ? 10 :\n\t\t    d >= 5 ? 5 :\n\t\t    d >= 3 ? 3 :\n\t\t    d >= 2 ? 2 : 1;\n\n\t\treturn pow10 * d;\n\t}\n});\n\n\n// @factory L.control.scale(options?: Control.Scale options)\n// Creates an scale control with the given options.\nexport var scale = function (options) {\n\treturn new Scale(options);\n};\n", "\r\nimport {Control} from './Control';\r\nimport {Map} from '../map/Map';\r\nimport * as Util from '../core/Util';\r\nimport * as DomEvent from '../dom/DomEvent';\r\nimport * as DomUtil from '../dom/DomUtil';\r\nimport Browser from '../core/Browser';\r\n\r\nvar ukrainianFlag = '<svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" class=\"leaflet-attribution-flag\"><path fill=\"#4C7BE1\" d=\"M0 0h12v4H0z\"/><path fill=\"#FFD500\" d=\"M0 4h12v3H0z\"/><path fill=\"#E0BC00\" d=\"M0 7h12v1H0z\"/></svg>';\r\n\r\n\r\n/*\r\n * @class Control.Attribution\r\n * @aka L.Control.Attribution\r\n * @inherits Control\r\n *\r\n * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control.\r\n */\r\n\r\nexport var Attribution = Control.extend({\r\n\t// @section\r\n\t// @aka Control.Attribution options\r\n\toptions: {\r\n\t\tposition: 'bottomright',\r\n\r\n\t\t// @option prefix: String|false = 'Leaflet'\r\n\t\t// The HTML text shown before the attributions. Pass `false` to disable.\r\n\t\tprefix: '<a href=\"https://leafletjs.com\" title=\"A JavaScript library for interactive maps\">' + (Browser.inlineSvg ? ukrainianFlag + ' ' : '') + 'Leaflet</a>'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tUtil.setOptions(this, options);\r\n\r\n\t\tthis._attributions = {};\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tmap.attributionControl = this;\r\n\t\tthis._container = DomUtil.create('div', 'leaflet-control-attribution');\r\n\t\tDomEvent.disableClickPropagation(this._container);\r\n\r\n\t\t// TODO ugly, refactor\r\n\t\tfor (var i in map._layers) {\r\n\t\t\tif (map._layers[i].getAttribution) {\r\n\t\t\t\tthis.addAttribution(map._layers[i].getAttribution());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._update();\r\n\r\n\t\tmap.on('layeradd', this._addAttribution, this);\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('layeradd', this._addAttribution, this);\r\n\t},\r\n\r\n\t_addAttribution: function (ev) {\r\n\t\tif (ev.layer.getAttribution) {\r\n\t\t\tthis.addAttribution(ev.layer.getAttribution());\r\n\t\t\tev.layer.once('remove', function () {\r\n\t\t\t\tthis.removeAttribution(ev.layer.getAttribution());\r\n\t\t\t}, this);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setPrefix(prefix: String|false): this\r\n\t// The HTML text shown before the attributions. Pass `false` to disable.\r\n\tsetPrefix: function (prefix) {\r\n\t\tthis.options.prefix = prefix;\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method addAttribution(text: String): this\r\n\t// Adds an attribution text (e.g. `'&copy; OpenStreetMap contributors'`).\r\n\taddAttribution: function (text) {\r\n\t\tif (!text) { return this; }\r\n\r\n\t\tif (!this._attributions[text]) {\r\n\t\t\tthis._attributions[text] = 0;\r\n\t\t}\r\n\t\tthis._attributions[text]++;\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeAttribution(text: String): this\r\n\t// Removes an attribution text.\r\n\tremoveAttribution: function (text) {\r\n\t\tif (!text) { return this; }\r\n\r\n\t\tif (this._attributions[text]) {\r\n\t\t\tthis._attributions[text]--;\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar attribs = [];\r\n\r\n\t\tfor (var i in this._attributions) {\r\n\t\t\tif (this._attributions[i]) {\r\n\t\t\t\tattribs.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar prefixAndAttribs = [];\r\n\r\n\t\tif (this.options.prefix) {\r\n\t\t\tprefixAndAttribs.push(this.options.prefix);\r\n\t\t}\r\n\t\tif (attribs.length) {\r\n\t\t\tprefixAndAttribs.push(attribs.join(', '));\r\n\t\t}\r\n\r\n\t\tthis._container.innerHTML = prefixAndAttribs.join(' <span aria-hidden=\"true\">|</span> ');\r\n\t}\r\n});\r\n\r\n// @namespace Map\r\n// @section Control options\r\n// @option attributionControl: Boolean = true\r\n// Whether a [attribution control](#control-attribution) is added to the map by default.\r\nMap.mergeOptions({\r\n\tattributionControl: true\r\n});\r\n\r\nMap.addInitHook(function () {\r\n\tif (this.options.attributionControl) {\r\n\t\tnew Attribution().addTo(this);\r\n\t}\r\n});\r\n\r\n// @namespace Control.Attribution\r\n// @factory L.control.attribution(options: Control.Attribution options)\r\n// Creates an attribution control.\r\nexport var attribution = function (options) {\r\n\treturn new Attribution(options);\r\n};\r\n", "import {Control, control} from './Control';\nimport {Layers, layers} from './Control.Layers';\nimport {Zoom, zoom} from './Control.Zoom';\nimport {Scale, scale} from './Control.Scale';\nimport {Attribution, attribution} from './Control.Attribution';\n\nControl.Layers = Layers;\nControl.Zoom = Zoom;\nControl.Scale = Scale;\nControl.Attribution = Attribution;\n\ncontrol.layers = layers;\ncontrol.zoom = zoom;\ncontrol.scale = scale;\ncontrol.attribution = attribution;\n\nexport {Control, control};\n", "import {Class} from './Class';\n\n/*\n\tL.Handler is a base class for handler classes that are used internally to inject\n\tinteraction features like dragging to classes like Map and Marker.\n*/\n\n// @class Handler\n// @aka L.Handler\n// Abstract class for map interaction handlers\n\nexport var Handler = Class.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t},\n\n\t// @method enable(): this\n\t// Enables the handler\n\tenable: function () {\n\t\tif (this._enabled) { return this; }\n\n\t\tthis._enabled = true;\n\t\tthis.addHooks();\n\t\treturn this;\n\t},\n\n\t// @method disable(): this\n\t// Disables the handler\n\tdisable: function () {\n\t\tif (!this._enabled) { return this; }\n\n\t\tthis._enabled = false;\n\t\tthis.removeHooks();\n\t\treturn this;\n\t},\n\n\t// @method enabled(): Boolean\n\t// Returns `true` if the handler is enabled\n\tenabled: function () {\n\t\treturn !!this._enabled;\n\t}\n\n\t// @section Extension methods\n\t// Classes inheriting from `Handler` must implement the two following methods:\n\t// @method addHooks()\n\t// Called when the handler is enabled, should add event hooks.\n\t// @method removeHooks()\n\t// Called when the handler is disabled, should remove the event hooks added previously.\n});\n\n// @section There is static function which can be called without instantiating L.Handler:\n// @function addTo(map: Map, name: String): this\n// Adds a new Handler to the given map with the given name.\nHandler.addTo = function (map, name) {\n\tmap.addHandler(name, this);\n\treturn this;\n};\n", "import Browser from './Browser';\nexport {Browser};\n\nexport {Class} from './Class';\n\nimport {Evented} from './Events';\nimport {Events} from './Events';\nexport {Evented};\nexport var Mixin = {Events: Events};\n\nexport {Handler} from './Handler';\n\nimport * as Util from './Util';\nexport {Util};\nexport {extend, bind, stamp, setOptions} from './Util';\n", "import {Evented} from '../core/Events';\r\nimport Browser from '../core/Browser';\r\nimport * as DomEvent from './DomEvent';\r\nimport * as DomUtil from './DomUtil';\r\nimport * as Util from '../core/Util';\r\nimport {Point} from '../geometry/Point';\r\n\r\n/*\r\n * @class Draggable\r\n * @aka L.Draggable\r\n * @inherits Evented\r\n *\r\n * A class for making DOM elements draggable (including touch support).\r\n * Used internally for map and marker dragging. Only works for elements\r\n * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition).\r\n *\r\n * @example\r\n * ```js\r\n * var draggable = new L.Draggable(elementToDrag);\r\n * draggable.enable();\r\n * ```\r\n */\r\n\r\nvar START = Browser.touch ? 'touchstart mousedown' : 'mousedown';\r\n\r\nexport var Draggable = Evented.extend({\r\n\r\n\toptions: {\r\n\t\t// @section\r\n\t\t// @aka Draggable options\r\n\t\t// @option clickTolerance: Number = 3\r\n\t\t// The max number of pixels a user can shift the mouse pointer during a click\r\n\t\t// for it to be considered a valid click (as opposed to a mouse drag).\r\n\t\tclickTolerance: 3\r\n\t},\r\n\r\n\t// @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline?: Boolean, options?: Draggable options)\r\n\t// Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default).\r\n\tinitialize: function (element, dragStartTarget, preventOutline, options) {\r\n\t\tUtil.setOptions(this, options);\r\n\r\n\t\tthis._element = element;\r\n\t\tthis._dragStartTarget = dragStartTarget || element;\r\n\t\tthis._preventOutline = preventOutline;\r\n\t},\r\n\r\n\t// @method enable()\r\n\t// Enables the dragging ability\r\n\tenable: function () {\r\n\t\tif (this._enabled) { return; }\r\n\r\n\t\tDomEvent.on(this._dragStartTarget, START, this._onDown, this);\r\n\r\n\t\tthis._enabled = true;\r\n\t},\r\n\r\n\t// @method disable()\r\n\t// Disables the dragging ability\r\n\tdisable: function () {\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\t// If we're currently dragging this draggable,\r\n\t\t// disabling it counts as first ending the drag.\r\n\t\tif (Draggable._dragging === this) {\r\n\t\t\tthis.finishDrag(true);\r\n\t\t}\r\n\r\n\t\tDomEvent.off(this._dragStartTarget, START, this._onDown, this);\r\n\r\n\t\tthis._enabled = false;\r\n\t\tthis._moved = false;\r\n\t},\r\n\r\n\t_onDown: function (e) {\r\n\t\t// Ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\tthis._moved = false;\r\n\r\n\t\tif (DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; }\r\n\r\n\t\tif (e.touches && e.touches.length !== 1) {\r\n\t\t\t// Finish dragging to avoid conflict with touchZoom\r\n\t\t\tif (Draggable._dragging === this) {\r\n\t\t\t\tthis.finishDrag();\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }\r\n\t\tDraggable._dragging = this;  // Prevent dragging multiple objects at once.\r\n\r\n\t\tif (this._preventOutline) {\r\n\t\t\tDomUtil.preventOutline(this._element);\r\n\t\t}\r\n\r\n\t\tDomUtil.disableImageDrag();\r\n\t\tDomUtil.disableTextSelection();\r\n\r\n\t\tif (this._moving) { return; }\r\n\r\n\t\t// @event down: Event\r\n\t\t// Fired when a drag is about to start.\r\n\t\tthis.fire('down');\r\n\r\n\t\tvar first = e.touches ? e.touches[0] : e,\r\n\t\t    sizedParent = DomUtil.getSizedParentNode(this._element);\r\n\r\n\t\tthis._startPoint = new Point(first.clientX, first.clientY);\r\n\t\tthis._startPos = DomUtil.getPosition(this._element);\r\n\r\n\t\t// Cache the scale, so that we can continuously compensate for it during drag (_onMove).\r\n\t\tthis._parentScale = DomUtil.getScale(sizedParent);\r\n\r\n\t\tvar mouseevent = e.type === 'mousedown';\r\n\t\tDomEvent.on(document, mouseevent ? 'mousemove' : 'touchmove', this._onMove, this);\r\n\t\tDomEvent.on(document, mouseevent ? 'mouseup' : 'touchend touchcancel', this._onUp, this);\r\n\t},\r\n\r\n\t_onMove: function (e) {\r\n\t\t// Ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\tif (e.touches && e.touches.length > 1) {\r\n\t\t\tthis._moved = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\r\n\t\t    offset = new Point(first.clientX, first.clientY)._subtract(this._startPoint);\r\n\r\n\t\tif (!offset.x && !offset.y) { return; }\r\n\t\tif (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; }\r\n\r\n\t\t// We assume that the parent container's position, border and scale do not change for the duration of the drag.\r\n\t\t// Therefore there is no need to account for the position and border (they are eliminated by the subtraction)\r\n\t\t// and we can use the cached value for the scale.\r\n\t\toffset.x /= this._parentScale.x;\r\n\t\toffset.y /= this._parentScale.y;\r\n\r\n\t\tDomEvent.preventDefault(e);\r\n\r\n\t\tif (!this._moved) {\r\n\t\t\t// @event dragstart: Event\r\n\t\t\t// Fired when a drag starts\r\n\t\t\tthis.fire('dragstart');\r\n\r\n\t\t\tthis._moved = true;\r\n\r\n\t\t\tDomUtil.addClass(document.body, 'leaflet-dragging');\r\n\r\n\t\t\tthis._lastTarget = e.target || e.srcElement;\r\n\t\t\t// IE and Edge do not give the <use> element, so fetch it\r\n\t\t\t// if necessary\r\n\t\t\tif (window.SVGElementInstance && this._lastTarget instanceof window.SVGElementInstance) {\r\n\t\t\t\tthis._lastTarget = this._lastTarget.correspondingUseElement;\r\n\t\t\t}\r\n\t\t\tDomUtil.addClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t}\r\n\r\n\t\tthis._newPos = this._startPos.add(offset);\r\n\t\tthis._moving = true;\r\n\r\n\t\tthis._lastEvent = e;\r\n\t\tthis._updatePosition();\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tvar e = {originalEvent: this._lastEvent};\r\n\r\n\t\t// @event predrag: Event\r\n\t\t// Fired continuously during dragging *before* each corresponding\r\n\t\t// update of the element's position.\r\n\t\tthis.fire('predrag', e);\r\n\t\tDomUtil.setPosition(this._element, this._newPos);\r\n\r\n\t\t// @event drag: Event\r\n\t\t// Fired continuously during dragging.\r\n\t\tthis.fire('drag', e);\r\n\t},\r\n\r\n\t_onUp: function () {\r\n\t\t// Ignore the event if disabled; this happens in IE11\r\n\t\t// under some circumstances, see #3666.\r\n\t\tif (!this._enabled) { return; }\r\n\t\tthis.finishDrag();\r\n\t},\r\n\r\n\tfinishDrag: function (noInertia) {\r\n\t\tDomUtil.removeClass(document.body, 'leaflet-dragging');\r\n\r\n\t\tif (this._lastTarget) {\r\n\t\t\tDomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t\tthis._lastTarget = null;\r\n\t\t}\r\n\r\n\t\tDomEvent.off(document, 'mousemove touchmove', this._onMove, this);\r\n\t\tDomEvent.off(document, 'mouseup touchend touchcancel', this._onUp, this);\r\n\r\n\t\tDomUtil.enableImageDrag();\r\n\t\tDomUtil.enableTextSelection();\r\n\r\n\t\tvar fireDragend = this._moved && this._moving;\r\n\r\n\t\tthis._moving = false;\r\n\t\tDraggable._dragging = false;\r\n\r\n\t\tif (fireDragend) {\r\n\t\t\t// @event dragend: DragEndEvent\r\n\t\t\t// Fired when the drag ends.\r\n\t\t\tthis.fire('dragend', {\r\n\t\t\t\tnoInertia: noInertia,\r\n\t\t\t\tdistance: this._newPos.distanceTo(this._startPos)\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n});\r\n", "import * as LineUtil from './LineUtil';\r\nimport {toLatLng} from '../geo/LatLng';\r\nimport {toPoint} from './Point';\r\nimport {toLatLngBounds} from '../geo/LatLngBounds';\r\n/*\r\n * @namespace PolyUtil\r\n * Various utility functions for polygon geometries.\r\n */\r\n\r\n/* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[]\r\n * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)).\r\n * Used by Leaflet to only show polygon points that are on the screen or near, increasing\r\n * performance. Note that polygon points needs different algorithm for clipping\r\n * than polyline, so there's a separate method for it.\r\n */\r\nexport function clipPolygon(points, bounds, round) {\r\n\tvar clippedPoints,\r\n\t    edges = [1, 4, 2, 8],\r\n\t    i, j, k,\r\n\t    a, b,\r\n\t    len, edge, p;\r\n\r\n\tfor (i = 0, len = points.length; i < len; i++) {\r\n\t\tpoints[i]._code = LineUtil._getBitCode(points[i], bounds);\r\n\t}\r\n\r\n\t// for each edge (left, bottom, right, top)\r\n\tfor (k = 0; k < 4; k++) {\r\n\t\tedge = edges[k];\r\n\t\tclippedPoints = [];\r\n\r\n\t\tfor (i = 0, len = points.length, j = len - 1; i < len; j = i++) {\r\n\t\t\ta = points[i];\r\n\t\t\tb = points[j];\r\n\r\n\t\t\t// if a is inside the clip window\r\n\t\t\tif (!(a._code & edge)) {\r\n\t\t\t\t// if b is outside the clip window (a->b goes out of screen)\r\n\t\t\t\tif (b._code & edge) {\r\n\t\t\t\t\tp = LineUtil._getEdgeIntersection(b, a, edge, bounds, round);\r\n\t\t\t\t\tp._code = LineUtil._getBitCode(p, bounds);\r\n\t\t\t\t\tclippedPoints.push(p);\r\n\t\t\t\t}\r\n\t\t\t\tclippedPoints.push(a);\r\n\r\n\t\t\t// else if b is inside the clip window (a->b enters the screen)\r\n\t\t\t} else if (!(b._code & edge)) {\r\n\t\t\t\tp = LineUtil._getEdgeIntersection(b, a, edge, bounds, round);\r\n\t\t\t\tp._code = LineUtil._getBitCode(p, bounds);\r\n\t\t\t\tclippedPoints.push(p);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpoints = clippedPoints;\r\n\t}\r\n\r\n\treturn points;\r\n}\r\n\r\n/* @function polygonCenter(latlngs: LatLng[], crs: CRS): LatLng\r\n * Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the passed LatLngs (first ring) from a polygon.\r\n */\r\nexport function polygonCenter(latlngs, crs) {\r\n\tvar i, j, p1, p2, f, area, x, y, center;\r\n\r\n\tif (!latlngs || latlngs.length === 0) {\r\n\t\tthrow new Error('latlngs not passed');\r\n\t}\r\n\r\n\tif (!LineUtil.isFlat(latlngs)) {\r\n\t\tconsole.warn('latlngs are not flat! Only the first ring will be used');\r\n\t\tlatlngs = latlngs[0];\r\n\t}\r\n\r\n\tvar centroidLatLng = toLatLng([0, 0]);\r\n\r\n\tvar bounds = toLatLngBounds(latlngs);\r\n\tvar areaBounds = bounds.getNorthWest().distanceTo(bounds.getSouthWest()) * bounds.getNorthEast().distanceTo(bounds.getNorthWest());\r\n\t// tests showed that below 1700 rounding errors are happening\r\n\tif (areaBounds < 1700) {\r\n\t\t// getting a inexact center, to move the latlngs near to [0, 0] to prevent rounding errors\r\n\t\tcentroidLatLng = centroid(latlngs);\r\n\t}\r\n\r\n\tvar len = latlngs.length;\r\n\tvar points = [];\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tvar latlng = toLatLng(latlngs[i]);\r\n\t\tpoints.push(crs.project(toLatLng([latlng.lat - centroidLatLng.lat, latlng.lng - centroidLatLng.lng])));\r\n\t}\r\n\r\n\tarea = x = y = 0;\r\n\r\n\t// polygon centroid algorithm;\r\n\tfor (i = 0, j = len - 1; i < len; j = i++) {\r\n\t\tp1 = points[i];\r\n\t\tp2 = points[j];\r\n\r\n\t\tf = p1.y * p2.x - p2.y * p1.x;\r\n\t\tx += (p1.x + p2.x) * f;\r\n\t\ty += (p1.y + p2.y) * f;\r\n\t\tarea += f * 3;\r\n\t}\r\n\r\n\tif (area === 0) {\r\n\t\t// Polygon is so small that all points are on same pixel.\r\n\t\tcenter = points[0];\r\n\t} else {\r\n\t\tcenter = [x / area, y / area];\r\n\t}\r\n\r\n\tvar latlngCenter = crs.unproject(toPoint(center));\r\n\treturn toLatLng([latlngCenter.lat + centroidLatLng.lat, latlngCenter.lng + centroidLatLng.lng]);\r\n}\r\n\r\n/* @function centroid(latlngs: LatLng[]): LatLng\r\n * Returns the 'center of mass' of the passed LatLngs.\r\n */\r\nexport function centroid(coords) {\r\n\tvar latSum = 0;\r\n\tvar lngSum = 0;\r\n\tvar len = 0;\r\n\tfor (var i = 0; i < coords.length; i++) {\r\n\t\tvar latlng = toLatLng(coords[i]);\r\n\t\tlatSum += latlng.lat;\r\n\t\tlngSum += latlng.lng;\r\n\t\tlen++;\r\n\t}\r\n\treturn toLatLng([latSum / len, lngSum / len]);\r\n}\r\n", "import {Point, toPoint} from './Point';\r\nimport * as Util from '../core/Util';\r\nimport {toLatLng} from '../geo/LatLng';\r\nimport {centroid} from './PolyUtil';\r\nimport {toLatLngBounds} from '../geo/LatLngBounds';\r\n\r\n\r\n/*\r\n * @namespace LineUtil\r\n *\r\n * Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.\r\n */\r\n\r\n// Simplify polyline with vertex reduction and Douglas-Peucker simplification.\r\n// Improves rendering performance dramatically by lessening the number of points to draw.\r\n\r\n// @function simplify(points: Point[], tolerance: Number): Point[]\r\n// Dramatically reduces the number of points in a polyline while retaining\r\n// its shape and returns a new array of simplified points, using the\r\n// [Ramer-Douglas-Peucker algorithm](https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm).\r\n// Used for a huge performance boost when processing/displaying Leaflet polylines for\r\n// each zoom level and also reducing visual noise. tolerance affects the amount of\r\n// simplification (lesser value means higher quality but slower and with more points).\r\n// Also released as a separated micro-library [Simplify.js](https://mourner.github.io/simplify-js/).\r\nexport function simplify(points, tolerance) {\r\n\tif (!tolerance || !points.length) {\r\n\t\treturn points.slice();\r\n\t}\r\n\r\n\tvar sqTolerance = tolerance * tolerance;\r\n\r\n\t    // stage 1: vertex reduction\r\n\t    points = _reducePoints(points, sqTolerance);\r\n\r\n\t    // stage 2: Douglas-Peucker simplification\r\n\t    points = _simplifyDP(points, sqTolerance);\r\n\r\n\treturn points;\r\n}\r\n\r\n// @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number\r\n// Returns the distance between point `p` and segment `p1` to `p2`.\r\nexport function pointToSegmentDistance(p, p1, p2) {\r\n\treturn Math.sqrt(_sqClosestPointOnSegment(p, p1, p2, true));\r\n}\r\n\r\n// @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number\r\n// Returns the closest point from a point `p` on a segment `p1` to `p2`.\r\nexport function closestPointOnSegment(p, p1, p2) {\r\n\treturn _sqClosestPointOnSegment(p, p1, p2);\r\n}\r\n\r\n// Ramer-Douglas-Peucker simplification, see https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm\r\nfunction _simplifyDP(points, sqTolerance) {\r\n\r\n\tvar len = points.length,\r\n\t    ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,\r\n\t    markers = new ArrayConstructor(len);\r\n\r\n\t    markers[0] = markers[len - 1] = 1;\r\n\r\n\t_simplifyDPStep(points, markers, sqTolerance, 0, len - 1);\r\n\r\n\tvar i,\r\n\t    newPoints = [];\r\n\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tif (markers[i]) {\r\n\t\t\tnewPoints.push(points[i]);\r\n\t\t}\r\n\t}\r\n\r\n\treturn newPoints;\r\n}\r\n\r\nfunction _simplifyDPStep(points, markers, sqTolerance, first, last) {\r\n\r\n\tvar maxSqDist = 0,\r\n\tindex, i, sqDist;\r\n\r\n\tfor (i = first + 1; i <= last - 1; i++) {\r\n\t\tsqDist = _sqClosestPointOnSegment(points[i], points[first], points[last], true);\r\n\r\n\t\tif (sqDist > maxSqDist) {\r\n\t\t\tindex = i;\r\n\t\t\tmaxSqDist = sqDist;\r\n\t\t}\r\n\t}\r\n\r\n\tif (maxSqDist > sqTolerance) {\r\n\t\tmarkers[index] = 1;\r\n\r\n\t\t_simplifyDPStep(points, markers, sqTolerance, first, index);\r\n\t\t_simplifyDPStep(points, markers, sqTolerance, index, last);\r\n\t}\r\n}\r\n\r\n// reduce points that are too close to each other to a single point\r\nfunction _reducePoints(points, sqTolerance) {\r\n\tvar reducedPoints = [points[0]];\r\n\r\n\tfor (var i = 1, prev = 0, len = points.length; i < len; i++) {\r\n\t\tif (_sqDist(points[i], points[prev]) > sqTolerance) {\r\n\t\t\treducedPoints.push(points[i]);\r\n\t\t\tprev = i;\r\n\t\t}\r\n\t}\r\n\tif (prev < len - 1) {\r\n\t\treducedPoints.push(points[len - 1]);\r\n\t}\r\n\treturn reducedPoints;\r\n}\r\n\r\nvar _lastCode;\r\n\r\n// @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean\r\n// Clips the segment a to b by rectangular bounds with the\r\n// [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm)\r\n// (modifying the segment points directly!). Used by Leaflet to only show polyline\r\n// points that are on the screen or near, increasing performance.\r\nexport function clipSegment(a, b, bounds, useLastCode, round) {\r\n\tvar codeA = useLastCode ? _lastCode : _getBitCode(a, bounds),\r\n\t    codeB = _getBitCode(b, bounds),\r\n\r\n\t    codeOut, p, newCode;\r\n\r\n\t    // save 2nd code to avoid calculating it on the next segment\r\n\t    _lastCode = codeB;\r\n\r\n\twhile (true) {\r\n\t\t// if a,b is inside the clip window (trivial accept)\r\n\t\tif (!(codeA | codeB)) {\r\n\t\t\treturn [a, b];\r\n\t\t}\r\n\r\n\t\t// if a,b is outside the clip window (trivial reject)\r\n\t\tif (codeA & codeB) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// other cases\r\n\t\tcodeOut = codeA || codeB;\r\n\t\tp = _getEdgeIntersection(a, b, codeOut, bounds, round);\r\n\t\tnewCode = _getBitCode(p, bounds);\r\n\r\n\t\tif (codeOut === codeA) {\r\n\t\t\ta = p;\r\n\t\t\tcodeA = newCode;\r\n\t\t} else {\r\n\t\t\tb = p;\r\n\t\t\tcodeB = newCode;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport function _getEdgeIntersection(a, b, code, bounds, round) {\r\n\tvar dx = b.x - a.x,\r\n\t    dy = b.y - a.y,\r\n\t    min = bounds.min,\r\n\t    max = bounds.max,\r\n\t    x, y;\r\n\r\n\tif (code & 8) { // top\r\n\t\tx = a.x + dx * (max.y - a.y) / dy;\r\n\t\ty = max.y;\r\n\r\n\t} else if (code & 4) { // bottom\r\n\t\tx = a.x + dx * (min.y - a.y) / dy;\r\n\t\ty = min.y;\r\n\r\n\t} else if (code & 2) { // right\r\n\t\tx = max.x;\r\n\t\ty = a.y + dy * (max.x - a.x) / dx;\r\n\r\n\t} else if (code & 1) { // left\r\n\t\tx = min.x;\r\n\t\ty = a.y + dy * (min.x - a.x) / dx;\r\n\t}\r\n\r\n\treturn new Point(x, y, round);\r\n}\r\n\r\nexport function _getBitCode(p, bounds) {\r\n\tvar code = 0;\r\n\r\n\tif (p.x < bounds.min.x) { // left\r\n\t\tcode |= 1;\r\n\t} else if (p.x > bounds.max.x) { // right\r\n\t\tcode |= 2;\r\n\t}\r\n\r\n\tif (p.y < bounds.min.y) { // bottom\r\n\t\tcode |= 4;\r\n\t} else if (p.y > bounds.max.y) { // top\r\n\t\tcode |= 8;\r\n\t}\r\n\r\n\treturn code;\r\n}\r\n\r\n// square distance (to avoid unnecessary Math.sqrt calls)\r\nfunction _sqDist(p1, p2) {\r\n\tvar dx = p2.x - p1.x,\r\n\t    dy = p2.y - p1.y;\r\n\treturn dx * dx + dy * dy;\r\n}\r\n\r\n// return closest point on segment or distance to that point\r\nexport function _sqClosestPointOnSegment(p, p1, p2, sqDist) {\r\n\tvar x = p1.x,\r\n\t    y = p1.y,\r\n\t    dx = p2.x - x,\r\n\t    dy = p2.y - y,\r\n\t    dot = dx * dx + dy * dy,\r\n\t    t;\r\n\r\n\tif (dot > 0) {\r\n\t\tt = ((p.x - x) * dx + (p.y - y) * dy) / dot;\r\n\r\n\t\tif (t > 1) {\r\n\t\t\tx = p2.x;\r\n\t\t\ty = p2.y;\r\n\t\t} else if (t > 0) {\r\n\t\t\tx += dx * t;\r\n\t\t\ty += dy * t;\r\n\t\t}\r\n\t}\r\n\r\n\tdx = p.x - x;\r\n\tdy = p.y - y;\r\n\r\n\treturn sqDist ? dx * dx + dy * dy : new Point(x, y);\r\n}\r\n\r\n\r\n// @function isFlat(latlngs: LatLng[]): Boolean\r\n// Returns true if `latlngs` is a flat array, false is nested.\r\nexport function isFlat(latlngs) {\r\n\treturn !Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined');\r\n}\r\n\r\nexport function _flat(latlngs) {\r\n\tconsole.warn('Deprecated use of _flat, please use L.LineUtil.isFlat instead.');\r\n\treturn isFlat(latlngs);\r\n}\r\n\r\n/* @function polylineCenter(latlngs: LatLng[], crs: CRS): LatLng\r\n * Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the passed LatLngs (first ring) from a polyline.\r\n */\r\nexport function polylineCenter(latlngs, crs) {\r\n\tvar i, halfDist, segDist, dist, p1, p2, ratio, center;\r\n\r\n\tif (!latlngs || latlngs.length === 0) {\r\n\t\tthrow new Error('latlngs not passed');\r\n\t}\r\n\r\n\tif (!isFlat(latlngs)) {\r\n\t\tconsole.warn('latlngs are not flat! Only the first ring will be used');\r\n\t\tlatlngs = latlngs[0];\r\n\t}\r\n\r\n\tvar centroidLatLng = toLatLng([0, 0]);\r\n\r\n\tvar bounds = toLatLngBounds(latlngs);\r\n\tvar areaBounds = bounds.getNorthWest().distanceTo(bounds.getSouthWest()) * bounds.getNorthEast().distanceTo(bounds.getNorthWest());\r\n\t// tests showed that below 1700 rounding errors are happening\r\n\tif (areaBounds < 1700) {\r\n\t\t// getting a inexact center, to move the latlngs near to [0, 0] to prevent rounding errors\r\n\t\tcentroidLatLng = centroid(latlngs);\r\n\t}\r\n\r\n\tvar len = latlngs.length;\r\n\tvar points = [];\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tvar latlng = toLatLng(latlngs[i]);\r\n\t\tpoints.push(crs.project(toLatLng([latlng.lat - centroidLatLng.lat, latlng.lng - centroidLatLng.lng])));\r\n\t}\r\n\r\n\tfor (i = 0, halfDist = 0; i < len - 1; i++) {\r\n\t\thalfDist += points[i].distanceTo(points[i + 1]) / 2;\r\n\t}\r\n\r\n\t// The line is so small in the current view that all points are on the same pixel.\r\n\tif (halfDist === 0) {\r\n\t\tcenter = points[0];\r\n\t} else {\r\n\t\tfor (i = 0, dist = 0; i < len - 1; i++) {\r\n\t\t\tp1 = points[i];\r\n\t\t\tp2 = points[i + 1];\r\n\t\t\tsegDist = p1.distanceTo(p2);\r\n\t\t\tdist += segDist;\r\n\r\n\t\t\tif (dist > halfDist) {\r\n\t\t\t\tratio = (dist - halfDist) / segDist;\r\n\t\t\t\tcenter = [\r\n\t\t\t\t\tp2.x - ratio * (p2.x - p1.x),\r\n\t\t\t\t\tp2.y - ratio * (p2.y - p1.y)\r\n\t\t\t\t];\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tvar latlngCenter = crs.unproject(toPoint(center));\r\n\treturn toLatLng([latlngCenter.lat + centroidLatLng.lat, latlngCenter.lng + centroidLatLng.lng]);\r\n}\r\n", "import {LatLng} from '../LatLng';\r\nimport {Bounds} from '../../geometry/Bounds';\r\nimport {Point} from '../../geometry/Point';\r\n\r\n/*\r\n * @namespace Projection\r\n * @section\r\n * Leaflet comes with a set of already defined Projections out of the box:\r\n *\r\n * @projection L.Projection.LonLat\r\n *\r\n * Equirectangular, or Plate Carree projection — the most simple projection,\r\n * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as\r\n * latitude. Also suitable for flat worlds, e.g. game maps. Used by the\r\n * `EPSG:4326` and `Simple` CRS.\r\n */\r\n\r\nexport var LonLat = {\r\n\tproject: function (latlng) {\r\n\t\treturn new Point(latlng.lng, latlng.lat);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\treturn new LatLng(point.y, point.x);\r\n\t},\r\n\r\n\tbounds: new Bounds([-180, -90], [180, 90])\r\n};\r\n", "import {LatLng} from '../LatLng';\r\nimport {Bounds} from '../../geometry/Bounds';\r\nimport {Point} from '../../geometry/Point';\r\n\r\n/*\r\n * @namespace Projection\r\n * @projection L.Projection.Mercator\r\n *\r\n * Elliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS.\r\n */\r\n\r\nexport var Mercator = {\r\n\tR: 6378137,\r\n\tR_MINOR: 6356752.314245179,\r\n\r\n\tbounds: new Bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]),\r\n\r\n\tproject: function (latlng) {\r\n\t\tvar d = Math.PI / 180,\r\n\t\t    r = this.R,\r\n\t\t    y = latlng.lat * d,\r\n\t\t    tmp = this.R_MINOR / r,\r\n\t\t    e = Math.sqrt(1 - tmp * tmp),\r\n\t\t    con = e * Math.sin(y);\r\n\r\n\t\tvar ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\r\n\t\ty = -r * Math.log(Math.max(ts, 1E-10));\r\n\r\n\t\treturn new Point(latlng.lng * d * r, y);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\tvar d = 180 / Math.PI,\r\n\t\t    r = this.R,\r\n\t\t    tmp = this.R_MINOR / r,\r\n\t\t    e = Math.sqrt(1 - tmp * tmp),\r\n\t\t    ts = Math.exp(-point.y / r),\r\n\t\t    phi = Math.PI / 2 - 2 * Math.atan(ts);\r\n\r\n\t\tfor (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\r\n\t\t\tcon = e * Math.sin(phi);\r\n\t\t\tcon = Math.pow((1 - con) / (1 + con), e / 2);\r\n\t\t\tdphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\r\n\t\t\tphi += dphi;\r\n\t\t}\r\n\r\n\t\treturn new LatLng(phi * d, point.x * d / r);\r\n\t}\r\n};\r\n", "/*\n * @class Projection\n\n * An object with methods for projecting geographical coordinates of the world onto\n * a flat surface (and back). See [Map projection](https://en.wikipedia.org/wiki/Map_projection).\n\n * @property bounds: Bounds\n * The bounds (specified in CRS units) where the projection is valid\n\n * @method project(latlng: LatLng): Point\n * Projects geographical coordinates into a 2D point.\n * Only accepts actual `L.LatLng` instances, not arrays.\n\n * @method unproject(point: Point): LatLng\n * The inverse of `project`. Projects a 2D point into a geographical location.\n * Only accepts actual `L.Point` instances, not arrays.\n\n * Note that the projection instances do not inherit from Leaflet's `Class` object,\n * and can't be instantiated. Also, new classes can't inherit from them,\n * and methods can't be added to them with the `include` function.\n\n */\n\nexport {LonLat} from './Projection.LonLat';\nexport {Mercator} from './Projection.Mercator';\nexport {SphericalMercator} from './Projection.SphericalMercator';\n", "import {Earth} from './CRS.Earth';\r\nimport {Mercator} from '../projection/Projection.Mercator';\r\nimport {toTransformation} from '../../geometry/Transformation';\r\nimport * as Util from '../../core/Util';\r\n\r\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG3395\r\n *\r\n * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.\r\n */\r\nexport var EPSG3395 = Util.extend({}, Earth, {\r\n\tcode: 'EPSG:3395',\r\n\tprojection: Mercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar scale = 0.5 / (Math.PI * Mercator.R);\r\n\t\treturn toTransformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n", "import {Earth} from './CRS.Earth';\r\nimport {LonLat} from '../projection/Projection.LonLat';\r\nimport {toTransformation} from '../../geometry/Transformation';\r\nimport * as Util from '../../core/Util';\r\n\r\n/*\r\n * @namespace CRS\r\n * @crs L.CRS.EPSG4326\r\n *\r\n * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.\r\n *\r\n * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic),\r\n * which is a breaking change from 0.7.x behaviour.  If you are using a `TileLayer`\r\n * with this CRS, ensure that there are two 256x256 pixel tiles covering the\r\n * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90),\r\n * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set.\r\n */\r\n\r\nexport var EPSG4326 = Util.extend({}, Earth, {\r\n\tcode: 'EPSG:4326',\r\n\tprojection: LonLat,\r\n\ttransformation: toTransformation(1 / 180, 1, -1 / 180, 0.5)\r\n});\r\n", "import {CRS} from './CRS';\nimport {LonLat} from '../projection/Projection.LonLat';\nimport {toTransformation} from '../../geometry/Transformation';\nimport * as Util from '../../core/Util';\n\n/*\n * @namespace CRS\n * @crs L.CRS.Simple\n *\n * A simple CRS that maps longitude and latitude into `x` and `y` directly.\n * May be used for maps of flat surfaces (e.g. game maps). Note that the `y`\n * axis should still be inverted (going from bottom to top). `distance()` returns\n * simple euclidean distance.\n */\n\nexport var Simple = Util.extend({}, CRS, {\n\tprojection: LonLat,\n\ttransformation: toTransformation(1, 0, -1, 0),\n\n\tscale: function (zoom) {\n\t\treturn Math.pow(2, zoom);\n\t},\n\n\tzoom: function (scale) {\n\t\treturn Math.log(scale) / Math.LN2;\n\t},\n\n\tdistance: function (latlng1, latlng2) {\n\t\tvar dx = latlng2.lng - latlng1.lng,\n\t\t    dy = latlng2.lat - latlng1.lat;\n\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t},\n\n\tinfinite: true\n});\n", "import {CRS} from './CRS';\nimport {Earth} from './CRS.Earth';\nimport {EPSG3395} from './CRS.EPSG3395';\nimport {EPSG3857, EPSG900913} from './CRS.EPSG3857';\nimport {EPSG4326} from './CRS.EPSG4326';\nimport {Simple} from './CRS.Simple';\n\nCRS.Earth = Earth;\nCRS.EPSG3395 = EPSG3395;\nCRS.EPSG3857 = EPSG3857;\nCRS.EPSG900913 = EPSG900913;\nCRS.EPSG4326 = EPSG4326;\nCRS.Simple = Simple;\n\nexport {CRS};\n", "import {Evented} from '../core/Events';\nimport {Map} from '../map/Map';\nimport * as Util from '../core/Util';\n\n/*\n * @class Layer\n * @inherits Evented\n * @aka L.Layer\n * @aka ILayer\n *\n * A set of methods from the Layer base class that all Leaflet layers use.\n * Inherits all methods, options and events from `L.Evented`.\n *\n * @example\n *\n * ```js\n * var layer = L.marker(latlng).addTo(map);\n * layer.addTo(map);\n * layer.remove();\n * ```\n *\n * @event add: Event\n * Fired after the layer is added to a map\n *\n * @event remove: Event\n * Fired after the layer is removed from a map\n */\n\n\nexport var Layer = Evented.extend({\n\n\t// Classes extending `L.Layer` will inherit the following options:\n\toptions: {\n\t\t// @option pane: String = 'overlayPane'\n\t\t// By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default.\n\t\tpane: 'overlayPane',\n\n\t\t// @option attribution: String = null\n\t\t// String to be shown in the attribution control, e.g. \"© OpenStreetMap contributors\". It describes the layer data and is often a legal obligation towards copyright holders and tile providers.\n\t\tattribution: null,\n\n\t\tbubblingMouseEvents: true\n\t},\n\n\t/* @section\n\t * Classes extending `L.Layer` will inherit the following methods:\n\t *\n\t * @method addTo(map: Map|LayerGroup): this\n\t * Adds the layer to the given map or layer group.\n\t */\n\taddTo: function (map) {\n\t\tmap.addLayer(this);\n\t\treturn this;\n\t},\n\n\t// @method remove: this\n\t// Removes the layer from the map it is currently active on.\n\tremove: function () {\n\t\treturn this.removeFrom(this._map || this._mapToAdd);\n\t},\n\n\t// @method removeFrom(map: Map): this\n\t// Removes the layer from the given map\n\t//\n\t// @alternative\n\t// @method removeFrom(group: LayerGroup): this\n\t// Removes the layer from the given `LayerGroup`\n\tremoveFrom: function (obj) {\n\t\tif (obj) {\n\t\t\tobj.removeLayer(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getPane(name? : String): HTMLElement\n\t// Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer.\n\tgetPane: function (name) {\n\t\treturn this._map.getPane(name ? (this.options[name] || name) : this.options.pane);\n\t},\n\n\taddInteractiveTarget: function (targetEl) {\n\t\tthis._map._targets[Util.stamp(targetEl)] = this;\n\t\treturn this;\n\t},\n\n\tremoveInteractiveTarget: function (targetEl) {\n\t\tdelete this._map._targets[Util.stamp(targetEl)];\n\t\treturn this;\n\t},\n\n\t// @method getAttribution: String\n\t// Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution).\n\tgetAttribution: function () {\n\t\treturn this.options.attribution;\n\t},\n\n\t_layerAdd: function (e) {\n\t\tvar map = e.target;\n\n\t\t// check in case layer gets added and then removed before the map is ready\n\t\tif (!map.hasLayer(this)) { return; }\n\n\t\tthis._map = map;\n\t\tthis._zoomAnimated = map._zoomAnimated;\n\n\t\tif (this.getEvents) {\n\t\t\tvar events = this.getEvents();\n\t\t\tmap.on(events, this);\n\t\t\tthis.once('remove', function () {\n\t\t\t\tmap.off(events, this);\n\t\t\t}, this);\n\t\t}\n\n\t\tthis.onAdd(map);\n\n\t\tthis.fire('add');\n\t\tmap.fire('layeradd', {layer: this});\n\t}\n});\n\n/* @section Extension methods\n * @uninheritable\n *\n * Every layer should extend from `L.Layer` and (re-)implement the following methods.\n *\n * @method onAdd(map: Map): this\n * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer).\n *\n * @method onRemove(map: Map): this\n * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer).\n *\n * @method getEvents(): Object\n * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer.\n *\n * @method getAttribution(): String\n * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible.\n *\n * @method beforeAdd(map: Map): this\n * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only.\n */\n\n\n/* @namespace Map\n * @section Layer events\n *\n * @event layeradd: LayerEvent\n * Fired when a new layer is added to the map.\n *\n * @event layerremove: LayerEvent\n * Fired when some layer is removed from the map\n *\n * @section Methods for Layers and Controls\n */\nMap.include({\n\t// @method addLayer(layer: Layer): this\n\t// Adds the given layer to the map\n\taddLayer: function (layer) {\n\t\tif (!layer._layerAdd) {\n\t\t\tthrow new Error('The provided object is not a Layer.');\n\t\t}\n\n\t\tvar id = Util.stamp(layer);\n\t\tif (this._layers[id]) { return this; }\n\t\tthis._layers[id] = layer;\n\n\t\tlayer._mapToAdd = this;\n\n\t\tif (layer.beforeAdd) {\n\t\t\tlayer.beforeAdd(this);\n\t\t}\n\n\t\tthis.whenReady(layer._layerAdd, layer);\n\n\t\treturn this;\n\t},\n\n\t// @method removeLayer(layer: Layer): this\n\t// Removes the given layer from the map.\n\tremoveLayer: function (layer) {\n\t\tvar id = Util.stamp(layer);\n\n\t\tif (!this._layers[id]) { return this; }\n\n\t\tif (this._loaded) {\n\t\t\tlayer.onRemove(this);\n\t\t}\n\n\t\tdelete this._layers[id];\n\n\t\tif (this._loaded) {\n\t\t\tthis.fire('layerremove', {layer: layer});\n\t\t\tlayer.fire('remove');\n\t\t}\n\n\t\tlayer._map = layer._mapToAdd = null;\n\n\t\treturn this;\n\t},\n\n\t// @method hasLayer(layer: Layer): Boolean\n\t// Returns `true` if the given layer is currently added to the map\n\thasLayer: function (layer) {\n\t\treturn Util.stamp(layer) in this._layers;\n\t},\n\n\t/* @method eachLayer(fn: Function, context?: Object): this\n\t * Iterates over the layers of the map, optionally specifying context of the iterator function.\n\t * ```\n\t * map.eachLayer(function(layer){\n\t *     layer.bindPopup('Hello');\n\t * });\n\t * ```\n\t */\n\teachLayer: function (method, context) {\n\t\tfor (var i in this._layers) {\n\t\t\tmethod.call(context, this._layers[i]);\n\t\t}\n\t\treturn this;\n\t},\n\n\t_addLayers: function (layers) {\n\t\tlayers = layers ? (Util.isArray(layers) ? layers : [layers]) : [];\n\n\t\tfor (var i = 0, len = layers.length; i < len; i++) {\n\t\t\tthis.addLayer(layers[i]);\n\t\t}\n\t},\n\n\t_addZoomLimit: function (layer) {\n\t\tif (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) {\n\t\t\tthis._zoomBoundLayers[Util.stamp(layer)] = layer;\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\t},\n\n\t_removeZoomLimit: function (layer) {\n\t\tvar id = Util.stamp(layer);\n\n\t\tif (this._zoomBoundLayers[id]) {\n\t\t\tdelete this._zoomBoundLayers[id];\n\t\t\tthis._updateZoomLevels();\n\t\t}\n\t},\n\n\t_updateZoomLevels: function () {\n\t\tvar minZoom = Infinity,\n\t\t    maxZoom = -Infinity,\n\t\t    oldZoomSpan = this._getZoomSpan();\n\n\t\tfor (var i in this._zoomBoundLayers) {\n\t\t\tvar options = this._zoomBoundLayers[i].options;\n\n\t\t\tminZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom);\n\t\t\tmaxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom);\n\t\t}\n\n\t\tthis._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom;\n\t\tthis._layersMinZoom = minZoom === Infinity ? undefined : minZoom;\n\n\t\t// @section Map state change events\n\t\t// @event zoomlevelschange: Event\n\t\t// Fired when the number of zoomlevels on the map is changed due\n\t\t// to adding or removing a layer.\n\t\tif (oldZoomSpan !== this._getZoomSpan()) {\n\t\t\tthis.fire('zoomlevelschange');\n\t\t}\n\n\t\tif (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) {\n\t\t\tthis.setZoom(this._layersMaxZoom);\n\t\t}\n\t\tif (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) {\n\t\t\tthis.setZoom(this._layersMinZoom);\n\t\t}\n\t}\n});\n", "\r\nimport {Layer} from './Layer';\r\nimport * as Util from '../core/Util';\r\n\r\n/*\r\n * @class LayerGroup\r\n * @aka L.LayerGroup\r\n * @inherits Interactive layer\r\n *\r\n * Used to group several layers and handle them as one. If you add it to the map,\r\n * any layers added or removed from the group will be added/removed on the map as\r\n * well. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.layerGroup([marker1, marker2])\r\n * \t.addLayer(polyline)\r\n * \t.addTo(map);\r\n * ```\r\n */\r\n\r\nexport var LayerGroup = Layer.extend({\r\n\r\n\tinitialize: function (layers, options) {\r\n\t\tUtil.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tvar i, len;\r\n\r\n\t\tif (layers) {\r\n\t\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\t\t\t\tthis.addLayer(layers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addLayer(layer: Layer): this\r\n\t// Adds the given layer to the group.\r\n\taddLayer: function (layer) {\r\n\t\tvar id = this.getLayerId(layer);\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.addLayer(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method removeLayer(layer: Layer): this\r\n\t// Removes the given layer from the group.\r\n\t// @alternative\r\n\t// @method removeLayer(id: Number): this\r\n\t// Removes the layer with the given internal ID from the group.\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = layer in this._layers ? layer : this.getLayerId(layer);\r\n\r\n\t\tif (this._map && this._layers[id]) {\r\n\t\t\tthis._map.removeLayer(this._layers[id]);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method hasLayer(layer: Layer): Boolean\r\n\t// Returns `true` if the given layer is currently added to the group.\r\n\t// @alternative\r\n\t// @method hasLayer(id: Number): Boolean\r\n\t// Returns `true` if the given internal ID is currently added to the group.\r\n\thasLayer: function (layer) {\r\n\t\tvar layerId = typeof layer === 'number' ? layer : this.getLayerId(layer);\r\n\t\treturn layerId in this._layers;\r\n\t},\r\n\r\n\t// @method clearLayers(): this\r\n\t// Removes all the layers from the group.\r\n\tclearLayers: function () {\r\n\t\treturn this.eachLayer(this.removeLayer, this);\r\n\t},\r\n\r\n\t// @method invoke(methodName: String, …): this\r\n\t// Calls `methodName` on every layer contained in this group, passing any\r\n\t// additional parameters. Has no effect if the layers contained do not\r\n\t// implement `methodName`.\r\n\tinvoke: function (methodName) {\r\n\t\tvar args = Array.prototype.slice.call(arguments, 1),\r\n\t\t    i, layer;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tlayer = this._layers[i];\r\n\r\n\t\t\tif (layer[methodName]) {\r\n\t\t\t\tlayer[methodName].apply(layer, args);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis.eachLayer(map.addLayer, map);\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tthis.eachLayer(map.removeLayer, map);\r\n\t},\r\n\r\n\t// @method eachLayer(fn: Function, context?: Object): this\r\n\t// Iterates over the layers of the group, optionally specifying context of the iterator function.\r\n\t// ```js\r\n\t// group.eachLayer(function (layer) {\r\n\t// \tlayer.bindPopup('Hello');\r\n\t// });\r\n\t// ```\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getLayer(id: Number): Layer\r\n\t// Returns the layer with the given internal ID.\r\n\tgetLayer: function (id) {\r\n\t\treturn this._layers[id];\r\n\t},\r\n\r\n\t// @method getLayers(): Layer[]\r\n\t// Returns an array of all the layers added to the group.\r\n\tgetLayers: function () {\r\n\t\tvar layers = [];\r\n\t\tthis.eachLayer(layers.push, layers);\r\n\t\treturn layers;\r\n\t},\r\n\r\n\t// @method setZIndex(zIndex: Number): this\r\n\t// Calls `setZIndex` on every layer contained in this group, passing the z-index.\r\n\tsetZIndex: function (zIndex) {\r\n\t\treturn this.invoke('setZIndex', zIndex);\r\n\t},\r\n\r\n\t// @method getLayerId(layer: Layer): Number\r\n\t// Returns the internal ID for a layer\r\n\tgetLayerId: function (layer) {\r\n\t\treturn Util.stamp(layer);\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.layerGroup(layers?: Layer[], options?: Object)\r\n// Create a layer group, optionally given an initial set of layers and an `options` object.\r\nexport var layerGroup = function (layers, options) {\r\n\treturn new LayerGroup(layers, options);\r\n};\r\n", "import {LayerGroup} from './LayerGroup';\r\nimport {LatLngBounds} from '../geo/LatLngBounds';\r\n\r\n/*\r\n * @class FeatureGroup\r\n * @aka L.FeatureGroup\r\n * @inherits LayerGroup\r\n *\r\n * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers:\r\n *  * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip))\r\n *  * Events are propagated to the `FeatureGroup`, so if the group has an event\r\n * handler, it will handle events from any of the layers. This includes mouse events\r\n * and custom events.\r\n *  * Has `layeradd` and `layerremove` events\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.featureGroup([marker1, marker2, polyline])\r\n * \t.bindPopup('Hello world!')\r\n * \t.on('click', function() { alert('Clicked on a member of the group!'); })\r\n * \t.addTo(map);\r\n * ```\r\n */\r\n\r\nexport var FeatureGroup = LayerGroup.extend({\r\n\r\n\taddLayer: function (layer) {\r\n\t\tif (this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tlayer.addEventParent(this);\r\n\r\n\t\tLayerGroup.prototype.addLayer.call(this, layer);\r\n\r\n\t\t// @event layeradd: LayerEvent\r\n\t\t// Fired when a layer is added to this `FeatureGroup`\r\n\t\treturn this.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tif (!this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif (layer in this._layers) {\r\n\t\t\tlayer = this._layers[layer];\r\n\t\t}\r\n\r\n\t\tlayer.removeEventParent(this);\r\n\r\n\t\tLayerGroup.prototype.removeLayer.call(this, layer);\r\n\r\n\t\t// @event layerremove: LayerEvent\r\n\t\t// Fired when a layer is removed from this `FeatureGroup`\r\n\t\treturn this.fire('layerremove', {layer: layer});\r\n\t},\r\n\r\n\t// @method setStyle(style: Path options): this\r\n\t// Sets the given path options to each layer of the group that has a `setStyle` method.\r\n\tsetStyle: function (style) {\r\n\t\treturn this.invoke('setStyle', style);\r\n\t},\r\n\r\n\t// @method bringToFront(): this\r\n\t// Brings the layer group to the top of all other layers\r\n\tbringToFront: function () {\r\n\t\treturn this.invoke('bringToFront');\r\n\t},\r\n\r\n\t// @method bringToBack(): this\r\n\t// Brings the layer group to the back of all other layers\r\n\tbringToBack: function () {\r\n\t\treturn this.invoke('bringToBack');\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children).\r\n\tgetBounds: function () {\r\n\t\tvar bounds = new LatLngBounds();\r\n\r\n\t\tfor (var id in this._layers) {\r\n\t\t\tvar layer = this._layers[id];\r\n\t\t\tbounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng());\r\n\t\t}\r\n\t\treturn bounds;\r\n\t}\r\n});\r\n\r\n// @factory L.featureGroup(layers?: Layer[], options?: Object)\r\n// Create a feature group, optionally given an initial set of layers and an `options` object.\r\nexport var featureGroup = function (layers, options) {\r\n\treturn new FeatureGroup(layers, options);\r\n};\r\n", "import {Class} from '../../core/Class';\r\nimport {setOptions} from '../../core/Util';\r\nimport {toPoint as point} from '../../geometry/Point';\r\nimport Browser from '../../core/Browser';\r\n\r\n/*\r\n * @class Icon\r\n * @aka L.Icon\r\n *\r\n * Represents an icon to provide when creating a marker.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var myIcon = L.icon({\r\n *     iconUrl: 'my-icon.png',\r\n *     iconRetinaUrl: 'my-icon@2x.png',\r\n *     iconSize: [38, 95],\r\n *     iconAnchor: [22, 94],\r\n *     popupAnchor: [-3, -76],\r\n *     shadowUrl: 'my-icon-shadow.png',\r\n *     shadowRetinaUrl: 'my-icon-shadow@2x.png',\r\n *     shadowSize: [68, 95],\r\n *     shadowAnchor: [22, 94]\r\n * });\r\n *\r\n * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);\r\n * ```\r\n *\r\n * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default.\r\n *\r\n */\r\n\r\nexport var Icon = Class.extend({\r\n\r\n\t/* @section\r\n\t * @aka Icon options\r\n\t *\r\n\t * @option iconUrl: String = null\r\n\t * **(required)** The URL to the icon image (absolute or relative to your script path).\r\n\t *\r\n\t * @option iconRetinaUrl: String = null\r\n\t * The URL to a retina sized version of the icon image (absolute or relative to your\r\n\t * script path). Used for Retina screen devices.\r\n\t *\r\n\t * @option iconSize: Point = null\r\n\t * Size of the icon image in pixels.\r\n\t *\r\n\t * @option iconAnchor: Point = null\r\n\t * The coordinates of the \"tip\" of the icon (relative to its top left corner). The icon\r\n\t * will be aligned so that this point is at the marker's geographical location. Centered\r\n\t * by default if size is specified, also can be set in CSS with negative margins.\r\n\t *\r\n\t * @option popupAnchor: Point = [0, 0]\r\n\t * The coordinates of the point from which popups will \"open\", relative to the icon anchor.\r\n\t *\r\n\t * @option tooltipAnchor: Point = [0, 0]\r\n\t * The coordinates of the point from which tooltips will \"open\", relative to the icon anchor.\r\n\t *\r\n\t * @option shadowUrl: String = null\r\n\t * The URL to the icon shadow image. If not specified, no shadow image will be created.\r\n\t *\r\n\t * @option shadowRetinaUrl: String = null\r\n\t *\r\n\t * @option shadowSize: Point = null\r\n\t * Size of the shadow image in pixels.\r\n\t *\r\n\t * @option shadowAnchor: Point = null\r\n\t * The coordinates of the \"tip\" of the shadow (relative to its top left corner) (the same\r\n\t * as iconAnchor if not specified).\r\n\t *\r\n\t * @option className: String = ''\r\n\t * A custom class name to assign to both icon and shadow images. Empty by default.\r\n\t */\r\n\r\n\toptions: {\r\n\t\tpopupAnchor: [0, 0],\r\n\t\ttooltipAnchor: [0, 0],\r\n\r\n\t\t// @option crossOrigin: Boolean|String = false\r\n\t\t// Whether the crossOrigin attribute will be added to the tiles.\r\n\t\t// If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data.\r\n\t\t// Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values.\r\n\t\tcrossOrigin: false\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tsetOptions(this, options);\r\n\t},\r\n\r\n\t// @method createIcon(oldIcon?: HTMLElement): HTMLElement\r\n\t// Called internally when the icon has to be shown, returns a `<img>` HTML element\r\n\t// styled according to the options.\r\n\tcreateIcon: function (oldIcon) {\r\n\t\treturn this._createIcon('icon', oldIcon);\r\n\t},\r\n\r\n\t// @method createShadow(oldIcon?: HTMLElement): HTMLElement\r\n\t// As `createIcon`, but for the shadow beneath it.\r\n\tcreateShadow: function (oldIcon) {\r\n\t\treturn this._createIcon('shadow', oldIcon);\r\n\t},\r\n\r\n\t_createIcon: function (name, oldIcon) {\r\n\t\tvar src = this._getIconUrl(name);\r\n\r\n\t\tif (!src) {\r\n\t\t\tif (name === 'icon') {\r\n\t\t\t\tthrow new Error('iconUrl not set in Icon options (see the docs).');\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null);\r\n\t\tthis._setIconStyles(img, name);\r\n\r\n\t\tif (this.options.crossOrigin || this.options.crossOrigin === '') {\r\n\t\t\timg.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin;\r\n\t\t}\r\n\r\n\t\treturn img;\r\n\t},\r\n\r\n\t_setIconStyles: function (img, name) {\r\n\t\tvar options = this.options;\r\n\t\tvar sizeOption = options[name + 'Size'];\r\n\r\n\t\tif (typeof sizeOption === 'number') {\r\n\t\t\tsizeOption = [sizeOption, sizeOption];\r\n\t\t}\r\n\r\n\t\tvar size = point(sizeOption),\r\n\t\t    anchor = point(name === 'shadow' && options.shadowAnchor || options.iconAnchor ||\r\n\t\t            size && size.divideBy(2, true));\r\n\r\n\t\timg.className = 'leaflet-marker-' + name + ' ' + (options.className || '');\r\n\r\n\t\tif (anchor) {\r\n\t\t\timg.style.marginLeft = (-anchor.x) + 'px';\r\n\t\t\timg.style.marginTop  = (-anchor.y) + 'px';\r\n\t\t}\r\n\r\n\t\tif (size) {\r\n\t\t\timg.style.width  = size.x + 'px';\r\n\t\t\timg.style.height = size.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t_createImg: function (src, el) {\r\n\t\tel = el || document.createElement('img');\r\n\t\tel.src = src;\r\n\t\treturn el;\r\n\t},\r\n\r\n\t_getIconUrl: function (name) {\r\n\t\treturn Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url'];\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.icon(options: Icon options)\r\n// Creates an icon instance with the given options.\r\nexport function icon(options) {\r\n\treturn new Icon(options);\r\n}\r\n", "import {Icon} from './Icon';\nimport * as DomUtil from '../../dom/DomUtil';\n\n/*\n * @miniclass Icon.Default (Icon)\n * @aka L.Icon.Default\n * @section\n *\n * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when\n * no icon is specified. Points to the blue marker image distributed with Leaflet\n * releases.\n *\n * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options`\n * (which is a set of `Icon options`).\n *\n * If you want to _completely_ replace the default icon, override the\n * `L.Marker.prototype.options.icon` with your own icon instead.\n */\n\nexport var IconDefault = Icon.extend({\n\n\toptions: {\n\t\ticonUrl:       'marker-icon.png',\n\t\ticonRetinaUrl: 'marker-icon-2x.png',\n\t\tshadowUrl:     'marker-shadow.png',\n\t\ticonSize:    [25, 41],\n\t\ticonAnchor:  [12, 41],\n\t\tpopupAnchor: [1, -34],\n\t\ttooltipAnchor: [16, -28],\n\t\tshadowSize:  [41, 41]\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tif (typeof IconDefault.imagePath !== 'string') {\t// Deprecated, backwards-compatibility only\n\t\t\tIconDefault.imagePath = this._detectIconPath();\n\t\t}\n\n\t\t// @option imagePath: String\n\t\t// `Icon.Default` will try to auto-detect the location of the\n\t\t// blue icon images. If you are placing these images in a non-standard\n\t\t// way, set this option to point to the right path.\n\t\treturn (this.options.imagePath || IconDefault.imagePath) + Icon.prototype._getIconUrl.call(this, name);\n\t},\n\n\t_stripUrl: function (path) {\t// separate function to use in tests\n\t\tvar strip = function (str, re, idx) {\n\t\t\tvar match = re.exec(str);\n\t\t\treturn match && match[idx];\n\t\t};\n\t\tpath = strip(path, /^url\\((['\"])?(.+)\\1\\)$/, 2);\n\t\treturn path && strip(path, /^(.*)marker-icon\\.png$/, 1);\n\t},\n\n\t_detectIconPath: function () {\n\t\tvar el = DomUtil.create('div',  'leaflet-default-icon-path', document.body);\n\t\tvar path = DomUtil.getStyle(el, 'background-image') ||\n\t\t           DomUtil.getStyle(el, 'backgroundImage');\t// IE8\n\n\t\tdocument.body.removeChild(el);\n\t\tpath = this._stripUrl(path);\n\t\tif (path) { return path; }\n\t\tvar link = document.querySelector('link[href$=\"leaflet.css\"]');\n\t\tif (!link) { return ''; }\n\t\treturn link.href.substring(0, link.href.length - 'leaflet.css'.length - 1);\n\t}\n});\n", "import {Handler} from '../../core/Handler';\nimport * as DomUtil from '../../dom/DomUtil';\nimport {Draggable} from '../../dom/Draggable';\nimport {toBounds} from '../../geometry/Bounds';\nimport {toPoint} from '../../geometry/Point';\nimport {requestAnimFrame, cancelAnimFrame} from '../../core/Util';\n\n/*\n * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.\n */\n\n\n/* @namespace Marker\n * @section Interaction handlers\n *\n * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example:\n *\n * ```js\n * marker.dragging.disable();\n * ```\n *\n * @property dragging: Handler\n * Marker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set [`marker.options.draggable`](#marker-draggable)).\n */\n\nexport var MarkerDrag = Handler.extend({\n\tinitialize: function (marker) {\n\t\tthis._marker = marker;\n\t},\n\n\taddHooks: function () {\n\t\tvar icon = this._marker._icon;\n\n\t\tif (!this._draggable) {\n\t\t\tthis._draggable = new Draggable(icon, icon, true);\n\t\t}\n\n\t\tthis._draggable.on({\n\t\t\tdragstart: this._onDragStart,\n\t\t\tpredrag: this._onPreDrag,\n\t\t\tdrag: this._onDrag,\n\t\t\tdragend: this._onDragEnd\n\t\t}, this).enable();\n\n\t\tDomUtil.addClass(icon, 'leaflet-marker-draggable');\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable.off({\n\t\t\tdragstart: this._onDragStart,\n\t\t\tpredrag: this._onPreDrag,\n\t\t\tdrag: this._onDrag,\n\t\t\tdragend: this._onDragEnd\n\t\t}, this).disable();\n\n\t\tif (this._marker._icon) {\n\t\t\tDomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');\n\t\t}\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_adjustPan: function (e) {\n\t\tvar marker = this._marker,\n\t\t    map = marker._map,\n\t\t    speed = this._marker.options.autoPanSpeed,\n\t\t    padding = this._marker.options.autoPanPadding,\n\t\t    iconPos = DomUtil.getPosition(marker._icon),\n\t\t    bounds = map.getPixelBounds(),\n\t\t    origin = map.getPixelOrigin();\n\n\t\tvar panBounds = toBounds(\n\t\t\tbounds.min._subtract(origin).add(padding),\n\t\t\tbounds.max._subtract(origin).subtract(padding)\n\t\t);\n\n\t\tif (!panBounds.contains(iconPos)) {\n\t\t\t// Compute incremental movement\n\t\t\tvar movement = toPoint(\n\t\t\t\t(Math.max(panBounds.max.x, iconPos.x) - panBounds.max.x) / (bounds.max.x - panBounds.max.x) -\n\t\t\t\t(Math.min(panBounds.min.x, iconPos.x) - panBounds.min.x) / (bounds.min.x - panBounds.min.x),\n\n\t\t\t\t(Math.max(panBounds.max.y, iconPos.y) - panBounds.max.y) / (bounds.max.y - panBounds.max.y) -\n\t\t\t\t(Math.min(panBounds.min.y, iconPos.y) - panBounds.min.y) / (bounds.min.y - panBounds.min.y)\n\t\t\t).multiplyBy(speed);\n\n\t\t\tmap.panBy(movement, {animate: false});\n\n\t\t\tthis._draggable._newPos._add(movement);\n\t\t\tthis._draggable._startPos._add(movement);\n\n\t\t\tDomUtil.setPosition(marker._icon, this._draggable._newPos);\n\t\t\tthis._onDrag(e);\n\n\t\t\tthis._panRequest = requestAnimFrame(this._adjustPan.bind(this, e));\n\t\t}\n\t},\n\n\t_onDragStart: function () {\n\t\t// @section Dragging events\n\t\t// @event dragstart: Event\n\t\t// Fired when the user starts dragging the marker.\n\n\t\t// @event movestart: Event\n\t\t// Fired when the marker starts moving (because of dragging).\n\n\t\tthis._oldLatLng = this._marker.getLatLng();\n\n\t\t// When using ES6 imports it could not be set when `Popup` was not imported as well\n\t\tthis._marker.closePopup && this._marker.closePopup();\n\n\t\tthis._marker\n\t\t\t.fire('movestart')\n\t\t\t.fire('dragstart');\n\t},\n\n\t_onPreDrag: function (e) {\n\t\tif (this._marker.options.autoPan) {\n\t\t\tcancelAnimFrame(this._panRequest);\n\t\t\tthis._panRequest = requestAnimFrame(this._adjustPan.bind(this, e));\n\t\t}\n\t},\n\n\t_onDrag: function (e) {\n\t\tvar marker = this._marker,\n\t\t    shadow = marker._shadow,\n\t\t    iconPos = DomUtil.getPosition(marker._icon),\n\t\t    latlng = marker._map.layerPointToLatLng(iconPos);\n\n\t\t// update shadow position\n\t\tif (shadow) {\n\t\t\tDomUtil.setPosition(shadow, iconPos);\n\t\t}\n\n\t\tmarker._latlng = latlng;\n\t\te.latlng = latlng;\n\t\te.oldLatLng = this._oldLatLng;\n\n\t\t// @event drag: Event\n\t\t// Fired repeatedly while the user drags the marker.\n\t\tmarker\n\t\t    .fire('move', e)\n\t\t    .fire('drag', e);\n\t},\n\n\t_onDragEnd: function (e) {\n\t\t// @event dragend: DragEndEvent\n\t\t// Fired when the user stops dragging the marker.\n\n\t\t cancelAnimFrame(this._panRequest);\n\n\t\t// @event moveend: Event\n\t\t// Fired when the marker stops moving (because of dragging).\n\t\tdelete this._oldLatLng;\n\t\tthis._marker\n\t\t    .fire('moveend')\n\t\t    .fire('dragend', e);\n\t}\n});\n", "import {Layer} from '../Layer';\r\nimport {IconDefault} from './Icon.Default';\r\nimport * as Util from '../../core/Util';\r\nimport {toLatLng as latLng} from '../../geo/LatLng';\r\nimport {toPoint as point} from '../../geometry/Point';\r\nimport * as DomUtil from '../../dom/DomUtil';\r\nimport * as DomEvent from '../../dom/DomEvent';\r\nimport {MarkerDrag} from './Marker.Drag';\r\n\r\n/*\r\n * @class Marker\r\n * @inherits Interactive layer\r\n * @aka L.Marker\r\n * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.marker([50.5, 30.5]).addTo(map);\r\n * ```\r\n */\r\n\r\nexport var Marker = Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka Marker options\r\n\toptions: {\r\n\t\t// @option icon: Icon = *\r\n\t\t// Icon instance to use for rendering the marker.\r\n\t\t// See [Icon documentation](#L.Icon) for details on how to customize the marker icon.\r\n\t\t// If not specified, a common instance of `L.Icon.Default` is used.\r\n\t\ticon: new IconDefault(),\r\n\r\n\t\t// Option inherited from \"Interactive layer\" abstract class\r\n\t\tinteractive: true,\r\n\r\n\t\t// @option keyboard: Boolean = true\r\n\t\t// Whether the marker can be tabbed to with a keyboard and clicked by pressing enter.\r\n\t\tkeyboard: true,\r\n\r\n\t\t// @option title: String = ''\r\n\t\t// Text for the browser tooltip that appear on marker hover (no tooltip by default).\r\n\t\t// [Useful for accessibility](https://leafletjs.com/examples/accessibility/#markers-must-be-labelled).\r\n\t\ttitle: '',\r\n\r\n\t\t// @option alt: String = 'Marker'\r\n\t\t// Text for the `alt` attribute of the icon image.\r\n\t\t// [Useful for accessibility](https://leafletjs.com/examples/accessibility/#markers-must-be-labelled).\r\n\t\talt: 'Marker',\r\n\r\n\t\t// @option zIndexOffset: Number = 0\r\n\t\t// By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively).\r\n\t\tzIndexOffset: 0,\r\n\r\n\t\t// @option opacity: Number = 1.0\r\n\t\t// The opacity of the marker.\r\n\t\topacity: 1,\r\n\r\n\t\t// @option riseOnHover: Boolean = false\r\n\t\t// If `true`, the marker will get on top of others when you hover the mouse over it.\r\n\t\triseOnHover: false,\r\n\r\n\t\t// @option riseOffset: Number = 250\r\n\t\t// The z-index offset used for the `riseOnHover` feature.\r\n\t\triseOffset: 250,\r\n\r\n\t\t// @option pane: String = 'markerPane'\r\n\t\t// `Map pane` where the markers icon will be added.\r\n\t\tpane: 'markerPane',\r\n\r\n\t\t// @option shadowPane: String = 'shadowPane'\r\n\t\t// `Map pane` where the markers shadow will be added.\r\n\t\tshadowPane: 'shadowPane',\r\n\r\n\t\t// @option bubblingMouseEvents: Boolean = false\r\n\t\t// When `true`, a mouse event on this marker will trigger the same event on the map\r\n\t\t// (unless [`L.DomEvent.stopPropagation`](#domevent-stoppropagation) is used).\r\n\t\tbubblingMouseEvents: false,\r\n\r\n\t\t// @option autoPanOnFocus: Boolean = true\r\n\t\t// When `true`, the map will pan whenever the marker is focused (via\r\n\t\t// e.g. pressing `tab` on the keyboard) to ensure the marker is\r\n\t\t// visible within the map's bounds\r\n\t\tautoPanOnFocus: true,\r\n\r\n\t\t// @section Draggable marker options\r\n\t\t// @option draggable: Boolean = false\r\n\t\t// Whether the marker is draggable with mouse/touch or not.\r\n\t\tdraggable: false,\r\n\r\n\t\t// @option autoPan: Boolean = false\r\n\t\t// Whether to pan the map when dragging this marker near its edge or not.\r\n\t\tautoPan: false,\r\n\r\n\t\t// @option autoPanPadding: Point = Point(50, 50)\r\n\t\t// Distance (in pixels to the left/right and to the top/bottom) of the\r\n\t\t// map edge to start panning the map.\r\n\t\tautoPanPadding: [50, 50],\r\n\r\n\t\t// @option autoPanSpeed: Number = 10\r\n\t\t// Number of pixels the map should pan by.\r\n\t\tautoPanSpeed: 10\r\n\t},\r\n\r\n\t/* @section\r\n\t *\r\n\t * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods:\r\n\t */\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tUtil.setOptions(this, options);\r\n\t\tthis._latlng = latLng(latlng);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation;\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._initIcon();\r\n\t\tthis.update();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (this.dragging && this.dragging.enabled()) {\r\n\t\t\tthis.options.draggable = true;\r\n\t\t\tthis.dragging.removeHooks();\r\n\t\t}\r\n\t\tdelete this.dragging;\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tmap.off('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._removeIcon();\r\n\t\tthis._removeShadow();\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\treturn {\r\n\t\t\tzoom: this.update,\r\n\t\t\tviewreset: this.update\r\n\t\t};\r\n\t},\r\n\r\n\t// @method getLatLng: LatLng\r\n\t// Returns the current geographical position of the marker.\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\t// @method setLatLng(latlng: LatLng): this\r\n\t// Changes the marker position to the given point.\r\n\tsetLatLng: function (latlng) {\r\n\t\tvar oldLatLng = this._latlng;\r\n\t\tthis._latlng = latLng(latlng);\r\n\t\tthis.update();\r\n\r\n\t\t// @event move: Event\r\n\t\t// Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.\r\n\t\treturn this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});\r\n\t},\r\n\r\n\t// @method setZIndexOffset(offset: Number): this\r\n\t// Changes the [zIndex offset](#marker-zindexoffset) of the marker.\r\n\tsetZIndexOffset: function (offset) {\r\n\t\tthis.options.zIndexOffset = offset;\r\n\t\treturn this.update();\r\n\t},\r\n\r\n\t// @method getIcon: Icon\r\n\t// Returns the current icon used by the marker\r\n\tgetIcon: function () {\r\n\t\treturn this.options.icon;\r\n\t},\r\n\r\n\t// @method setIcon(icon: Icon): this\r\n\t// Changes the marker icon.\r\n\tsetIcon: function (icon) {\r\n\r\n\t\tthis.options.icon = icon;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._initIcon();\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\tif (this._popup) {\r\n\t\t\tthis.bindPopup(this._popup, this._popup.options);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetElement: function () {\r\n\t\treturn this._icon;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\r\n\t\tif (this._icon && this._map) {\r\n\t\t\tvar pos = this._map.latLngToLayerPoint(this._latlng).round();\r\n\t\t\tthis._setPos(pos);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initIcon: function () {\r\n\t\tvar options = this.options,\r\n\t\t    classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');\r\n\r\n\t\tvar icon = options.icon.createIcon(this._icon),\r\n\t\t    addIcon = false;\r\n\r\n\t\t// if we're not reusing the icon, remove the old one and init new one\r\n\t\tif (icon !== this._icon) {\r\n\t\t\tif (this._icon) {\r\n\t\t\t\tthis._removeIcon();\r\n\t\t\t}\r\n\t\t\taddIcon = true;\r\n\r\n\t\t\tif (options.title) {\r\n\t\t\t\ticon.title = options.title;\r\n\t\t\t}\r\n\r\n\t\t\tif (icon.tagName === 'IMG') {\r\n\t\t\t\ticon.alt = options.alt || '';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tDomUtil.addClass(icon, classToAdd);\r\n\r\n\t\tif (options.keyboard) {\r\n\t\t\ticon.tabIndex = '0';\r\n\t\t\ticon.setAttribute('role', 'button');\r\n\t\t}\r\n\r\n\t\tthis._icon = icon;\r\n\r\n\t\tif (options.riseOnHover) {\r\n\t\t\tthis.on({\r\n\t\t\t\tmouseover: this._bringToFront,\r\n\t\t\t\tmouseout: this._resetZIndex\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.options.autoPanOnFocus) {\r\n\t\t\tDomEvent.on(icon, 'focus', this._panOnFocus, this);\r\n\t\t}\r\n\r\n\t\tvar newShadow = options.icon.createShadow(this._shadow),\r\n\t\t    addShadow = false;\r\n\r\n\t\tif (newShadow !== this._shadow) {\r\n\t\t\tthis._removeShadow();\r\n\t\t\taddShadow = true;\r\n\t\t}\r\n\r\n\t\tif (newShadow) {\r\n\t\t\tDomUtil.addClass(newShadow, classToAdd);\r\n\t\t\tnewShadow.alt = '';\r\n\t\t}\r\n\t\tthis._shadow = newShadow;\r\n\r\n\r\n\t\tif (options.opacity < 1) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\r\n\t\tif (addIcon) {\r\n\t\t\tthis.getPane().appendChild(this._icon);\r\n\t\t}\r\n\t\tthis._initInteraction();\r\n\t\tif (newShadow && addShadow) {\r\n\t\t\tthis.getPane(options.shadowPane).appendChild(this._shadow);\r\n\t\t}\r\n\t},\r\n\r\n\t_removeIcon: function () {\r\n\t\tif (this.options.riseOnHover) {\r\n\t\t\tthis.off({\r\n\t\t\t\tmouseover: this._bringToFront,\r\n\t\t\t\tmouseout: this._resetZIndex\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.options.autoPanOnFocus) {\r\n\t\t\tDomEvent.off(this._icon, 'focus', this._panOnFocus, this);\r\n\t\t}\r\n\r\n\t\tDomUtil.remove(this._icon);\r\n\t\tthis.removeInteractiveTarget(this._icon);\r\n\r\n\t\tthis._icon = null;\r\n\t},\r\n\r\n\t_removeShadow: function () {\r\n\t\tif (this._shadow) {\r\n\t\t\tDomUtil.remove(this._shadow);\r\n\t\t}\r\n\t\tthis._shadow = null;\r\n\t},\r\n\r\n\t_setPos: function (pos) {\r\n\r\n\t\tif (this._icon) {\r\n\t\t\tDomUtil.setPosition(this._icon, pos);\r\n\t\t}\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tDomUtil.setPosition(this._shadow, pos);\r\n\t\t}\r\n\r\n\t\tthis._zIndex = pos.y + this.options.zIndexOffset;\r\n\r\n\t\tthis._resetZIndex();\r\n\t},\r\n\r\n\t_updateZIndex: function (offset) {\r\n\t\tif (this._icon) {\r\n\t\t\tthis._icon.style.zIndex = this._zIndex + offset;\r\n\t\t}\r\n\t},\r\n\r\n\t_animateZoom: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();\r\n\r\n\t\tthis._setPos(pos);\r\n\t},\r\n\r\n\t_initInteraction: function () {\r\n\r\n\t\tif (!this.options.interactive) { return; }\r\n\r\n\t\tDomUtil.addClass(this._icon, 'leaflet-interactive');\r\n\r\n\t\tthis.addInteractiveTarget(this._icon);\r\n\r\n\t\tif (MarkerDrag) {\r\n\t\t\tvar draggable = this.options.draggable;\r\n\t\t\tif (this.dragging) {\r\n\t\t\t\tdraggable = this.dragging.enabled();\r\n\t\t\t\tthis.dragging.disable();\r\n\t\t\t}\r\n\r\n\t\t\tthis.dragging = new MarkerDrag(this);\r\n\r\n\t\t\tif (draggable) {\r\n\t\t\t\tthis.dragging.enable();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setOpacity(opacity: Number): this\r\n\t// Changes the opacity of the marker.\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tvar opacity = this.options.opacity;\r\n\r\n\t\tif (this._icon) {\r\n\t\t\tDomUtil.setOpacity(this._icon, opacity);\r\n\t\t}\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tDomUtil.setOpacity(this._shadow, opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_bringToFront: function () {\r\n\t\tthis._updateZIndex(this.options.riseOffset);\r\n\t},\r\n\r\n\t_resetZIndex: function () {\r\n\t\tthis._updateZIndex(0);\r\n\t},\r\n\r\n\t_panOnFocus: function () {\r\n\t\tvar map = this._map;\r\n\t\tif (!map) { return; }\r\n\r\n\t\tvar iconOpts = this.options.icon.options;\r\n\t\tvar size = iconOpts.iconSize ? point(iconOpts.iconSize) : point(0, 0);\r\n\t\tvar anchor = iconOpts.iconAnchor ? point(iconOpts.iconAnchor) : point(0, 0);\r\n\r\n\t\tmap.panInside(this._latlng, {\r\n\t\t\tpaddingTopLeft: anchor,\r\n\t\t\tpaddingBottomRight: size.subtract(anchor)\r\n\t\t});\r\n\t},\r\n\r\n\t_getPopupAnchor: function () {\r\n\t\treturn this.options.icon.options.popupAnchor;\r\n\t},\r\n\r\n\t_getTooltipAnchor: function () {\r\n\t\treturn this.options.icon.options.tooltipAnchor;\r\n\t}\r\n});\r\n\r\n\r\n// factory L.marker(latlng: LatLng, options? : Marker options)\r\n\r\n// @factory L.marker(latlng: LatLng, options? : Marker options)\r\n// Instantiates a Marker object given a geographical point and optionally an options object.\r\nexport function marker(latlng, options) {\r\n\treturn new Marker(latlng, options);\r\n}\r\n", "import {Layer} from '../Layer';\nimport * as Util from '../../core/Util';\n\n/*\n * @class Path\n * @aka L.Path\n * @inherits Interactive layer\n *\n * An abstract class that contains options and constants shared between vector\n * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`.\n */\n\nexport var Path = Layer.extend({\n\n\t// @section\n\t// @aka Path options\n\toptions: {\n\t\t// @option stroke: Boolean = true\n\t\t// Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles.\n\t\tstroke: true,\n\n\t\t// @option color: String = '#3388ff'\n\t\t// Stroke color\n\t\tcolor: '#3388ff',\n\n\t\t// @option weight: Number = 3\n\t\t// Stroke width in pixels\n\t\tweight: 3,\n\n\t\t// @option opacity: Number = 1.0\n\t\t// Stroke opacity\n\t\topacity: 1,\n\n\t\t// @option lineCap: String= 'round'\n\t\t// A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke.\n\t\tlineCap: 'round',\n\n\t\t// @option lineJoin: String = 'round'\n\t\t// A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke.\n\t\tlineJoin: 'round',\n\n\t\t// @option dashArray: String = null\n\t\t// A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).\n\t\tdashArray: null,\n\n\t\t// @option dashOffset: String = null\n\t\t// A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility).\n\t\tdashOffset: null,\n\n\t\t// @option fill: Boolean = depends\n\t\t// Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles.\n\t\tfill: false,\n\n\t\t// @option fillColor: String = *\n\t\t// Fill color. Defaults to the value of the [`color`](#path-color) option\n\t\tfillColor: null,\n\n\t\t// @option fillOpacity: Number = 0.2\n\t\t// Fill opacity.\n\t\tfillOpacity: 0.2,\n\n\t\t// @option fillRule: String = 'evenodd'\n\t\t// A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined.\n\t\tfillRule: 'evenodd',\n\n\t\t// className: '',\n\n\t\t// Option inherited from \"Interactive layer\" abstract class\n\t\tinteractive: true,\n\n\t\t// @option bubblingMouseEvents: Boolean = true\n\t\t// When `true`, a mouse event on this path will trigger the same event on the map\n\t\t// (unless [`L.DomEvent.stopPropagation`](#domevent-stoppropagation) is used).\n\t\tbubblingMouseEvents: true\n\t},\n\n\tbeforeAdd: function (map) {\n\t\t// Renderer is set here because we need to call renderer.getEvents\n\t\t// before this.getEvents.\n\t\tthis._renderer = map.getRenderer(this);\n\t},\n\n\tonAdd: function () {\n\t\tthis._renderer._initPath(this);\n\t\tthis._reset();\n\t\tthis._renderer._addPath(this);\n\t},\n\n\tonRemove: function () {\n\t\tthis._renderer._removePath(this);\n\t},\n\n\t// @method redraw(): this\n\t// Redraws the layer. Sometimes useful after you changed the coordinates that the path uses.\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._renderer._updatePath(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method setStyle(style: Path options): this\n\t// Changes the appearance of a Path based on the options in the `Path options` object.\n\tsetStyle: function (style) {\n\t\tUtil.setOptions(this, style);\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._updateStyle(this);\n\t\t\tif (this.options.stroke && style && Object.prototype.hasOwnProperty.call(style, 'weight')) {\n\t\t\t\tthis._updateBounds();\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToFront(): this\n\t// Brings the layer to the top of all path layers.\n\tbringToFront: function () {\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._bringToFront(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToBack(): this\n\t// Brings the layer to the bottom of all path layers.\n\tbringToBack: function () {\n\t\tif (this._renderer) {\n\t\t\tthis._renderer._bringToBack(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetElement: function () {\n\t\treturn this._path;\n\t},\n\n\t_reset: function () {\n\t\t// defined in child classes\n\t\tthis._project();\n\t\tthis._update();\n\t},\n\n\t_clickTolerance: function () {\n\t\t// used when doing hit detection for Canvas layers\n\t\treturn (this.options.stroke ? this.options.weight / 2 : 0) +\n\t\t  (this._renderer.options.tolerance || 0);\n\t}\n});\n", "import {Path} from './Path';\nimport * as Util from '../../core/Util';\nimport {toLatLng} from '../../geo/LatLng';\nimport {Bounds} from '../../geometry/Bounds';\n\n\n/*\n * @class CircleMarker\n * @aka L.CircleMarker\n * @inherits Path\n *\n * A circle of a fixed size with radius specified in pixels. Extends `Path`.\n */\n\nexport var CircleMarker = Path.extend({\n\n\t// @section\n\t// @aka CircleMarker options\n\toptions: {\n\t\tfill: true,\n\n\t\t// @option radius: Number = 10\n\t\t// Radius of the circle marker, in pixels\n\t\tradius: 10\n\t},\n\n\tinitialize: function (latlng, options) {\n\t\tUtil.setOptions(this, options);\n\t\tthis._latlng = toLatLng(latlng);\n\t\tthis._radius = this.options.radius;\n\t},\n\n\t// @method setLatLng(latLng: LatLng): this\n\t// Sets the position of a circle marker to a new location.\n\tsetLatLng: function (latlng) {\n\t\tvar oldLatLng = this._latlng;\n\t\tthis._latlng = toLatLng(latlng);\n\t\tthis.redraw();\n\n\t\t// @event move: Event\n\t\t// Fired when the marker is moved via [`setLatLng`](#circlemarker-setlatlng). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`.\n\t\treturn this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng});\n\t},\n\n\t// @method getLatLng(): LatLng\n\t// Returns the current geographical position of the circle marker\n\tgetLatLng: function () {\n\t\treturn this._latlng;\n\t},\n\n\t// @method setRadius(radius: Number): this\n\t// Sets the radius of a circle marker. Units are in pixels.\n\tsetRadius: function (radius) {\n\t\tthis.options.radius = this._radius = radius;\n\t\treturn this.redraw();\n\t},\n\n\t// @method getRadius(): Number\n\t// Returns the current radius of the circle\n\tgetRadius: function () {\n\t\treturn this._radius;\n\t},\n\n\tsetStyle : function (options) {\n\t\tvar radius = options && options.radius || this._radius;\n\t\tPath.prototype.setStyle.call(this, options);\n\t\tthis.setRadius(radius);\n\t\treturn this;\n\t},\n\n\t_project: function () {\n\t\tthis._point = this._map.latLngToLayerPoint(this._latlng);\n\t\tthis._updateBounds();\n\t},\n\n\t_updateBounds: function () {\n\t\tvar r = this._radius,\n\t\t    r2 = this._radiusY || r,\n\t\t    w = this._clickTolerance(),\n\t\t    p = [r + w, r2 + w];\n\t\tthis._pxBounds = new Bounds(this._point.subtract(p), this._point.add(p));\n\t},\n\n\t_update: function () {\n\t\tif (this._map) {\n\t\t\tthis._updatePath();\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updateCircle(this);\n\t},\n\n\t_empty: function () {\n\t\treturn this._radius && !this._renderer._bounds.intersects(this._pxBounds);\n\t},\n\n\t// Needed by the `Canvas` renderer for interactivity\n\t_containsPoint: function (p) {\n\t\treturn p.distanceTo(this._point) <= this._radius + this._clickTolerance();\n\t}\n});\n\n\n// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options)\n// Instantiates a circle marker object given a geographical point, and an optional options object.\nexport function circleMarker(latlng, options) {\n\treturn new CircleMarker(latlng, options);\n}\n", "import {CircleMarker} from './CircleMarker';\nimport {Path} from './Path';\nimport * as Util from '../../core/Util';\nimport {toLatLng} from '../../geo/LatLng';\nimport {LatLngBounds} from '../../geo/LatLngBounds';\nimport {Earth} from '../../geo/crs/CRS.Earth';\n\n\n/*\n * @class Circle\n * @aka L.Circle\n * @inherits CircleMarker\n *\n * A class for drawing circle overlays on a map. Extends `CircleMarker`.\n *\n * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion).\n *\n * @example\n *\n * ```js\n * L.circle([50.5, 30.5], {radius: 200}).addTo(map);\n * ```\n */\n\nexport var Circle = CircleMarker.extend({\n\n\tinitialize: function (latlng, options, legacyOptions) {\n\t\tif (typeof options === 'number') {\n\t\t\t// Backwards compatibility with 0.7.x factory (latlng, radius, options?)\n\t\t\toptions = Util.extend({}, legacyOptions, {radius: options});\n\t\t}\n\t\tUtil.setOptions(this, options);\n\t\tthis._latlng = toLatLng(latlng);\n\n\t\tif (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); }\n\n\t\t// @section\n\t\t// @aka Circle options\n\t\t// @option radius: Number; Radius of the circle, in meters.\n\t\tthis._mRadius = this.options.radius;\n\t},\n\n\t// @method setRadius(radius: Number): this\n\t// Sets the radius of a circle. Units are in meters.\n\tsetRadius: function (radius) {\n\t\tthis._mRadius = radius;\n\t\treturn this.redraw();\n\t},\n\n\t// @method getRadius(): Number\n\t// Returns the current radius of a circle. Units are in meters.\n\tgetRadius: function () {\n\t\treturn this._mRadius;\n\t},\n\n\t// @method getBounds(): LatLngBounds\n\t// Returns the `LatLngBounds` of the path.\n\tgetBounds: function () {\n\t\tvar half = [this._radius, this._radiusY || this._radius];\n\n\t\treturn new LatLngBounds(\n\t\t\tthis._map.layerPointToLatLng(this._point.subtract(half)),\n\t\t\tthis._map.layerPointToLatLng(this._point.add(half)));\n\t},\n\n\tsetStyle: Path.prototype.setStyle,\n\n\t_project: function () {\n\n\t\tvar lng = this._latlng.lng,\n\t\t    lat = this._latlng.lat,\n\t\t    map = this._map,\n\t\t    crs = map.options.crs;\n\n\t\tif (crs.distance === Earth.distance) {\n\t\t\tvar d = Math.PI / 180,\n\t\t\t    latR = (this._mRadius / Earth.R) / d,\n\t\t\t    top = map.project([lat + latR, lng]),\n\t\t\t    bottom = map.project([lat - latR, lng]),\n\t\t\t    p = top.add(bottom).divideBy(2),\n\t\t\t    lat2 = map.unproject(p).lat,\n\t\t\t    lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) /\n\t\t\t            (Math.cos(lat * d) * Math.cos(lat2 * d))) / d;\n\n\t\t\tif (isNaN(lngR) || lngR === 0) {\n\t\t\t\tlngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425\n\t\t\t}\n\n\t\t\tthis._point = p.subtract(map.getPixelOrigin());\n\t\t\tthis._radius = isNaN(lngR) ? 0 : p.x - map.project([lat2, lng - lngR]).x;\n\t\t\tthis._radiusY = p.y - top.y;\n\n\t\t} else {\n\t\t\tvar latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));\n\n\t\t\tthis._point = map.latLngToLayerPoint(this._latlng);\n\t\t\tthis._radius = this._point.x - map.latLngToLayerPoint(latlng2).x;\n\t\t}\n\n\t\tthis._updateBounds();\n\t}\n});\n\n// @factory L.circle(latlng: LatLng, options?: Circle options)\n// Instantiates a circle object given a geographical point, and an options object\n// which contains the circle radius.\n// @alternative\n// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options)\n// Obsolete way of instantiating a circle, for compatibility with 0.7.x code.\n// Do not use in new applications or plugins.\nexport function circle(latlng, options, legacyOptions) {\n\treturn new Circle(latlng, options, legacyOptions);\n}\n", "import {Path} from './Path';\nimport * as Util from '../../core/Util';\nimport * as LineUtil from '../../geometry/LineUtil';\nimport {LatLng, toLatLng} from '../../geo/LatLng';\nimport {LatLngBounds} from '../../geo/LatLngBounds';\nimport {Bounds} from '../../geometry/Bounds';\nimport {Point} from '../../geometry/Point';\n\n/*\n * @class Polyline\n * @aka L.Polyline\n * @inherits Path\n *\n * A class for drawing polyline overlays on a map. Extends `Path`.\n *\n * @example\n *\n * ```js\n * // create a red polyline from an array of LatLng points\n * var latlngs = [\n * \t[45.51, -122.68],\n * \t[37.77, -122.43],\n * \t[34.04, -118.2]\n * ];\n *\n * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);\n *\n * // zoom the map to the polyline\n * map.fitBounds(polyline.getBounds());\n * ```\n *\n * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape:\n *\n * ```js\n * // create a red polyline from an array of arrays of LatLng points\n * var latlngs = [\n * \t[[45.51, -122.68],\n * \t [37.77, -122.43],\n * \t [34.04, -118.2]],\n * \t[[40.78, -73.91],\n * \t [41.83, -87.62],\n * \t [32.76, -96.72]]\n * ];\n * ```\n */\n\n\nexport var Polyline = Path.extend({\n\n\t// @section\n\t// @aka Polyline options\n\toptions: {\n\t\t// @option smoothFactor: Number = 1.0\n\t\t// How much to simplify the polyline on each zoom level. More means\n\t\t// better performance and smoother look, and less means more accurate representation.\n\t\tsmoothFactor: 1.0,\n\n\t\t// @option noClip: Boolean = false\n\t\t// Disable polyline clipping.\n\t\tnoClip: false\n\t},\n\n\tinitialize: function (latlngs, options) {\n\t\tUtil.setOptions(this, options);\n\t\tthis._setLatLngs(latlngs);\n\t},\n\n\t// @method getLatLngs(): LatLng[]\n\t// Returns an array of the points in the path, or nested arrays of points in case of multi-polyline.\n\tgetLatLngs: function () {\n\t\treturn this._latlngs;\n\t},\n\n\t// @method setLatLngs(latlngs: LatLng[]): this\n\t// Replaces all the points in the polyline with the given array of geographical points.\n\tsetLatLngs: function (latlngs) {\n\t\tthis._setLatLngs(latlngs);\n\t\treturn this.redraw();\n\t},\n\n\t// @method isEmpty(): Boolean\n\t// Returns `true` if the Polyline has no LatLngs.\n\tisEmpty: function () {\n\t\treturn !this._latlngs.length;\n\t},\n\n\t// @method closestLayerPoint(p: Point): Point\n\t// Returns the point closest to `p` on the Polyline.\n\tclosestLayerPoint: function (p) {\n\t\tvar minDistance = Infinity,\n\t\t    minPoint = null,\n\t\t    closest = LineUtil._sqClosestPointOnSegment,\n\t\t    p1, p2;\n\n\t\tfor (var j = 0, jLen = this._parts.length; j < jLen; j++) {\n\t\t\tvar points = this._parts[j];\n\n\t\t\tfor (var i = 1, len = points.length; i < len; i++) {\n\t\t\t\tp1 = points[i - 1];\n\t\t\t\tp2 = points[i];\n\n\t\t\t\tvar sqDist = closest(p, p1, p2, true);\n\n\t\t\t\tif (sqDist < minDistance) {\n\t\t\t\t\tminDistance = sqDist;\n\t\t\t\t\tminPoint = closest(p, p1, p2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (minPoint) {\n\t\t\tminPoint.distance = Math.sqrt(minDistance);\n\t\t}\n\t\treturn minPoint;\n\t},\n\n\t// @method getCenter(): LatLng\n\t// Returns the center ([centroid](https://en.wikipedia.org/wiki/Centroid)) of the polyline.\n\tgetCenter: function () {\n\t\t// throws error when not yet added to map as this center calculation requires projected coordinates\n\t\tif (!this._map) {\n\t\t\tthrow new Error('Must add layer to map before using getCenter()');\n\t\t}\n\t\treturn LineUtil.polylineCenter(this._defaultShape(), this._map.options.crs);\n\t},\n\n\t// @method getBounds(): LatLngBounds\n\t// Returns the `LatLngBounds` of the path.\n\tgetBounds: function () {\n\t\treturn this._bounds;\n\t},\n\n\t// @method addLatLng(latlng: LatLng, latlngs?: LatLng[]): this\n\t// Adds a given point to the polyline. By default, adds to the first ring of\n\t// the polyline in case of a multi-polyline, but can be overridden by passing\n\t// a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)).\n\taddLatLng: function (latlng, latlngs) {\n\t\tlatlngs = latlngs || this._defaultShape();\n\t\tlatlng = toLatLng(latlng);\n\t\tlatlngs.push(latlng);\n\t\tthis._bounds.extend(latlng);\n\t\treturn this.redraw();\n\t},\n\n\t_setLatLngs: function (latlngs) {\n\t\tthis._bounds = new LatLngBounds();\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\n\t},\n\n\t_defaultShape: function () {\n\t\treturn LineUtil.isFlat(this._latlngs) ? this._latlngs : this._latlngs[0];\n\t},\n\n\t// recursively convert latlngs input into actual LatLng instances; calculate bounds along the way\n\t_convertLatLngs: function (latlngs) {\n\t\tvar result = [],\n\t\t    flat = LineUtil.isFlat(latlngs);\n\n\t\tfor (var i = 0, len = latlngs.length; i < len; i++) {\n\t\t\tif (flat) {\n\t\t\t\tresult[i] = toLatLng(latlngs[i]);\n\t\t\t\tthis._bounds.extend(result[i]);\n\t\t\t} else {\n\t\t\t\tresult[i] = this._convertLatLngs(latlngs[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t},\n\n\t_project: function () {\n\t\tvar pxBounds = new Bounds();\n\t\tthis._rings = [];\n\t\tthis._projectLatlngs(this._latlngs, this._rings, pxBounds);\n\n\t\tif (this._bounds.isValid() && pxBounds.isValid()) {\n\t\t\tthis._rawPxBounds = pxBounds;\n\t\t\tthis._updateBounds();\n\t\t}\n\t},\n\n\t_updateBounds: function () {\n\t\tvar w = this._clickTolerance(),\n\t\t    p = new Point(w, w);\n\n\t\tif (!this._rawPxBounds) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._pxBounds = new Bounds([\n\t\t\tthis._rawPxBounds.min.subtract(p),\n\t\t\tthis._rawPxBounds.max.add(p)\n\t\t]);\n\t},\n\n\t// recursively turns latlngs into a set of rings with projected coordinates\n\t_projectLatlngs: function (latlngs, result, projectedBounds) {\n\t\tvar flat = latlngs[0] instanceof LatLng,\n\t\t    len = latlngs.length,\n\t\t    i, ring;\n\n\t\tif (flat) {\n\t\t\tring = [];\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tring[i] = this._map.latLngToLayerPoint(latlngs[i]);\n\t\t\t\tprojectedBounds.extend(ring[i]);\n\t\t\t}\n\t\t\tresult.push(ring);\n\t\t} else {\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tthis._projectLatlngs(latlngs[i], result, projectedBounds);\n\t\t\t}\n\t\t}\n\t},\n\n\t// clip polyline by renderer bounds so that we have less to render for performance\n\t_clipPoints: function () {\n\t\tvar bounds = this._renderer._bounds;\n\n\t\tthis._parts = [];\n\t\tif (!this._pxBounds || !this._pxBounds.intersects(bounds)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = this._rings;\n\t\t\treturn;\n\t\t}\n\n\t\tvar parts = this._parts,\n\t\t    i, j, k, len, len2, segment, points;\n\n\t\tfor (i = 0, k = 0, len = this._rings.length; i < len; i++) {\n\t\t\tpoints = this._rings[i];\n\n\t\t\tfor (j = 0, len2 = points.length; j < len2 - 1; j++) {\n\t\t\t\tsegment = LineUtil.clipSegment(points[j], points[j + 1], bounds, j, true);\n\n\t\t\t\tif (!segment) { continue; }\n\n\t\t\t\tparts[k] = parts[k] || [];\n\t\t\t\tparts[k].push(segment[0]);\n\n\t\t\t\t// if segment goes out of screen, or it's the last one, it's the end of the line part\n\t\t\t\tif ((segment[1] !== points[j + 1]) || (j === len2 - 2)) {\n\t\t\t\t\tparts[k].push(segment[1]);\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// simplify each clipped part of the polyline for performance\n\t_simplifyPoints: function () {\n\t\tvar parts = this._parts,\n\t\t    tolerance = this.options.smoothFactor;\n\n\t\tfor (var i = 0, len = parts.length; i < len; i++) {\n\t\t\tparts[i] = LineUtil.simplify(parts[i], tolerance);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tif (!this._map) { return; }\n\n\t\tthis._clipPoints();\n\t\tthis._simplifyPoints();\n\t\tthis._updatePath();\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updatePoly(this);\n\t},\n\n\t// Needed by the `Canvas` renderer for interactivity\n\t_containsPoint: function (p, closed) {\n\t\tvar i, j, k, len, len2, part,\n\t\t    w = this._clickTolerance();\n\n\t\tif (!this._pxBounds || !this._pxBounds.contains(p)) { return false; }\n\n\t\t// hit detection for polylines\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\t\tpart = this._parts[i];\n\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\t\tif (!closed && (j === 0)) { continue; }\n\n\t\t\t\tif (LineUtil.pointToSegmentDistance(p, part[k], part[j]) <= w) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n});\n\n// @factory L.polyline(latlngs: LatLng[], options?: Polyline options)\n// Instantiates a polyline object given an array of geographical points and\n// optionally an options object. You can create a `Polyline` object with\n// multiple separate lines (`MultiPolyline`) by passing an array of arrays\n// of geographic points.\nexport function polyline(latlngs, options) {\n\treturn new Polyline(latlngs, options);\n}\n\n// Retrocompat. Allow plugins to support Leaflet versions before and after 1.1.\nPolyline._flat = LineUtil._flat;\n", "import {Polyline} from './Polyline';\nimport {LatLng} from '../../geo/LatLng';\nimport * as LineUtil from '../../geometry/LineUtil';\nimport {Point} from '../../geometry/Point';\nimport {Bounds} from '../../geometry/Bounds';\nimport * as PolyUtil from '../../geometry/PolyUtil';\n\n/*\n * @class Polygon\n * @aka L.Polygon\n * @inherits Polyline\n *\n * A class for drawing polygon overlays on a map. Extends `Polyline`.\n *\n * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.\n *\n *\n * @example\n *\n * ```js\n * // create a red polygon from an array of LatLng points\n * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]];\n *\n * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);\n *\n * // zoom the map to the polygon\n * map.fitBounds(polygon.getBounds());\n * ```\n *\n * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:\n *\n * ```js\n * var latlngs = [\n *   [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring\n *   [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole\n * ];\n * ```\n *\n * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.\n *\n * ```js\n * var latlngs = [\n *   [ // first polygon\n *     [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring\n *     [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole\n *   ],\n *   [ // second polygon\n *     [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]]\n *   ]\n * ];\n * ```\n */\n\nexport var Polygon = Polyline.extend({\n\n\toptions: {\n\t\tfill: true\n\t},\n\n\tisEmpty: function () {\n\t\treturn !this._latlngs.length || !this._latlngs[0].length;\n\t},\n\n\t// @method getCenter(): LatLng\n\t// Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the Polygon.\n\tgetCenter: function () {\n\t\t// throws error when not yet added to map as this center calculation requires projected coordinates\n\t\tif (!this._map) {\n\t\t\tthrow new Error('Must add layer to map before using getCenter()');\n\t\t}\n\t\treturn PolyUtil.polygonCenter(this._defaultShape(), this._map.options.crs);\n\t},\n\n\t_convertLatLngs: function (latlngs) {\n\t\tvar result = Polyline.prototype._convertLatLngs.call(this, latlngs),\n\t\t    len = result.length;\n\n\t\t// remove last point if it equals first one\n\t\tif (len >= 2 && result[0] instanceof LatLng && result[0].equals(result[len - 1])) {\n\t\t\tresult.pop();\n\t\t}\n\t\treturn result;\n\t},\n\n\t_setLatLngs: function (latlngs) {\n\t\tPolyline.prototype._setLatLngs.call(this, latlngs);\n\t\tif (LineUtil.isFlat(this._latlngs)) {\n\t\t\tthis._latlngs = [this._latlngs];\n\t\t}\n\t},\n\n\t_defaultShape: function () {\n\t\treturn LineUtil.isFlat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0];\n\t},\n\n\t_clipPoints: function () {\n\t\t// polygons need a different clipping algorithm so we redefine that\n\n\t\tvar bounds = this._renderer._bounds,\n\t\t    w = this.options.weight,\n\t\t    p = new Point(w, w);\n\n\t\t// increase clip padding by stroke width to avoid stroke on clip edges\n\t\tbounds = new Bounds(bounds.min.subtract(p), bounds.max.add(p));\n\n\t\tthis._parts = [];\n\t\tif (!this._pxBounds || !this._pxBounds.intersects(bounds)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.options.noClip) {\n\t\t\tthis._parts = this._rings;\n\t\t\treturn;\n\t\t}\n\n\t\tfor (var i = 0, len = this._rings.length, clipped; i < len; i++) {\n\t\t\tclipped = PolyUtil.clipPolygon(this._rings[i], bounds, true);\n\t\t\tif (clipped.length) {\n\t\t\t\tthis._parts.push(clipped);\n\t\t\t}\n\t\t}\n\t},\n\n\t_updatePath: function () {\n\t\tthis._renderer._updatePoly(this, true);\n\t},\n\n\t// Needed by the `Canvas` renderer for interactivity\n\t_containsPoint: function (p) {\n\t\tvar inside = false,\n\t\t    part, p1, p2, i, j, k, len, len2;\n\n\t\tif (!this._pxBounds || !this._pxBounds.contains(p)) { return false; }\n\n\t\t// ray casting algorithm for detecting if point is in polygon\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\n\t\t\tpart = this._parts[i];\n\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\n\t\t\t\tp1 = part[j];\n\t\t\t\tp2 = part[k];\n\n\t\t\t\tif (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n\t\t\t\t\tinside = !inside;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// also check if it's on polygon stroke\n\t\treturn inside || Polyline.prototype._containsPoint.call(this, p, true);\n\t}\n\n});\n\n\n// @factory L.polygon(latlngs: LatLng[], options?: Polyline options)\nexport function polygon(latlngs, options) {\n\treturn new Polygon(latlngs, options);\n}\n", "import {LayerGroup} from './LayerGroup';\r\nimport {FeatureGroup} from './FeatureGroup';\r\nimport * as Util from '../core/Util';\r\nimport {Marker} from './marker/Marker';\r\nimport {Circle} from './vector/Circle';\r\nimport {CircleMarker} from './vector/CircleMarker';\r\nimport {Polyline} from './vector/Polyline';\r\nimport {Polygon} from './vector/Polygon';\r\nimport {LatLng} from '../geo/LatLng';\r\nimport * as LineUtil from '../geometry/LineUtil';\r\nimport {toLatLng} from '../geo/LatLng';\r\n\r\n\r\n/*\r\n * @class GeoJSON\r\n * @aka L.GeoJSON\r\n * @inherits FeatureGroup\r\n *\r\n * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse\r\n * GeoJSON data and display it on the map. Extends `FeatureGroup`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.geoJSON(data, {\r\n * \tstyle: function (feature) {\r\n * \t\treturn {color: feature.properties.color};\r\n * \t}\r\n * }).bindPopup(function (layer) {\r\n * \treturn layer.feature.properties.description;\r\n * }).addTo(map);\r\n * ```\r\n */\r\n\r\nexport var GeoJSON = FeatureGroup.extend({\r\n\r\n\t/* @section\r\n\t * @aka GeoJSON options\r\n\t *\r\n\t * @option pointToLayer: Function = *\r\n\t * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally\r\n\t * called when data is added, passing the GeoJSON point feature and its `LatLng`.\r\n\t * The default is to spawn a default `Marker`:\r\n\t * ```js\r\n\t * function(geoJsonPoint, latlng) {\r\n\t * \treturn L.marker(latlng);\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @option style: Function = *\r\n\t * A `Function` defining the `Path options` for styling GeoJSON lines and polygons,\r\n\t * called internally when data is added.\r\n\t * The default value is to not override any defaults:\r\n\t * ```js\r\n\t * function (geoJsonFeature) {\r\n\t * \treturn {}\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @option onEachFeature: Function = *\r\n\t * A `Function` that will be called once for each created `Feature`, after it has\r\n\t * been created and styled. Useful for attaching events and popups to features.\r\n\t * The default is to do nothing with the newly created layers:\r\n\t * ```js\r\n\t * function (feature, layer) {}\r\n\t * ```\r\n\t *\r\n\t * @option filter: Function = *\r\n\t * A `Function` that will be used to decide whether to include a feature or not.\r\n\t * The default is to include all features:\r\n\t * ```js\r\n\t * function (geoJsonFeature) {\r\n\t * \treturn true;\r\n\t * }\r\n\t * ```\r\n\t * Note: dynamically changing the `filter` option will have effect only on newly\r\n\t * added data. It will _not_ re-evaluate already included features.\r\n\t *\r\n\t * @option coordsToLatLng: Function = *\r\n\t * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s.\r\n\t * The default is the `coordsToLatLng` static method.\r\n\t *\r\n\t * @option markersInheritOptions: Boolean = false\r\n\t * Whether default Markers for \"Point\" type Features inherit from group options.\r\n\t */\r\n\r\n\tinitialize: function (geojson, options) {\r\n\t\tUtil.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tif (geojson) {\r\n\t\t\tthis.addData(geojson);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method addData( <GeoJSON> data ): this\r\n\t// Adds a GeoJSON object to the layer.\r\n\taddData: function (geojson) {\r\n\t\tvar features = Util.isArray(geojson) ? geojson : geojson.features,\r\n\t\t    i, len, feature;\r\n\r\n\t\tif (features) {\r\n\t\t\tfor (i = 0, len = features.length; i < len; i++) {\r\n\t\t\t\t// only add this if geometry or geometries are set and not null\r\n\t\t\t\tfeature = features[i];\r\n\t\t\t\tif (feature.geometries || feature.geometry || feature.features || feature.coordinates) {\r\n\t\t\t\t\tthis.addData(feature);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.filter && !options.filter(geojson)) { return this; }\r\n\r\n\t\tvar layer = geometryToLayer(geojson, options);\r\n\t\tif (!layer) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tlayer.feature = asFeature(geojson);\r\n\r\n\t\tlayer.defaultOptions = layer.options;\r\n\t\tthis.resetStyle(layer);\r\n\r\n\t\tif (options.onEachFeature) {\r\n\t\t\toptions.onEachFeature(geojson, layer);\r\n\t\t}\r\n\r\n\t\treturn this.addLayer(layer);\r\n\t},\r\n\r\n\t// @method resetStyle( <Path> layer? ): this\r\n\t// Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.\r\n\t// If `layer` is omitted, the style of all features in the current layer is reset.\r\n\tresetStyle: function (layer) {\r\n\t\tif (layer === undefined) {\r\n\t\t\treturn this.eachLayer(this.resetStyle, this);\r\n\t\t}\r\n\t\t// reset any custom styles\r\n\t\tlayer.options = Util.extend({}, layer.defaultOptions);\r\n\t\tthis._setLayerStyle(layer, this.options.style);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setStyle( <Function> style ): this\r\n\t// Changes styles of GeoJSON vector layers with the given style function.\r\n\tsetStyle: function (style) {\r\n\t\treturn this.eachLayer(function (layer) {\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_setLayerStyle: function (layer, style) {\r\n\t\tif (layer.setStyle) {\r\n\t\t\tif (typeof style === 'function') {\r\n\t\t\t\tstyle = style(layer.feature);\r\n\t\t\t}\r\n\t\t\tlayer.setStyle(style);\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// @section\r\n// There are several static functions which can be called without instantiating L.GeoJSON:\r\n\r\n// @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer\r\n// Creates a `Layer` from a given GeoJSON feature. Can use a custom\r\n// [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng)\r\n// functions if provided as options.\r\nexport function geometryToLayer(geojson, options) {\r\n\r\n\tvar geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,\r\n\t    coords = geometry ? geometry.coordinates : null,\r\n\t    layers = [],\r\n\t    pointToLayer = options && options.pointToLayer,\r\n\t    _coordsToLatLng = options && options.coordsToLatLng || coordsToLatLng,\r\n\t    latlng, latlngs, i, len;\r\n\r\n\tif (!coords && !geometry) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tswitch (geometry.type) {\r\n\tcase 'Point':\r\n\t\tlatlng = _coordsToLatLng(coords);\r\n\t\treturn _pointToLayer(pointToLayer, geojson, latlng, options);\r\n\r\n\tcase 'MultiPoint':\r\n\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\tlatlng = _coordsToLatLng(coords[i]);\r\n\t\t\tlayers.push(_pointToLayer(pointToLayer, geojson, latlng, options));\r\n\t\t}\r\n\t\treturn new FeatureGroup(layers);\r\n\r\n\tcase 'LineString':\r\n\tcase 'MultiLineString':\r\n\t\tlatlngs = coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, _coordsToLatLng);\r\n\t\treturn new Polyline(latlngs, options);\r\n\r\n\tcase 'Polygon':\r\n\tcase 'MultiPolygon':\r\n\t\tlatlngs = coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, _coordsToLatLng);\r\n\t\treturn new Polygon(latlngs, options);\r\n\r\n\tcase 'GeometryCollection':\r\n\t\tfor (i = 0, len = geometry.geometries.length; i < len; i++) {\r\n\t\t\tvar geoLayer = geometryToLayer({\r\n\t\t\t\tgeometry: geometry.geometries[i],\r\n\t\t\t\ttype: 'Feature',\r\n\t\t\t\tproperties: geojson.properties\r\n\t\t\t}, options);\r\n\r\n\t\t\tif (geoLayer) {\r\n\t\t\t\tlayers.push(geoLayer);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn new FeatureGroup(layers);\r\n\r\n\tcase 'FeatureCollection':\r\n\t\tfor (i = 0, len = geometry.features.length; i < len; i++) {\r\n\t\t\tvar featureLayer = geometryToLayer(geometry.features[i], options);\r\n\r\n\t\t\tif (featureLayer) {\r\n\t\t\t\tlayers.push(featureLayer);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn new FeatureGroup(layers);\r\n\r\n\tdefault:\r\n\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t}\r\n}\r\n\r\nfunction _pointToLayer(pointToLayerFn, geojson, latlng, options) {\r\n\treturn pointToLayerFn ?\r\n\t\tpointToLayerFn(geojson, latlng) :\r\n\t\tnew Marker(latlng, options && options.markersInheritOptions && options);\r\n}\r\n\r\n// @function coordsToLatLng(coords: Array): LatLng\r\n// Creates a `LatLng` object from an array of 2 numbers (longitude, latitude)\r\n// or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points.\r\nexport function coordsToLatLng(coords) {\r\n\treturn new LatLng(coords[1], coords[0], coords[2]);\r\n}\r\n\r\n// @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array\r\n// Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array.\r\n// `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default).\r\n// Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function.\r\nexport function coordsToLatLngs(coords, levelsDeep, _coordsToLatLng) {\r\n\tvar latlngs = [];\r\n\r\n\tfor (var i = 0, len = coords.length, latlng; i < len; i++) {\r\n\t\tlatlng = levelsDeep ?\r\n\t\t\tcoordsToLatLngs(coords[i], levelsDeep - 1, _coordsToLatLng) :\r\n\t\t\t(_coordsToLatLng || coordsToLatLng)(coords[i]);\r\n\r\n\t\tlatlngs.push(latlng);\r\n\t}\r\n\r\n\treturn latlngs;\r\n}\r\n\r\n// @function latLngToCoords(latlng: LatLng, precision?: Number|false): Array\r\n// Reverse of [`coordsToLatLng`](#geojson-coordstolatlng)\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function.\r\nexport function latLngToCoords(latlng, precision) {\r\n\tlatlng = toLatLng(latlng);\r\n\treturn latlng.alt !== undefined ?\r\n\t\t[Util.formatNum(latlng.lng, precision), Util.formatNum(latlng.lat, precision), Util.formatNum(latlng.alt, precision)] :\r\n\t\t[Util.formatNum(latlng.lng, precision), Util.formatNum(latlng.lat, precision)];\r\n}\r\n\r\n// @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean, precision?: Number|false): Array\r\n// Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs)\r\n// `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default.\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function.\r\nexport function latLngsToCoords(latlngs, levelsDeep, closed, precision) {\r\n\tvar coords = [];\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\t// Check for flat arrays required to ensure unbalanced arrays are correctly converted in recursion\r\n\t\tcoords.push(levelsDeep ?\r\n\t\t\tlatLngsToCoords(latlngs[i], LineUtil.isFlat(latlngs[i]) ? 0 : levelsDeep - 1, closed, precision) :\r\n\t\t\tlatLngToCoords(latlngs[i], precision));\r\n\t}\r\n\r\n\tif (!levelsDeep && closed && coords.length > 0) {\r\n\t\tcoords.push(coords[0].slice());\r\n\t}\r\n\r\n\treturn coords;\r\n}\r\n\r\nexport function getFeature(layer, newGeometry) {\r\n\treturn layer.feature ?\r\n\t\tUtil.extend({}, layer.feature, {geometry: newGeometry}) :\r\n\t\tasFeature(newGeometry);\r\n}\r\n\r\n// @function asFeature(geojson: Object): Object\r\n// Normalize GeoJSON geometries/features into GeoJSON features.\r\nexport function asFeature(geojson) {\r\n\tif (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') {\r\n\t\treturn geojson;\r\n\t}\r\n\r\n\treturn {\r\n\t\ttype: 'Feature',\r\n\t\tproperties: {},\r\n\t\tgeometry: geojson\r\n\t};\r\n}\r\n\r\nvar PointToGeoJSON = {\r\n\ttoGeoJSON: function (precision) {\r\n\t\treturn getFeature(this, {\r\n\t\t\ttype: 'Point',\r\n\t\t\tcoordinates: latLngToCoords(this.getLatLng(), precision)\r\n\t\t});\r\n\t}\r\n};\r\n\r\n// @namespace Marker\r\n// @section Other methods\r\n// @method toGeoJSON(precision?: Number|false): Object\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`.\r\n// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature).\r\nMarker.include(PointToGeoJSON);\r\n\r\n// @namespace CircleMarker\r\n// @method toGeoJSON(precision?: Number|false): Object\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`.\r\n// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature).\r\nCircle.include(PointToGeoJSON);\r\nCircleMarker.include(PointToGeoJSON);\r\n\r\n\r\n// @namespace Polyline\r\n// @method toGeoJSON(precision?: Number|false): Object\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`.\r\n// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature).\r\nPolyline.include({\r\n\ttoGeoJSON: function (precision) {\r\n\t\tvar multi = !LineUtil.isFlat(this._latlngs);\r\n\r\n\t\tvar coords = latLngsToCoords(this._latlngs, multi ? 1 : 0, false, precision);\r\n\r\n\t\treturn getFeature(this, {\r\n\t\t\ttype: (multi ? 'Multi' : '') + 'LineString',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t}\r\n});\r\n\r\n// @namespace Polygon\r\n// @method toGeoJSON(precision?: Number|false): Object\r\n// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`.\r\n// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature).\r\nPolygon.include({\r\n\ttoGeoJSON: function (precision) {\r\n\t\tvar holes = !LineUtil.isFlat(this._latlngs),\r\n\t\t    multi = holes && !LineUtil.isFlat(this._latlngs[0]);\r\n\r\n\t\tvar coords = latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true, precision);\r\n\r\n\t\tif (!holes) {\r\n\t\t\tcoords = [coords];\r\n\t\t}\r\n\r\n\t\treturn getFeature(this, {\r\n\t\t\ttype: (multi ? 'Multi' : '') + 'Polygon',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t}\r\n});\r\n\r\n\r\n// @namespace LayerGroup\r\nLayerGroup.include({\r\n\ttoMultiPoint: function (precision) {\r\n\t\tvar coords = [];\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tcoords.push(layer.toGeoJSON(precision).geometry.coordinates);\r\n\t\t});\r\n\r\n\t\treturn getFeature(this, {\r\n\t\t\ttype: 'MultiPoint',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t},\r\n\r\n\t// @method toGeoJSON(precision?: Number|false): Object\r\n\t// Coordinates values are rounded with [`formatNum`](#util-formatnum) function with given `precision`.\r\n\t// Returns a [`GeoJSON`](https://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `FeatureCollection`, `GeometryCollection`, or `MultiPoint`).\r\n\ttoGeoJSON: function (precision) {\r\n\r\n\t\tvar type = this.feature && this.feature.geometry && this.feature.geometry.type;\r\n\r\n\t\tif (type === 'MultiPoint') {\r\n\t\t\treturn this.toMultiPoint(precision);\r\n\t\t}\r\n\r\n\t\tvar isGeometryCollection = type === 'GeometryCollection',\r\n\t\t    jsons = [];\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tif (layer.toGeoJSON) {\r\n\t\t\t\tvar json = layer.toGeoJSON(precision);\r\n\t\t\t\tif (isGeometryCollection) {\r\n\t\t\t\t\tjsons.push(json.geometry);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar feature = asFeature(json);\r\n\t\t\t\t\t// Squash nested feature collections\r\n\t\t\t\t\tif (feature.type === 'FeatureCollection') {\r\n\t\t\t\t\t\tjsons.push.apply(jsons, feature.features);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tjsons.push(feature);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (isGeometryCollection) {\r\n\t\t\treturn getFeature(this, {\r\n\t\t\t\tgeometries: jsons,\r\n\t\t\t\ttype: 'GeometryCollection'\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'FeatureCollection',\r\n\t\t\tfeatures: jsons\r\n\t\t};\r\n\t}\r\n});\r\n\r\n// @namespace GeoJSON\r\n// @factory L.geoJSON(geojson?: Object, options?: GeoJSON options)\r\n// Creates a GeoJSON layer. Optionally accepts an object in\r\n// [GeoJSON format](https://tools.ietf.org/html/rfc7946) to display on the map\r\n// (you can alternatively add it later with `addData` method) and an `options` object.\r\nexport function geoJSON(geojson, options) {\r\n\treturn new GeoJSON(geojson, options);\r\n}\r\n\r\n// Backward compatibility.\r\nexport var geoJson = geoJSON;\r\n", "import {Layer} from './Layer';\r\nimport * as Util from '../core/Util';\r\nimport {toLatLngBounds} from '../geo/LatLngBounds';\r\nimport {Bounds} from '../geometry/Bounds';\r\nimport * as DomUtil from '../dom/DomUtil';\r\n\r\n/*\r\n * @class ImageOverlay\r\n * @aka L.ImageOverlay\r\n * @inherits Interactive layer\r\n *\r\n * Used to load and display a single image over specific bounds of the map. Extends `Layer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var imageUrl = 'https://maps.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',\r\n * \timageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];\r\n * L.imageOverlay(imageUrl, imageBounds).addTo(map);\r\n * ```\r\n */\r\n\r\nexport var ImageOverlay = Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka ImageOverlay options\r\n\toptions: {\r\n\t\t// @option opacity: Number = 1.0\r\n\t\t// The opacity of the image overlay.\r\n\t\topacity: 1,\r\n\r\n\t\t// @option alt: String = ''\r\n\t\t// Text for the `alt` attribute of the image (useful for accessibility).\r\n\t\talt: '',\r\n\r\n\t\t// @option interactive: Boolean = false\r\n\t\t// If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered.\r\n\t\tinteractive: false,\r\n\r\n\t\t// @option crossOrigin: Boolean|String = false\r\n\t\t// Whether the crossOrigin attribute will be added to the image.\r\n\t\t// If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data.\r\n\t\t// Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values.\r\n\t\tcrossOrigin: false,\r\n\r\n\t\t// @option errorOverlayUrl: String = ''\r\n\t\t// URL to the overlay image to show in place of the overlay that failed to load.\r\n\t\terrorOverlayUrl: '',\r\n\r\n\t\t// @option zIndex: Number = 1\r\n\t\t// The explicit [zIndex](https://developer.mozilla.org/docs/Web/CSS/CSS_Positioning/Understanding_z_index) of the overlay layer.\r\n\t\tzIndex: 1,\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom class name to assign to the image. Empty by default.\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\tinitialize: function (url, bounds, options) { // (String, LatLngBounds, Object)\r\n\t\tthis._url = url;\r\n\t\tthis._bounds = toLatLngBounds(bounds);\r\n\r\n\t\tUtil.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function () {\r\n\t\tif (!this._image) {\r\n\t\t\tthis._initImage();\r\n\r\n\t\t\tif (this.options.opacity < 1) {\r\n\t\t\t\tthis._updateOpacity();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.options.interactive) {\r\n\t\t\tDomUtil.addClass(this._image, 'leaflet-interactive');\r\n\t\t\tthis.addInteractiveTarget(this._image);\r\n\t\t}\r\n\r\n\t\tthis.getPane().appendChild(this._image);\r\n\t\tthis._reset();\r\n\t},\r\n\r\n\tonRemove: function () {\r\n\t\tDomUtil.remove(this._image);\r\n\t\tif (this.options.interactive) {\r\n\t\t\tthis.removeInteractiveTarget(this._image);\r\n\t\t}\r\n\t},\r\n\r\n\t// @method setOpacity(opacity: Number): this\r\n\t// Sets the opacity of the overlay.\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\r\n\t\tif (this._image) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (styleOpts) {\r\n\t\tif (styleOpts.opacity) {\r\n\t\t\tthis.setOpacity(styleOpts.opacity);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToFront(): this\r\n\t// Brings the layer to the top of all overlays.\r\n\tbringToFront: function () {\r\n\t\tif (this._map) {\r\n\t\t\tDomUtil.toFront(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToBack(): this\r\n\t// Brings the layer to the bottom of all overlays.\r\n\tbringToBack: function () {\r\n\t\tif (this._map) {\r\n\t\t\tDomUtil.toBack(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setUrl(url: String): this\r\n\t// Changes the URL of the image.\r\n\tsetUrl: function (url) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (this._image) {\r\n\t\t\tthis._image.src = url;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method setBounds(bounds: LatLngBounds): this\r\n\t// Update the bounds that this ImageOverlay covers\r\n\tsetBounds: function (bounds) {\r\n\t\tthis._bounds = toLatLngBounds(bounds);\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tzoom: this._reset,\r\n\t\t\tviewreset: this._reset\r\n\t\t};\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tevents.zoomanim = this._animateZoom;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t// @method setZIndex(value: Number): this\r\n\t// Changes the [zIndex](#imageoverlay-zindex) of the image overlay.\r\n\tsetZIndex: function (value) {\r\n\t\tthis.options.zIndex = value;\r\n\t\tthis._updateZIndex();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getBounds(): LatLngBounds\r\n\t// Get the bounds that this ImageOverlay covers\r\n\tgetBounds: function () {\r\n\t\treturn this._bounds;\r\n\t},\r\n\r\n\t// @method getElement(): HTMLElement\r\n\t// Returns the instance of [`HTMLImageElement`](https://developer.mozilla.org/docs/Web/API/HTMLImageElement)\r\n\t// used by this overlay.\r\n\tgetElement: function () {\r\n\t\treturn this._image;\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tvar wasElementSupplied = this._url.tagName === 'IMG';\r\n\t\tvar img = this._image = wasElementSupplied ? this._url : DomUtil.create('img');\r\n\r\n\t\tDomUtil.addClass(img, 'leaflet-image-layer');\r\n\t\tif (this._zoomAnimated) { DomUtil.addClass(img, 'leaflet-zoom-animated'); }\r\n\t\tif (this.options.className) { DomUtil.addClass(img, this.options.className); }\r\n\r\n\t\timg.onselectstart = Util.falseFn;\r\n\t\timg.onmousemove = Util.falseFn;\r\n\r\n\t\t// @event load: Event\r\n\t\t// Fired when the ImageOverlay layer has loaded its image\r\n\t\timg.onload = Util.bind(this.fire, this, 'load');\r\n\t\timg.onerror = Util.bind(this._overlayOnError, this, 'error');\r\n\r\n\t\tif (this.options.crossOrigin || this.options.crossOrigin === '') {\r\n\t\t\timg.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin;\r\n\t\t}\r\n\r\n\t\tif (this.options.zIndex) {\r\n\t\t\tthis._updateZIndex();\r\n\t\t}\r\n\r\n\t\tif (wasElementSupplied) {\r\n\t\t\tthis._url = img.src;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\timg.src = this._url;\r\n\t\timg.alt = this.options.alt;\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar scale = this._map.getZoomScale(e.zoom),\r\n\t\t    offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min;\r\n\r\n\t\tDomUtil.setTransform(this._image, offset, scale);\r\n\t},\r\n\r\n\t_reset: function () {\r\n\t\tvar image = this._image,\r\n\t\t    bounds = new Bounds(\r\n\t\t        this._map.latLngToLayerPoint(this._bounds.getNorthWest()),\r\n\t\t        this._map.latLngToLayerPoint(this._bounds.getSouthEast())),\r\n\t\t    size = bounds.getSize();\r\n\r\n\t\tDomUtil.setPosition(image, bounds.min);\r\n\r\n\t\timage.style.width  = size.x + 'px';\r\n\t\timage.style.height = size.y + 'px';\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tDomUtil.setOpacity(this._image, this.options.opacity);\r\n\t},\r\n\r\n\t_updateZIndex: function () {\r\n\t\tif (this._image && this.options.zIndex !== undefined && this.options.zIndex !== null) {\r\n\t\t\tthis._image.style.zIndex = this.options.zIndex;\r\n\t\t}\r\n\t},\r\n\r\n\t_overlayOnError: function () {\r\n\t\t// @event error: Event\r\n\t\t// Fired when the ImageOverlay layer fails to load its image\r\n\t\tthis.fire('error');\r\n\r\n\t\tvar errorUrl = this.options.errorOverlayUrl;\r\n\t\tif (errorUrl && this._url !== errorUrl) {\r\n\t\t\tthis._url = errorUrl;\r\n\t\t\tthis._image.src = errorUrl;\r\n\t\t}\r\n\t},\r\n\r\n\t// @method getCenter(): LatLng\r\n\t// Returns the center of the ImageOverlay.\r\n\tgetCenter: function () {\r\n\t\treturn this._bounds.getCenter();\r\n\t}\r\n});\r\n\r\n// @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options)\r\n// Instantiates an image overlay object given the URL of the image and the\r\n// geographical bounds it is tied to.\r\nexport var imageOverlay = function (url, bounds, options) {\r\n\treturn new ImageOverlay(url, bounds, options);\r\n};\r\n", "import {ImageOverlay} from './ImageOverlay';\r\nimport * as DomUtil from '../dom/DomUtil';\r\nimport * as Util from '../core/Util';\r\n\r\n/*\r\n * @class VideoOverlay\r\n * @aka L.VideoOverlay\r\n * @inherits ImageOverlay\r\n *\r\n * Used to load and display a video player over specific bounds of the map. Extends `ImageOverlay`.\r\n *\r\n * A video overlay uses the [`<video>`](https://developer.mozilla.org/docs/Web/HTML/Element/video)\r\n * HTML5 element.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var videoUrl = 'https://www.mapbox.com/bites/00188/patricia_nasa.webm',\r\n * \tvideoBounds = [[ 32, -130], [ 13, -100]];\r\n * L.videoOverlay(videoUrl, videoBounds ).addTo(map);\r\n * ```\r\n */\r\n\r\nexport var VideoOverlay = ImageOverlay.extend({\r\n\r\n\t// @section\r\n\t// @aka VideoOverlay options\r\n\toptions: {\r\n\t\t// @option autoplay: Boolean = true\r\n\t\t// Whether the video starts playing automatically when loaded.\r\n\t\t// On some browsers autoplay will only work with `muted: true`\r\n\t\tautoplay: true,\r\n\r\n\t\t// @option loop: Boolean = true\r\n\t\t// Whether the video will loop back to the beginning when played.\r\n\t\tloop: true,\r\n\r\n\t\t// @option keepAspectRatio: Boolean = true\r\n\t\t// Whether the video will save aspect ratio after the projection.\r\n\t\t// Relevant for supported browsers. See [browser compatibility](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit)\r\n\t\tkeepAspectRatio: true,\r\n\r\n\t\t// @option muted: Boolean = false\r\n\t\t// Whether the video starts on mute when loaded.\r\n\t\tmuted: false,\r\n\r\n\t\t// @option playsInline: Boolean = true\r\n\t\t// Mobile browsers will play the video right where it is instead of open it up in fullscreen mode.\r\n\t\tplaysInline: true\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tvar wasElementSupplied = this._url.tagName === 'VIDEO';\r\n\t\tvar vid = this._image = wasElementSupplied ? this._url : DomUtil.create('video');\r\n\r\n\t\tDomUtil.addClass(vid, 'leaflet-image-layer');\r\n\t\tif (this._zoomAnimated) { DomUtil.addClass(vid, 'leaflet-zoom-animated'); }\r\n\t\tif (this.options.className) { DomUtil.addClass(vid, this.options.className); }\r\n\r\n\t\tvid.onselectstart = Util.falseFn;\r\n\t\tvid.onmousemove = Util.falseFn;\r\n\r\n\t\t// @event load: Event\r\n\t\t// Fired when the video has finished loading the first frame\r\n\t\tvid.onloadeddata = Util.bind(this.fire, this, 'load');\r\n\r\n\t\tif (wasElementSupplied) {\r\n\t\t\tvar sourceElements = vid.getElementsByTagName('source');\r\n\t\t\tvar sources = [];\r\n\t\t\tfor (var j = 0; j < sourceElements.length; j++) {\r\n\t\t\t\tsources.push(sourceElements[j].src);\r\n\t\t\t}\r\n\r\n\t\t\tthis._url = (sourceElements.length > 0) ? sources : [vid.src];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!Util.isArray(this._url)) { this._url = [this._url]; }\r\n\r\n\t\tif (!this.options.keepAspectRatio && Object.prototype.hasOwnProperty.call(vid.style, 'objectFit')) {\r\n\t\t\tvid.style['objectFit'] = 'fill';\r\n\t\t}\r\n\t\tvid.autoplay = !!this.options.autoplay;\r\n\t\tvid.loop = !!this.options.loop;\r\n\t\tvid.muted = !!this.options.muted;\r\n\t\tvid.playsInline = !!this.options.playsInline;\r\n\t\tfor (var i = 0; i < this._url.length; i++) {\r\n\t\t\tvar source = DomUtil.create('source');\r\n\t\t\tsource.src = this._url[i];\r\n\t\t\tvid.appendChild(source);\r\n\t\t}\r\n\t}\r\n\r\n\t// @method getElement(): HTMLVideoElement\r\n\t// Returns the instance of [`HTMLVideoElement`](https://developer.mozilla.org/docs/Web/API/HTMLVideoElement)\r\n\t// used by this overlay.\r\n});\r\n\r\n\r\n// @factory L.videoOverlay(video: String|Array|HTMLVideoElement, bounds: LatLngBounds, options?: VideoOverlay options)\r\n// Instantiates an image overlay object given the URL of the video (or array of URLs, or even a video element) and the\r\n// geographical bounds it is tied to.\r\n\r\nexport function videoOverlay(video, bounds, options) {\r\n\treturn new VideoOverlay(video, bounds, options);\r\n}\r\n", "import {ImageOverlay} from './ImageOverlay';\nimport * as DomUtil from '../dom/DomUtil';\nimport * as Util from '../core/Util';\n\n/*\n * @class SVGOverlay\n * @aka L.SVGOverlay\n * @inherits ImageOverlay\n *\n * Used to load, display and provide DOM access to an SVG file over specific bounds of the map. Extends `ImageOverlay`.\n *\n * An SVG overlay uses the [`<svg>`](https://developer.mozilla.org/docs/Web/SVG/Element/svg) element.\n *\n * @example\n *\n * ```js\n * var svgElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n * svgElement.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n * svgElement.setAttribute('viewBox', \"0 0 200 200\");\n * svgElement.innerHTML = '<rect width=\"200\" height=\"200\"/><rect x=\"75\" y=\"23\" width=\"50\" height=\"50\" style=\"fill:red\"/><rect x=\"75\" y=\"123\" width=\"50\" height=\"50\" style=\"fill:#0013ff\"/>';\n * var svgElementBounds = [ [ 32, -130 ], [ 13, -100 ] ];\n * L.svgOverlay(svgElement, svgElementBounds).addTo(map);\n * ```\n */\n\nexport var SVGOverlay = ImageOverlay.extend({\n\t_initImage: function () {\n\t\tvar el = this._image = this._url;\n\n\t\tDomUtil.addClass(el, 'leaflet-image-layer');\n\t\tif (this._zoomAnimated) { DomUtil.addClass(el, 'leaflet-zoom-animated'); }\n\t\tif (this.options.className) { DomUtil.addClass(el, this.options.className); }\n\n\t\tel.onselectstart = Util.falseFn;\n\t\tel.onmousemove = Util.falseFn;\n\t}\n\n\t// @method getElement(): SVGElement\n\t// Returns the instance of [`SVGElement`](https://developer.mozilla.org/docs/Web/API/SVGElement)\n\t// used by this overlay.\n});\n\n\n// @factory L.svgOverlay(svg: String|SVGElement, bounds: LatLngBounds, options?: SVGOverlay options)\n// Instantiates an image overlay object given an SVG element and the geographical bounds it is tied to.\n// A viewBox attribute is required on the SVG element to zoom in and out properly.\n\nexport function svgOverlay(el, bounds, options) {\n\treturn new SVGOverlay(el, bounds, options);\n}\n", "import {Map} from '../map/Map';\r\nimport {Layer} from './Layer';\r\nimport {FeatureGroup} from './FeatureGroup';\r\nimport * as Util from '../core/Util';\r\nimport {toLatLng, LatLng} from '../geo/LatLng';\r\nimport {toPoint} from '../geometry/Point';\r\nimport * as DomUtil from '../dom/DomUtil';\r\n\r\n/*\r\n * @class DivOverlay\r\n * @inherits Interactive layer\r\n * @aka L.DivOverlay\r\n * Base model for L.Popup and L.Tooltip. Inherit from it for custom overlays like plugins.\r\n */\r\n\r\n// @namespace DivOverlay\r\nexport var DivOverlay = Layer.extend({\r\n\r\n\t// @section\r\n\t// @aka DivOverlay options\r\n\toptions: {\r\n\t\t// @option interactive: Boolean = false\r\n\t\t// If true, the popup/tooltip will listen to the mouse events.\r\n\t\tinteractive: false,\r\n\r\n\t\t// @option offset: Point = Point(0, 0)\r\n\t\t// The offset of the overlay position.\r\n\t\toffset: [0, 0],\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom CSS class name to assign to the overlay.\r\n\t\tclassName: '',\r\n\r\n\t\t// @option pane: String = undefined\r\n\t\t// `Map pane` where the overlay will be added.\r\n\t\tpane: undefined,\r\n\r\n\t\t// @option content: String|HTMLElement|Function = ''\r\n\t\t// Sets the HTML content of the overlay while initializing. If a function is passed the source layer will be\r\n\t\t// passed to the function. The function should return a `String` or `HTMLElement` to be used in the overlay.\r\n\t\tcontent: ''\r\n\t},\r\n\r\n\tinitialize: function (options, source) {\r\n\t\tif (options && (options instanceof LatLng || Util.isArray(options))) {\r\n\t\t\tthis._latlng = toLatLng(options);\r\n\t\t\tUtil.setOptions(this, source);\r\n\t\t} else {\r\n\t\t\tUtil.setOptions(this, options);\r\n\t\t\tthis._source = source;\r\n\t\t}\r\n\t\tif (this.options.content) {\r\n\t\t\tthis._content = this.options.content;\r\n\t\t}\r\n\t},\r\n\r\n\t// @method openOn(map: Map): this\r\n\t// Adds the overlay to the map.\r\n\t// Alternative to `map.openPopup(popup)`/`.openTooltip(tooltip)`.\r\n\topenOn: function (map) {\r\n\t\tmap = arguments.length ? map : this._source._map; // experimental, not the part of public api\r\n\t\tif (!map.hasLayer(this)) {\r\n\t\t\tmap.addLayer(this);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method close(): this\r\n\t// Closes the overlay.\r\n\t// Alternative to `map.closePopup(popup)`/`.closeTooltip(tooltip)`\r\n\t// and `layer.closePopup()`/`.closeTooltip()`.\r\n\tclose: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.removeLayer(this);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method toggle(layer?: Layer): this\r\n\t// Opens or closes the overlay bound to layer depending on its current state.\r\n\t// Argument may be omitted only for overlay bound to layer.\r\n\t// Alternative to `layer.togglePopup()`/`.toggleTooltip()`.\r\n\ttoggle: function (layer) {\r\n\t\tif (this._map) {\r\n\t\t\tthis.close();\r\n\t\t} else {\r\n\t\t\tif (arguments.length) {\r\n\t\t\t\tthis._source = layer;\r\n\t\t\t} else {\r\n\t\t\t\tlayer = this._source;\r\n\t\t\t}\r\n\t\t\tthis._prepareOpen();\r\n\r\n\t\t\t// open the overlay on the map\r\n\t\t\tthis.openOn(layer._map);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._zoomAnimated = map._zoomAnimated;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initLayout();\r\n\t\t}\r\n\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tDomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\r\n\t\tclearTimeout(this._removeTimeout);\r\n\t\tthis.getPane().appendChild(this._container);\r\n\t\tthis.update();\r\n\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tDomUtil.setOpacity(this._container, 1);\r\n\t\t}\r\n\r\n\t\tthis.bringToFront();\r\n\r\n\t\tif (this.options.interactive) {\r\n\t\t\tDomUtil.addClass(this._container, 'leaflet-interactive');\r\n\t\t\tthis.addInteractiveTarget(this._container);\r\n\t\t}\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (map._fadeAnimated) {\r\n\t\t\tDomUtil.setOpacity(this._container, 0);\r\n\t\t\tthis._removeTimeout = setTimeout(Util.bind(DomUtil.remove, undefined, this._container), 200);\r\n\t\t} else {\r\n\t\t\tDomUtil.remove(this._container);\r\n\t\t}\r\n\r\n\t\tif (this.options.interactive) {\r\n\t\t\tDomUtil.removeClass(this._container, 'leaflet-interactive');\r\n\t\t\tthis.removeInteractiveTarget(this._container);\r\n\t\t}\r\n\t},\r\n\r\n\t// @namespace DivOverlay\r\n\t// @method getLatLng: LatLng\r\n\t// Returns the geographical point of the overlay.\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\t// @method setLatLng(latlng: LatLng): this\r\n\t// Sets the geographical point where the overlay will open.\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = toLatLng(latlng);\r\n\t\tif (this._map) {\r\n\t\t\tthis._updatePosition();\r\n\t\t\tthis._adjustPan();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getContent: String|HTMLElement\r\n\t// Returns the content of the overlay.\r\n\tgetContent: function () {\r\n\t\treturn this._content;\r\n\t},\r\n\r\n\t// @method setContent(htmlContent: String|HTMLElement|Function): this\r\n\t// Sets the HTML content of the overlay. If a function is passed the source layer will be passed to the function.\r\n\t// The function should return a `String` or `HTMLElement` to be used in the overlay.\r\n\tsetContent: function (content) {\r\n\t\tthis._content = content;\r\n\t\tthis.update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getElement: String|HTMLElement\r\n\t// Returns the HTML container of the overlay.\r\n\tgetElement: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\t// @method update: null\r\n\t// Updates the overlay content, layout and position. Useful for updating the overlay after something inside changed, e.g. image loaded.\r\n\tupdate: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._container.style.visibility = 'hidden';\r\n\r\n\t\tthis._updateContent();\r\n\t\tthis._updateLayout();\r\n\t\tthis._updatePosition();\r\n\r\n\t\tthis._container.style.visibility = '';\r\n\r\n\t\tthis._adjustPan();\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tzoom: this._updatePosition,\r\n\t\t\tviewreset: this._updatePosition\r\n\t\t};\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tevents.zoomanim = this._animateZoom;\r\n\t\t}\r\n\t\treturn events;\r\n\t},\r\n\r\n\t// @method isOpen: Boolean\r\n\t// Returns `true` when the overlay is visible on the map.\r\n\tisOpen: function () {\r\n\t\treturn !!this._map && this._map.hasLayer(this);\r\n\t},\r\n\r\n\t// @method bringToFront: this\r\n\t// Brings this overlay in front of other overlays (in the same map pane).\r\n\tbringToFront: function () {\r\n\t\tif (this._map) {\r\n\t\t\tDomUtil.toFront(this._container);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method bringToBack: this\r\n\t// Brings this overlay to the back of other overlays (in the same map pane).\r\n\tbringToBack: function () {\r\n\t\tif (this._map) {\r\n\t\t\tDomUtil.toBack(this._container);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// prepare bound overlay to open: update latlng pos / content source (for FeatureGroup)\r\n\t_prepareOpen: function (latlng) {\r\n\t\tvar source = this._source;\r\n\t\tif (!source._map) { return false; }\r\n\r\n\t\tif (source instanceof FeatureGroup) {\r\n\t\t\tsource = null;\r\n\t\t\tvar layers = this._source._layers;\r\n\t\t\tfor (var id in layers) {\r\n\t\t\t\tif (layers[id]._map) {\r\n\t\t\t\t\tsource = layers[id];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!source) { return false; } // Unable to get source layer.\r\n\r\n\t\t\t// set overlay source to this layer\r\n\t\t\tthis._source = source;\r\n\t\t}\r\n\r\n\t\tif (!latlng) {\r\n\t\t\tif (source.getCenter) {\r\n\t\t\t\tlatlng = source.getCenter();\r\n\t\t\t} else if (source.getLatLng) {\r\n\t\t\t\tlatlng = source.getLatLng();\r\n\t\t\t} else if (source.getBounds) {\r\n\t\t\t\tlatlng = source.getBounds().getCenter();\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error('Unable to get source layer LatLng.');\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.setLatLng(latlng);\r\n\r\n\t\tif (this._map) {\r\n\t\t\t// update the overlay (content, layout, etc...)\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_updateContent: function () {\r\n\t\tif (!this._content) { return; }\r\n\r\n\t\tvar node = this._contentNode;\r\n\t\tvar content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content;\r\n\r\n\t\tif (typeof content === 'string') {\r\n\t\t\tnode.innerHTML = content;\r\n\t\t} else {\r\n\t\t\twhile (node.hasChildNodes()) {\r\n\t\t\t\tnode.removeChild(node.firstChild);\r\n\t\t\t}\r\n\t\t\tnode.appendChild(content);\r\n\t\t}\r\n\r\n\t\t// @namespace DivOverlay\r\n\t\t// @section DivOverlay events\r\n\t\t// @event contentupdate: Event\r\n\t\t// Fired when the content of the overlay is updated\r\n\t\tthis.fire('contentupdate');\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng),\r\n\t\t    offset = toPoint(this.options.offset),\r\n\t\t    anchor = this._getAnchor();\r\n\r\n\t\tif (this._zoomAnimated) {\r\n\t\t\tDomUtil.setPosition(this._container, pos.add(anchor));\r\n\t\t} else {\r\n\t\t\toffset = offset.add(pos).add(anchor);\r\n\t\t}\r\n\r\n\t\tvar bottom = this._containerBottom = -offset.y,\r\n\t\t    left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x;\r\n\r\n\t\t// bottom position the overlay in case the height of the overlay changes (images loading etc)\r\n\t\tthis._container.style.bottom = bottom + 'px';\r\n\t\tthis._container.style.left = left + 'px';\r\n\t},\r\n\r\n\t_getAnchor: function () {\r\n\t\treturn [0, 0];\r\n\t}\r\n\r\n});\r\n\r\nMap.include({\r\n\t_initOverlay: function (OverlayClass, content, latlng, options) {\r\n\t\tvar overlay = content;\r\n\t\tif (!(overlay instanceof OverlayClass)) {\r\n\t\t\toverlay = new OverlayClass(options).setContent(content);\r\n\t\t}\r\n\t\tif (latlng) {\r\n\t\t\toverlay.setLatLng(latlng);\r\n\t\t}\r\n\t\treturn overlay;\r\n\t}\r\n});\r\n\r\n\r\nLayer.include({\r\n\t_initOverlay: function (OverlayClass, old, content, options) {\r\n\t\tvar overlay = content;\r\n\t\tif (overlay instanceof OverlayClass) {\r\n\t\t\tUtil.setOptions(overlay, options);\r\n\t\t\toverlay._source = this;\r\n\t\t} else {\r\n\t\t\toverlay = (old && !options) ? old : new OverlayClass(options, this);\r\n\t\t\toverlay.setContent(content);\r\n\t\t}\r\n\t\treturn overlay;\r\n\t}\r\n});\r\n", "import {DivOverlay} from './DivOverlay';\r\nimport * as DomEvent from '../dom/DomEvent';\r\nimport * as DomUtil from '../dom/DomUtil';\r\nimport {Point, toPoint} from '../geometry/Point';\r\nimport {Map} from '../map/Map';\r\nimport {Layer} from './Layer';\r\nimport {Path} from './vector/Path';\r\nimport {FeatureGroup} from './FeatureGroup';\r\n\r\n/*\r\n * @class Popup\r\n * @inherits DivOverlay\r\n * @aka L.Popup\r\n * Used to open popups in certain places of the map. Use [Map.openPopup](#map-openpopup) to\r\n * open popups while making sure that only one popup is open at one time\r\n * (recommended for usability), or use [Map.addLayer](#map-addlayer) to open as many as you want.\r\n *\r\n * @example\r\n *\r\n * If you want to just bind a popup to marker click and then open it, it's really easy:\r\n *\r\n * ```js\r\n * marker.bindPopup(popupContent).openPopup();\r\n * ```\r\n * Path overlays like polylines also have a `bindPopup` method.\r\n *\r\n * A popup can be also standalone:\r\n *\r\n * ```js\r\n * var popup = L.popup()\r\n * \t.setLatLng(latlng)\r\n * \t.setContent('<p>Hello world!<br />This is a nice popup.</p>')\r\n * \t.openOn(map);\r\n * ```\r\n * or\r\n * ```js\r\n * var popup = L.popup(latlng, {content: '<p>Hello world!<br />This is a nice popup.</p>')\r\n * \t.openOn(map);\r\n * ```\r\n */\r\n\r\n\r\n// @namespace Popup\r\nexport var Popup = DivOverlay.extend({\r\n\r\n\t// @section\r\n\t// @aka Popup options\r\n\toptions: {\r\n\t\t// @option pane: String = 'popupPane'\r\n\t\t// `Map pane` where the popup will be added.\r\n\t\tpane: 'popupPane',\r\n\r\n\t\t// @option offset: Point = Point(0, 7)\r\n\t\t// The offset of the popup position.\r\n\t\toffset: [0, 7],\r\n\r\n\t\t// @option maxWidth: Number = 300\r\n\t\t// Max width of the popup, in pixels.\r\n\t\tmaxWidth: 300,\r\n\r\n\t\t// @option minWidth: Number = 50\r\n\t\t// Min width of the popup, in pixels.\r\n\t\tminWidth: 50,\r\n\r\n\t\t// @option maxHeight: Number = null\r\n\t\t// If set, creates a scrollable container of the given height\r\n\t\t// inside a popup if its content exceeds it.\r\n\t\t// The scrollable container can be styled using the\r\n\t\t// `leaflet-popup-scrolled` CSS class selector.\r\n\t\tmaxHeight: null,\r\n\r\n\t\t// @option autoPan: Boolean = true\r\n\t\t// Set it to `false` if you don't want the map to do panning animation\r\n\t\t// to fit the opened popup.\r\n\t\tautoPan: true,\r\n\r\n\t\t// @option autoPanPaddingTopLeft: Point = null\r\n\t\t// The margin between the popup and the top left corner of the map\r\n\t\t// view after autopanning was performed.\r\n\t\tautoPanPaddingTopLeft: null,\r\n\r\n\t\t// @option autoPanPaddingBottomRight: Point = null\r\n\t\t// The margin between the popup and the bottom right corner of the map\r\n\t\t// view after autopanning was performed.\r\n\t\tautoPanPaddingBottomRight: null,\r\n\r\n\t\t// @option autoPanPadding: Point = Point(5, 5)\r\n\t\t// Equivalent of setting both top left and bottom right autopan padding to the same value.\r\n\t\tautoPanPadding: [5, 5],\r\n\r\n\t\t// @option keepInView: Boolean = false\r\n\t\t// Set it to `true` if you want to prevent users from panning the popup\r\n\t\t// off of the screen while it is open.\r\n\t\tkeepInView: false,\r\n\r\n\t\t// @option closeButton: Boolean = true\r\n\t\t// Controls the presence of a close button in the popup.\r\n\t\tcloseButton: true,\r\n\r\n\t\t// @option autoClose: Boolean = true\r\n\t\t// Set it to `false` if you want to override the default behavior of\r\n\t\t// the popup closing when another popup is opened.\r\n\t\tautoClose: true,\r\n\r\n\t\t// @option closeOnEscapeKey: Boolean = true\r\n\t\t// Set it to `false` if you want to override the default behavior of\r\n\t\t// the ESC key for closing of the popup.\r\n\t\tcloseOnEscapeKey: true,\r\n\r\n\t\t// @option closeOnClick: Boolean = *\r\n\t\t// Set it if you want to override the default behavior of the popup closing when user clicks\r\n\t\t// on the map. Defaults to the map's [`closePopupOnClick`](#map-closepopuponclick) option.\r\n\r\n\t\t// @option className: String = ''\r\n\t\t// A custom CSS class name to assign to the popup.\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\t// @namespace Popup\r\n\t// @method openOn(map: Map): this\r\n\t// Alternative to `map.openPopup(popup)`.\r\n\t// Adds the popup to the map and closes the previous one.\r\n\topenOn: function (map) {\r\n\t\tmap = arguments.length ? map : this._source._map; // experimental, not the part of public api\r\n\r\n\t\tif (!map.hasLayer(this) && map._popup && map._popup.options.autoClose) {\r\n\t\t\tmap.removeLayer(map._popup);\r\n\t\t}\r\n\t\tmap._popup = this;\r\n\r\n\t\treturn DivOverlay.prototype.openOn.call(this, map);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tDivOverlay.prototype.onAdd.call(this, map);\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event popupopen: PopupEvent\r\n\t\t// Fired when a popup is opened in the map\r\n\t\tmap.fire('popupopen', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\t// @namespace Layer\r\n\t\t\t// @section Popup events\r\n\t\t\t// @event popupopen: PopupEvent\r\n\t\t\t// Fired when a popup bound to this layer is opened\r\n\t\t\tthis._source.fire('popupopen', {popup: this}, true);\r\n\t\t\t// For non-path layers, we toggle the popup when clicking\r\n\t\t\t// again the layer, so prevent the map to reopen it.\r\n\t\t\tif (!(this._source instanceof Path)) {\r\n\t\t\t\tthis._source.on('preclick', DomEvent.stopPropagation);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tDivOverlay.prototype.onRemove.call(this, map);\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event popupclose: PopupEvent\r\n\t\t// Fired when a popup in the map is closed\r\n\t\tmap.fire('popupclose', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\t// @namespace Layer\r\n\t\t\t// @section Popup events\r\n\t\t\t// @event popupclose: PopupEvent\r\n\t\t\t// Fired when a popup bound to this layer is closed\r\n\t\t\tthis._source.fire('popupclose', {popup: this}, true);\r\n\t\t\tif (!(this._source instanceof Path)) {\r\n\t\t\t\tthis._source.off('preclick', DomEvent.stopPropagation);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tgetEvents: function () {\r\n\t\tvar events = DivOverlay.prototype.getEvents.call(this);\r\n\r\n\t\tif (this.options.closeOnClick !== undefined ? this.options.closeOnClick : this._map.options.closePopupOnClick) {\r\n\t\t\tevents.preclick = this.close;\r\n\t\t}\r\n\r\n\t\tif (this.options.keepInView) {\r\n\t\t\tevents.moveend = this._adjustPan;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar prefix = 'leaflet-popup',\r\n\t\t    container = this._container = DomUtil.create('div',\r\n\t\t\tprefix + ' ' + (this.options.className || '') +\r\n\t\t\t' leaflet-zoom-animated');\r\n\r\n\t\tvar wrapper = this._wrapper = DomUtil.create('div', prefix + '-content-wrapper', container);\r\n\t\tthis._contentNode = DomUtil.create('div', prefix + '-content', wrapper);\r\n\r\n\t\tDomEvent.disableClickPropagation(container);\r\n\t\tDomEvent.disableScrollPropagation(this._contentNode);\r\n\t\tDomEvent.on(container, 'contextmenu', DomEvent.stopPropagation);\r\n\r\n\t\tthis._tipContainer = DomUtil.create('div', prefix + '-tip-container', container);\r\n\t\tthis._tip = DomUtil.create('div', prefix + '-tip', this._tipContainer);\r\n\r\n\t\tif (this.options.closeButton) {\r\n\t\t\tvar closeButton = this._closeButton = DomUtil.create('a', prefix + '-close-button', container);\r\n\t\t\tcloseButton.setAttribute('role', 'button'); // overrides the implicit role=link of <a> elements #7399\r\n\t\t\tcloseButton.setAttribute('aria-label', 'Close popup');\r\n\t\t\tcloseButton.href = '#close';\r\n\t\t\tcloseButton.innerHTML = '<span aria-hidden=\"true\">&#215;</span>';\r\n\r\n\t\t\tDomEvent.on(closeButton, 'click', function (ev) {\r\n\t\t\t\tDomEvent.preventDefault(ev);\r\n\t\t\t\tthis.close();\r\n\t\t\t}, this);\r\n\t\t}\r\n\t},\r\n\r\n\t_updateLayout: function () {\r\n\t\tvar container = this._contentNode,\r\n\t\t    style = container.style;\r\n\r\n\t\tstyle.width = '';\r\n\t\tstyle.whiteSpace = 'nowrap';\r\n\r\n\t\tvar width = container.offsetWidth;\r\n\t\twidth = Math.min(width, this.options.maxWidth);\r\n\t\twidth = Math.max(width, this.options.minWidth);\r\n\r\n\t\tstyle.width = (width + 1) + 'px';\r\n\t\tstyle.whiteSpace = '';\r\n\r\n\t\tstyle.height = '';\r\n\r\n\t\tvar height = container.offsetHeight,\r\n\t\t    maxHeight = this.options.maxHeight,\r\n\t\t    scrolledClass = 'leaflet-popup-scrolled';\r\n\r\n\t\tif (maxHeight && height > maxHeight) {\r\n\t\t\tstyle.height = maxHeight + 'px';\r\n\t\t\tDomUtil.addClass(container, scrolledClass);\r\n\t\t} else {\r\n\t\t\tDomUtil.removeClass(container, scrolledClass);\r\n\t\t}\r\n\r\n\t\tthis._containerWidth = this._container.offsetWidth;\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center),\r\n\t\t    anchor = this._getAnchor();\r\n\t\tDomUtil.setPosition(this._container, pos.add(anchor));\r\n\t},\r\n\r\n\t_adjustPan: function () {\r\n\t\tif (!this.options.autoPan) { return; }\r\n\t\tif (this._map._panAnim) { this._map._panAnim.stop(); }\r\n\r\n\t\t// We can endlessly recurse if keepInView is set and the view resets.\r\n\t\t// Let's guard against that by exiting early if we're responding to our own autopan.\r\n\t\tif (this._autopanning) {\r\n\t\t\tthis._autopanning = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar map = this._map,\r\n\t\t    marginBottom = parseInt(DomUtil.getStyle(this._container, 'marginBottom'), 10) || 0,\r\n\t\t    containerHeight = this._container.offsetHeight + marginBottom,\r\n\t\t    containerWidth = this._containerWidth,\r\n\t\t    layerPos = new Point(this._containerLeft, -containerHeight - this._containerBottom);\r\n\r\n\t\tlayerPos._add(DomUtil.getPosition(this._container));\r\n\r\n\t\tvar containerPos = map.layerPointToContainerPoint(layerPos),\r\n\t\t    padding = toPoint(this.options.autoPanPadding),\r\n\t\t    paddingTL = toPoint(this.options.autoPanPaddingTopLeft || padding),\r\n\t\t    paddingBR = toPoint(this.options.autoPanPaddingBottomRight || padding),\r\n\t\t    size = map.getSize(),\r\n\t\t    dx = 0,\r\n\t\t    dy = 0;\r\n\r\n\t\tif (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\r\n\t\t\tdx = containerPos.x + containerWidth - size.x + paddingBR.x;\r\n\t\t}\r\n\t\tif (containerPos.x - dx - paddingTL.x < 0) { // left\r\n\t\t\tdx = containerPos.x - paddingTL.x;\r\n\t\t}\r\n\t\tif (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\r\n\t\t\tdy = containerPos.y + containerHeight - size.y + paddingBR.y;\r\n\t\t}\r\n\t\tif (containerPos.y - dy - paddingTL.y < 0) { // top\r\n\t\t\tdy = containerPos.y - paddingTL.y;\r\n\t\t}\r\n\r\n\t\t// @namespace Map\r\n\t\t// @section Popup events\r\n\t\t// @event autopanstart: Event\r\n\t\t// Fired when the map starts autopanning when opening a popup.\r\n\t\tif (dx || dy) {\r\n\t\t\t// Track that we're autopanning, as this function will be re-ran on moveend\r\n\t\t\tif (this.options.keepInView) {\r\n\t\t\t\tthis._autopanning = true;\r\n\t\t\t}\r\n\r\n\t\t\tmap\r\n\t\t\t    .fire('autopanstart')\r\n\t\t\t    .panBy([dx, dy]);\r\n\t\t}\r\n\t},\r\n\r\n\t_getAnchor: function () {\r\n\t\t// Where should we anchor the popup on the source layer?\r\n\t\treturn toPoint(this._source && this._source._getPopupAnchor ? this._source._getPopupAnchor() : [0, 0]);\r\n\t}\r\n\r\n});\r\n\r\n// @namespace Popup\r\n// @factory L.popup(options?: Popup options, source?: Layer)\r\n// Instantiates a `Popup` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the popup with a reference to the Layer to which it refers.\r\n// @alternative\r\n// @factory L.popup(latlng: LatLng, options?: Popup options)\r\n// Instantiates a `Popup` object given `latlng` where the popup will open and an optional `options` object that describes its appearance and location.\r\nexport var popup = function (options, source) {\r\n\treturn new Popup(options, source);\r\n};\r\n\r\n\r\n/* @namespace Map\r\n * @section Interaction Options\r\n * @option closePopupOnClick: Boolean = true\r\n * Set it to `false` if you don't want popups to close when user clicks the map.\r\n */\r\nMap.mergeOptions({\r\n\tclosePopupOnClick: true\r\n});\r\n\r\n\r\n// @namespace Map\r\n// @section Methods for Layers and Controls\r\nMap.include({\r\n\t// @method openPopup(popup: Popup): this\r\n\t// Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).\r\n\t// @alternative\r\n\t// @method openPopup(content: String|HTMLElement, latlng: LatLng, options?: Popup options): this\r\n\t// Creates a popup with the specified content and options and opens it in the given point on a map.\r\n\topenPopup: function (popup, latlng, options) {\r\n\t\tthis._initOverlay(Popup, popup, latlng, options)\r\n\t\t  .openOn(this);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method closePopup(popup?: Popup): this\r\n\t// Closes the popup previously opened with [openPopup](#map-openpopup) (or the given one).\r\n\tclosePopup: function (popup) {\r\n\t\tpopup = arguments.length ? popup : this._popup;\r\n\t\tif (popup) {\r\n\t\t\tpopup.close();\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\n/*\r\n * @namespace Layer\r\n * @section Popup methods example\r\n *\r\n * All layers share a set of methods convenient for binding popups to it.\r\n *\r\n * ```js\r\n * var layer = L.Polygon(latlngs).bindPopup('Hi There!').addTo(map);\r\n * layer.openPopup();\r\n * layer.closePopup();\r\n * ```\r\n *\r\n * Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened.\r\n */\r\n\r\n// @section Popup methods\r\nLayer.include({\r\n\r\n\t// @method bindPopup(content: String|HTMLElement|Function|Popup, options?: Popup options): this\r\n\t// Binds a popup to the layer with the passed `content` and sets up the\r\n\t// necessary event listeners. If a `Function` is passed it will receive\r\n\t// the layer as the first argument and should return a `String` or `HTMLElement`.\r\n\tbindPopup: function (content, options) {\r\n\t\tthis._popup = this._initOverlay(Popup, this._popup, content, options);\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis.on({\r\n\t\t\t\tclick: this._openPopup,\r\n\t\t\t\tkeypress: this._onKeyPress,\r\n\t\t\t\tremove: this.closePopup,\r\n\t\t\t\tmove: this._movePopup\r\n\t\t\t});\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method unbindPopup(): this\r\n\t// Removes the popup previously bound with `bindPopup`.\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis.off({\r\n\t\t\t\tclick: this._openPopup,\r\n\t\t\t\tkeypress: this._onKeyPress,\r\n\t\t\t\tremove: this.closePopup,\r\n\t\t\t\tmove: this._movePopup\r\n\t\t\t});\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method openPopup(latlng?: LatLng): this\r\n\t// Opens the bound popup at the specified `latlng` or at the default popup anchor if no `latlng` is passed.\r\n\topenPopup: function (latlng) {\r\n\t\tif (this._popup) {\r\n\t\t\tif (!(this instanceof FeatureGroup)) {\r\n\t\t\t\tthis._popup._source = this;\r\n\t\t\t}\r\n\t\t\tif (this._popup._prepareOpen(latlng || this._latlng)) {\r\n\t\t\t\t// open the popup on the map\r\n\t\t\t\tthis._popup.openOn(this._map);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method closePopup(): this\r\n\t// Closes the popup bound to this layer if it is open.\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method togglePopup(): this\r\n\t// Opens or closes the popup bound to this layer depending on its current state.\r\n\ttogglePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.toggle(this);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method isPopupOpen(): boolean\r\n\t// Returns `true` if the popup bound to this layer is currently open.\r\n\tisPopupOpen: function () {\r\n\t\treturn (this._popup ? this._popup.isOpen() : false);\r\n\t},\r\n\r\n\t// @method setPopupContent(content: String|HTMLElement|Popup): this\r\n\t// Sets the content of the popup bound to this layer.\r\n\tsetPopupContent: function (content) {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method getPopup(): Popup\r\n\t// Returns the popup bound to this layer.\r\n\tgetPopup: function () {\r\n\t\treturn this._popup;\r\n\t},\r\n\r\n\t_openPopup: function (e) {\r\n\t\tif (!this._popup || !this._map) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// prevent map click\r\n\t\tDomEvent.stop(e);\r\n\r\n\t\tvar target = e.layer || e.target;\r\n\t\tif (this._popup._source === target && !(target instanceof Path)) {\r\n\t\t\t// treat it like a marker and figure out\r\n\t\t\t// if we should toggle it open/closed\r\n\t\t\tif (this._map.hasLayer(this._popup)) {\r\n\t\t\t\tthis.closePopup();\r\n\t\t\t} else {\r\n\t\t\t\tthis.openPopup(e.latlng);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._popup._source = target;\r\n\t\tthis.openPopup(e.latlng);\r\n\t},\r\n\r\n\t_movePopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t},\r\n\r\n\t_onKeyPress: function (e) {\r\n\t\tif (e.originalEvent.keyCode === 13) {\r\n\t\t\tthis._openPopup(e);\r\n\t\t}\r\n\t}\r\n});\r\n", "import {DivOverlay} from './DivOverlay';\nimport {toPoint} from '../geometry/Point';\nimport {Map} from '../map/Map';\nimport {Layer} from './Layer';\nimport * as DomUtil from '../dom/DomUtil';\nimport * as DomEvent from '../dom/DomEvent';\nimport * as Util from '../core/Util';\nimport {FeatureGroup} from './FeatureGroup';\n\n/*\n * @class Tooltip\n * @inherits DivOverlay\n * @aka L.Tooltip\n * Used to display small texts on top of map layers.\n *\n * @example\n * If you want to just bind a tooltip to marker:\n *\n * ```js\n * marker.bindTooltip(\"my tooltip text\").openTooltip();\n * ```\n * Path overlays like polylines also have a `bindTooltip` method.\n *\n * A tooltip can be also standalone:\n *\n * ```js\n * var tooltip = L.tooltip()\n * \t.setLatLng(latlng)\n * \t.setContent('Hello world!<br />This is a nice tooltip.')\n * \t.addTo(map);\n * ```\n * or\n * ```js\n * var tooltip = L.tooltip(latlng, {content: 'Hello world!<br />This is a nice tooltip.'})\n * \t.addTo(map);\n * ```\n *\n *\n * Note about tooltip offset. Leaflet takes two options in consideration\n * for computing tooltip offsetting:\n * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip.\n *   Add a positive x offset to move the tooltip to the right, and a positive y offset to\n *   move it to the bottom. Negatives will move to the left and top.\n * - the `tooltipAnchor` Icon option: this will only be considered for Marker. You\n *   should adapt this value if you use a custom icon.\n */\n\n\n// @namespace Tooltip\nexport var Tooltip = DivOverlay.extend({\n\n\t// @section\n\t// @aka Tooltip options\n\toptions: {\n\t\t// @option pane: String = 'tooltipPane'\n\t\t// `Map pane` where the tooltip will be added.\n\t\tpane: 'tooltipPane',\n\n\t\t// @option offset: Point = Point(0, 0)\n\t\t// Optional offset of the tooltip position.\n\t\toffset: [0, 0],\n\n\t\t// @option direction: String = 'auto'\n\t\t// Direction where to open the tooltip. Possible values are: `right`, `left`,\n\t\t// `top`, `bottom`, `center`, `auto`.\n\t\t// `auto` will dynamically switch between `right` and `left` according to the tooltip\n\t\t// position on the map.\n\t\tdirection: 'auto',\n\n\t\t// @option permanent: Boolean = false\n\t\t// Whether to open the tooltip permanently or only on mouseover.\n\t\tpermanent: false,\n\n\t\t// @option sticky: Boolean = false\n\t\t// If true, the tooltip will follow the mouse instead of being fixed at the feature center.\n\t\tsticky: false,\n\n\t\t// @option opacity: Number = 0.9\n\t\t// Tooltip container opacity.\n\t\topacity: 0.9\n\t},\n\n\tonAdd: function (map) {\n\t\tDivOverlay.prototype.onAdd.call(this, map);\n\t\tthis.setOpacity(this.options.opacity);\n\n\t\t// @namespace Map\n\t\t// @section Tooltip events\n\t\t// @event tooltipopen: TooltipEvent\n\t\t// Fired when a tooltip is opened in the map.\n\t\tmap.fire('tooltipopen', {tooltip: this});\n\n\t\tif (this._source) {\n\t\t\tthis.addEventParent(this._source);\n\n\t\t\t// @namespace Layer\n\t\t\t// @section Tooltip events\n\t\t\t// @event tooltipopen: TooltipEvent\n\t\t\t// Fired when a tooltip bound to this layer is opened.\n\t\t\tthis._source.fire('tooltipopen', {tooltip: this}, true);\n\t\t}\n\t},\n\n\tonRemove: function (map) {\n\t\tDivOverlay.prototype.onRemove.call(this, map);\n\n\t\t// @namespace Map\n\t\t// @section Tooltip events\n\t\t// @event tooltipclose: TooltipEvent\n\t\t// Fired when a tooltip in the map is closed.\n\t\tmap.fire('tooltipclose', {tooltip: this});\n\n\t\tif (this._source) {\n\t\t\tthis.removeEventParent(this._source);\n\n\t\t\t// @namespace Layer\n\t\t\t// @section Tooltip events\n\t\t\t// @event tooltipclose: TooltipEvent\n\t\t\t// Fired when a tooltip bound to this layer is closed.\n\t\t\tthis._source.fire('tooltipclose', {tooltip: this}, true);\n\t\t}\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = DivOverlay.prototype.getEvents.call(this);\n\n\t\tif (!this.options.permanent) {\n\t\t\tevents.preclick = this.close;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t_initLayout: function () {\n\t\tvar prefix = 'leaflet-tooltip',\n\t\t    className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide');\n\n\t\tthis._contentNode = this._container = DomUtil.create('div', className);\n\n\t\tthis._container.setAttribute('role', 'tooltip');\n\t\tthis._container.setAttribute('id', 'leaflet-tooltip-' + Util.stamp(this));\n\t},\n\n\t_updateLayout: function () {},\n\n\t_adjustPan: function () {},\n\n\t_setPosition: function (pos) {\n\t\tvar subX, subY,\n\t\t    map = this._map,\n\t\t    container = this._container,\n\t\t    centerPoint = map.latLngToContainerPoint(map.getCenter()),\n\t\t    tooltipPoint = map.layerPointToContainerPoint(pos),\n\t\t    direction = this.options.direction,\n\t\t    tooltipWidth = container.offsetWidth,\n\t\t    tooltipHeight = container.offsetHeight,\n\t\t    offset = toPoint(this.options.offset),\n\t\t    anchor = this._getAnchor();\n\n\t\tif (direction === 'top') {\n\t\t\tsubX = tooltipWidth / 2;\n\t\t\tsubY = tooltipHeight;\n\t\t} else if (direction === 'bottom') {\n\t\t\tsubX = tooltipWidth / 2;\n\t\t\tsubY = 0;\n\t\t} else if (direction === 'center') {\n\t\t\tsubX = tooltipWidth / 2;\n\t\t\tsubY = tooltipHeight / 2;\n\t\t} else if (direction === 'right') {\n\t\t\tsubX = 0;\n\t\t\tsubY = tooltipHeight / 2;\n\t\t} else if (direction === 'left') {\n\t\t\tsubX = tooltipWidth;\n\t\t\tsubY = tooltipHeight / 2;\n\t\t} else if (tooltipPoint.x < centerPoint.x) {\n\t\t\tdirection = 'right';\n\t\t\tsubX = 0;\n\t\t\tsubY = tooltipHeight / 2;\n\t\t} else {\n\t\t\tdirection = 'left';\n\t\t\tsubX = tooltipWidth + (offset.x + anchor.x) * 2;\n\t\t\tsubY = tooltipHeight / 2;\n\t\t}\n\n\t\tpos = pos.subtract(toPoint(subX, subY, true)).add(offset).add(anchor);\n\n\t\tDomUtil.removeClass(container, 'leaflet-tooltip-right');\n\t\tDomUtil.removeClass(container, 'leaflet-tooltip-left');\n\t\tDomUtil.removeClass(container, 'leaflet-tooltip-top');\n\t\tDomUtil.removeClass(container, 'leaflet-tooltip-bottom');\n\t\tDomUtil.addClass(container, 'leaflet-tooltip-' + direction);\n\t\tDomUtil.setPosition(container, pos);\n\t},\n\n\t_updatePosition: function () {\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng);\n\t\tthis._setPosition(pos);\n\t},\n\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\n\t\tif (this._container) {\n\t\t\tDomUtil.setOpacity(this._container, opacity);\n\t\t}\n\t},\n\n\t_animateZoom: function (e) {\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center);\n\t\tthis._setPosition(pos);\n\t},\n\n\t_getAnchor: function () {\n\t\t// Where should we anchor the tooltip on the source layer?\n\t\treturn toPoint(this._source && this._source._getTooltipAnchor && !this.options.sticky ? this._source._getTooltipAnchor() : [0, 0]);\n\t}\n\n});\n\n// @namespace Tooltip\n// @factory L.tooltip(options?: Tooltip options, source?: Layer)\n// Instantiates a `Tooltip` object given an optional `options` object that describes its appearance and location and an optional `source` object that is used to tag the tooltip with a reference to the Layer to which it refers.\n// @alternative\n// @factory L.tooltip(latlng: LatLng, options?: Tooltip options)\n// Instantiates a `Tooltip` object given `latlng` where the tooltip will open and an optional `options` object that describes its appearance and location.\nexport var tooltip = function (options, source) {\n\treturn new Tooltip(options, source);\n};\n\n// @namespace Map\n// @section Methods for Layers and Controls\nMap.include({\n\n\t// @method openTooltip(tooltip: Tooltip): this\n\t// Opens the specified tooltip.\n\t// @alternative\n\t// @method openTooltip(content: String|HTMLElement, latlng: LatLng, options?: Tooltip options): this\n\t// Creates a tooltip with the specified content and options and open it.\n\topenTooltip: function (tooltip, latlng, options) {\n\t\tthis._initOverlay(Tooltip, tooltip, latlng, options)\n\t\t  .openOn(this);\n\n\t\treturn this;\n\t},\n\n\t// @method closeTooltip(tooltip: Tooltip): this\n\t// Closes the tooltip given as parameter.\n\tcloseTooltip: function (tooltip) {\n\t\ttooltip.close();\n\t\treturn this;\n\t}\n\n});\n\n/*\n * @namespace Layer\n * @section Tooltip methods example\n *\n * All layers share a set of methods convenient for binding tooltips to it.\n *\n * ```js\n * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map);\n * layer.openTooltip();\n * layer.closeTooltip();\n * ```\n */\n\n// @section Tooltip methods\nLayer.include({\n\n\t// @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this\n\t// Binds a tooltip to the layer with the passed `content` and sets up the\n\t// necessary event listeners. If a `Function` is passed it will receive\n\t// the layer as the first argument and should return a `String` or `HTMLElement`.\n\tbindTooltip: function (content, options) {\n\n\t\tif (this._tooltip && this.isTooltipOpen()) {\n\t\t\tthis.unbindTooltip();\n\t\t}\n\n\t\tthis._tooltip = this._initOverlay(Tooltip, this._tooltip, content, options);\n\t\tthis._initTooltipInteractions();\n\n\t\tif (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) {\n\t\t\tthis.openTooltip();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t// @method unbindTooltip(): this\n\t// Removes the tooltip previously bound with `bindTooltip`.\n\tunbindTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\tthis._initTooltipInteractions(true);\n\t\t\tthis.closeTooltip();\n\t\t\tthis._tooltip = null;\n\t\t}\n\t\treturn this;\n\t},\n\n\t_initTooltipInteractions: function (remove) {\n\t\tif (!remove && this._tooltipHandlersAdded) { return; }\n\t\tvar onOff = remove ? 'off' : 'on',\n\t\t    events = {\n\t\t\tremove: this.closeTooltip,\n\t\t\tmove: this._moveTooltip\n\t\t    };\n\t\tif (!this._tooltip.options.permanent) {\n\t\t\tevents.mouseover = this._openTooltip;\n\t\t\tevents.mouseout = this.closeTooltip;\n\t\t\tevents.click = this._openTooltip;\n\t\t\tif (this._map) {\n\t\t\t\tthis._addFocusListeners();\n\t\t\t} else {\n\t\t\t\tevents.add = this._addFocusListeners;\n\t\t\t}\n\t\t} else {\n\t\t\tevents.add = this._openTooltip;\n\t\t}\n\t\tif (this._tooltip.options.sticky) {\n\t\t\tevents.mousemove = this._moveTooltip;\n\t\t}\n\t\tthis[onOff](events);\n\t\tthis._tooltipHandlersAdded = !remove;\n\t},\n\n\t// @method openTooltip(latlng?: LatLng): this\n\t// Opens the bound tooltip at the specified `latlng` or at the default tooltip anchor if no `latlng` is passed.\n\topenTooltip: function (latlng) {\n\t\tif (this._tooltip) {\n\t\t\tif (!(this instanceof FeatureGroup)) {\n\t\t\t\tthis._tooltip._source = this;\n\t\t\t}\n\t\t\tif (this._tooltip._prepareOpen(latlng)) {\n\t\t\t\t// open the tooltip on the map\n\t\t\t\tthis._tooltip.openOn(this._map);\n\n\t\t\t\tif (this.getElement) {\n\t\t\t\t\tthis._setAriaDescribedByOnLayer(this);\n\t\t\t\t} else if (this.eachLayer) {\n\t\t\t\t\tthis.eachLayer(this._setAriaDescribedByOnLayer, this);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method closeTooltip(): this\n\t// Closes the tooltip bound to this layer if it is open.\n\tcloseTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\treturn this._tooltip.close();\n\t\t}\n\t},\n\n\t// @method toggleTooltip(): this\n\t// Opens or closes the tooltip bound to this layer depending on its current state.\n\ttoggleTooltip: function () {\n\t\tif (this._tooltip) {\n\t\t\tthis._tooltip.toggle(this);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method isTooltipOpen(): boolean\n\t// Returns `true` if the tooltip bound to this layer is currently open.\n\tisTooltipOpen: function () {\n\t\treturn this._tooltip.isOpen();\n\t},\n\n\t// @method setTooltipContent(content: String|HTMLElement|Tooltip): this\n\t// Sets the content of the tooltip bound to this layer.\n\tsetTooltipContent: function (content) {\n\t\tif (this._tooltip) {\n\t\t\tthis._tooltip.setContent(content);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getTooltip(): Tooltip\n\t// Returns the tooltip bound to this layer.\n\tgetTooltip: function () {\n\t\treturn this._tooltip;\n\t},\n\n\t_addFocusListeners: function () {\n\t\tif (this.getElement) {\n\t\t\tthis._addFocusListenersOnLayer(this);\n\t\t} else if (this.eachLayer) {\n\t\t\tthis.eachLayer(this._addFocusListenersOnLayer, this);\n\t\t}\n\t},\n\n\t_addFocusListenersOnLayer: function (layer) {\n\t\tvar el = typeof layer.getElement === 'function' && layer.getElement();\n\t\tif (el) {\n\t\t\tDomEvent.on(el, 'focus', function () {\n\t\t\t\tthis._tooltip._source = layer;\n\t\t\t\tthis.openTooltip();\n\t\t\t}, this);\n\t\t\tDomEvent.on(el, 'blur', this.closeTooltip, this);\n\t\t}\n\t},\n\n\t_setAriaDescribedByOnLayer: function (layer) {\n\t\tvar el = typeof layer.getElement === 'function' && layer.getElement();\n\t\tif (el) {\n\t\t\tel.setAttribute('aria-describedby', this._tooltip._container.id);\n\t\t}\n\t},\n\n\n\t_openTooltip: function (e) {\n\t\tif (!this._tooltip || !this._map) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If the map is moving, we will show the tooltip after it's done.\n\t\tif (this._map.dragging && this._map.dragging.moving() && !this._openOnceFlag) {\n\t\t\tthis._openOnceFlag = true;\n\t\t\tvar that = this;\n\t\t\tthis._map.once('moveend', function () {\n\t\t\t\tthat._openOnceFlag = false;\n\t\t\t\tthat._openTooltip(e);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tthis._tooltip._source = e.layer || e.target;\n\n\t\tthis.openTooltip(this._tooltip.options.sticky ? e.latlng : undefined);\n\t},\n\n\t_moveTooltip: function (e) {\n\t\tvar latlng = e.latlng, containerPoint, layerPoint;\n\t\tif (this._tooltip.options.sticky && e.originalEvent) {\n\t\t\tcontainerPoint = this._map.mouseEventToContainerPoint(e.originalEvent);\n\t\t\tlayerPoint = this._map.containerPointToLayerPoint(containerPoint);\n\t\t\tlatlng = this._map.layerPointToLatLng(layerPoint);\n\t\t}\n\t\tthis._tooltip.setLatLng(latlng);\n\t}\n});\n", "import {Icon} from './Icon';\nimport {toPoint as point} from '../../geometry/Point';\nimport {empty} from '../../dom/DomUtil';\n\n/*\n * @class DivIcon\n * @aka L.DivIcon\n * @inherits Icon\n *\n * Represents a lightweight icon for markers that uses a simple `<div>`\n * element instead of an image. Inherits from `Icon` but ignores the `iconUrl` and shadow options.\n *\n * @example\n * ```js\n * var myIcon = L.divIcon({className: 'my-div-icon'});\n * // you can set .my-div-icon styles in CSS\n *\n * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);\n * ```\n *\n * By default, it has a 'leaflet-div-icon' CSS class and is styled as a little white square with a shadow.\n */\n\nexport var DivIcon = Icon.extend({\n\toptions: {\n\t\t// @section\n\t\t// @aka DivIcon options\n\t\ticonSize: [12, 12], // also can be set through CSS\n\n\t\t// iconAnchor: (Point),\n\t\t// popupAnchor: (Point),\n\n\t\t// @option html: String|HTMLElement = ''\n\t\t// Custom HTML code to put inside the div element, empty by default. Alternatively,\n\t\t// an instance of `HTMLElement`.\n\t\thtml: false,\n\n\t\t// @option bgPos: Point = [0, 0]\n\t\t// Optional relative position of the background, in pixels\n\t\tbgPos: null,\n\n\t\tclassName: 'leaflet-div-icon'\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\tvar div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n\t\t    options = this.options;\n\n\t\tif (options.html instanceof Element) {\n\t\t\tempty(div);\n\t\t\tdiv.appendChild(options.html);\n\t\t} else {\n\t\t\tdiv.innerHTML = options.html !== false ? options.html : '';\n\t\t}\n\n\t\tif (options.bgPos) {\n\t\t\tvar bgPos = point(options.bgPos);\n\t\t\tdiv.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px';\n\t\t}\n\t\tthis._setIconStyles(div, 'icon');\n\n\t\treturn div;\n\t},\n\n\tcreateShadow: function () {\n\t\treturn null;\n\t}\n});\n\n// @factory L.divIcon(options: DivIcon options)\n// Creates a `DivIcon` instance with the given options.\nexport function divIcon(options) {\n\treturn new DivIcon(options);\n}\n", "import {Icon} from './Icon';\nexport {icon} from './Icon';\nimport {IconDefault} from './Icon.Default';\nIcon.Default = IconDefault;\nexport {Icon};\n\nexport {DivIcon, divIcon} from './DivIcon';\nexport {Marker, marker} from './Marker';\n", "import {Layer} from '../Layer';\nimport Browser from '../../core/Browser';\nimport * as Util from '../../core/Util';\nimport * as DomUtil from '../../dom/DomUtil';\nimport {Point} from '../../geometry/Point';\nimport {Bounds} from '../../geometry/Bounds';\nimport {LatLngBounds, toLatLngBounds as latLngBounds} from '../../geo/LatLngBounds';\n\n/*\n * @class GridLayer\n * @inherits Layer\n * @aka L.GridLayer\n *\n * Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces `TileLayer.Canvas`.\n * GridLayer can be extended to create a tiled grid of HTML elements like `<canvas>`, `<img>` or `<div>`. GridLayer will handle creating and animating these DOM elements for you.\n *\n *\n * @section Synchronous usage\n * @example\n *\n * To create a custom layer, extend GridLayer and implement the `createTile()` method, which will be passed a `Point` object with the `x`, `y`, and `z` (zoom level) coordinates to draw your tile.\n *\n * ```js\n * var CanvasLayer = L.GridLayer.extend({\n *     createTile: function(coords){\n *         // create a <canvas> element for drawing\n *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');\n *\n *         // setup tile width and height according to the options\n *         var size = this.getTileSize();\n *         tile.width = size.x;\n *         tile.height = size.y;\n *\n *         // get a canvas context and draw something on it using coords.x, coords.y and coords.z\n *         var ctx = tile.getContext('2d');\n *\n *         // return the tile so it can be rendered on screen\n *         return tile;\n *     }\n * });\n * ```\n *\n * @section Asynchronous usage\n * @example\n *\n * Tile creation can also be asynchronous, this is useful when using a third-party drawing library. Once the tile is finished drawing it can be passed to the `done()` callback.\n *\n * ```js\n * var CanvasLayer = L.GridLayer.extend({\n *     createTile: function(coords, done){\n *         var error;\n *\n *         // create a <canvas> element for drawing\n *         var tile = L.DomUtil.create('canvas', 'leaflet-tile');\n *\n *         // setup tile width and height according to the options\n *         var size = this.getTileSize();\n *         tile.width = size.x;\n *         tile.height = size.y;\n *\n *         // draw something asynchronously and pass the tile to the done() callback\n *         setTimeout(function() {\n *             done(error, tile);\n *         }, 1000);\n *\n *         return tile;\n *     }\n * });\n * ```\n *\n * @section\n */\n\n\nexport var GridLayer = Layer.extend({\n\n\t// @section\n\t// @aka GridLayer options\n\toptions: {\n\t\t// @option tileSize: Number|Point = 256\n\t\t// Width and height of tiles in the grid. Use a number if width and height are equal, or `L.point(width, height)` otherwise.\n\t\ttileSize: 256,\n\n\t\t// @option opacity: Number = 1.0\n\t\t// Opacity of the tiles. Can be used in the `createTile()` function.\n\t\topacity: 1,\n\n\t\t// @option updateWhenIdle: Boolean = (depends)\n\t\t// Load new tiles only when panning ends.\n\t\t// `true` by default on mobile browsers, in order to avoid too many requests and keep smooth navigation.\n\t\t// `false` otherwise in order to display new tiles _during_ panning, since it is easy to pan outside the\n\t\t// [`keepBuffer`](#gridlayer-keepbuffer) option in desktop browsers.\n\t\tupdateWhenIdle: Browser.mobile,\n\n\t\t// @option updateWhenZooming: Boolean = true\n\t\t// By default, a smooth zoom animation (during a [touch zoom](#map-touchzoom) or a [`flyTo()`](#map-flyto)) will update grid layers every integer zoom level. Setting this option to `false` will update the grid layer only when the smooth animation ends.\n\t\tupdateWhenZooming: true,\n\n\t\t// @option updateInterval: Number = 200\n\t\t// Tiles will not update more than once every `updateInterval` milliseconds when panning.\n\t\tupdateInterval: 200,\n\n\t\t// @option zIndex: Number = 1\n\t\t// The explicit zIndex of the tile layer.\n\t\tzIndex: 1,\n\n\t\t// @option bounds: LatLngBounds = undefined\n\t\t// If set, tiles will only be loaded inside the set `LatLngBounds`.\n\t\tbounds: null,\n\n\t\t// @option minZoom: Number = 0\n\t\t// The minimum zoom level down to which this layer will be displayed (inclusive).\n\t\tminZoom: 0,\n\n\t\t// @option maxZoom: Number = undefined\n\t\t// The maximum zoom level up to which this layer will be displayed (inclusive).\n\t\tmaxZoom: undefined,\n\n\t\t// @option maxNativeZoom: Number = undefined\n\t\t// Maximum zoom number the tile source has available. If it is specified,\n\t\t// the tiles on all zoom levels higher than `maxNativeZoom` will be loaded\n\t\t// from `maxNativeZoom` level and auto-scaled.\n\t\tmaxNativeZoom: undefined,\n\n\t\t// @option minNativeZoom: Number = undefined\n\t\t// Minimum zoom number the tile source has available. If it is specified,\n\t\t// the tiles on all zoom levels lower than `minNativeZoom` will be loaded\n\t\t// from `minNativeZoom` level and auto-scaled.\n\t\tminNativeZoom: undefined,\n\n\t\t// @option noWrap: Boolean = false\n\t\t// Whether the layer is wrapped around the antimeridian. If `true`, the\n\t\t// GridLayer will only be displayed once at low zoom levels. Has no\n\t\t// effect when the [map CRS](#map-crs) doesn't wrap around. Can be used\n\t\t// in combination with [`bounds`](#gridlayer-bounds) to prevent requesting\n\t\t// tiles outside the CRS limits.\n\t\tnoWrap: false,\n\n\t\t// @option pane: String = 'tilePane'\n\t\t// `Map pane` where the grid layer will be added.\n\t\tpane: 'tilePane',\n\n\t\t// @option className: String = ''\n\t\t// A custom class name to assign to the tile layer. Empty by default.\n\t\tclassName: '',\n\n\t\t// @option keepBuffer: Number = 2\n\t\t// When panning the map, keep this many rows and columns of tiles before unloading them.\n\t\tkeepBuffer: 2\n\t},\n\n\tinitialize: function (options) {\n\t\tUtil.setOptions(this, options);\n\t},\n\n\tonAdd: function () {\n\t\tthis._initContainer();\n\n\t\tthis._levels = {};\n\t\tthis._tiles = {};\n\n\t\tthis._resetView(); // implicit _update() call\n\t},\n\n\tbeforeAdd: function (map) {\n\t\tmap._addZoomLimit(this);\n\t},\n\n\tonRemove: function (map) {\n\t\tthis._removeAllTiles();\n\t\tDomUtil.remove(this._container);\n\t\tmap._removeZoomLimit(this);\n\t\tthis._container = null;\n\t\tthis._tileZoom = undefined;\n\t},\n\n\t// @method bringToFront: this\n\t// Brings the tile layer to the top of all tile layers.\n\tbringToFront: function () {\n\t\tif (this._map) {\n\t\t\tDomUtil.toFront(this._container);\n\t\t\tthis._setAutoZIndex(Math.max);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method bringToBack: this\n\t// Brings the tile layer to the bottom of all tile layers.\n\tbringToBack: function () {\n\t\tif (this._map) {\n\t\t\tDomUtil.toBack(this._container);\n\t\t\tthis._setAutoZIndex(Math.min);\n\t\t}\n\t\treturn this;\n\t},\n\n\t// @method getContainer: HTMLElement\n\t// Returns the HTML element that contains the tiles for this layer.\n\tgetContainer: function () {\n\t\treturn this._container;\n\t},\n\n\t// @method setOpacity(opacity: Number): this\n\t// Changes the [opacity](#gridlayer-opacity) of the grid layer.\n\tsetOpacity: function (opacity) {\n\t\tthis.options.opacity = opacity;\n\t\tthis._updateOpacity();\n\t\treturn this;\n\t},\n\n\t// @method setZIndex(zIndex: Number): this\n\t// Changes the [zIndex](#gridlayer-zindex) of the grid layer.\n\tsetZIndex: function (zIndex) {\n\t\tthis.options.zIndex = zIndex;\n\t\tthis._updateZIndex();\n\n\t\treturn this;\n\t},\n\n\t// @method isLoading: Boolean\n\t// Returns `true` if any tile in the grid layer has not finished loading.\n\tisLoading: function () {\n\t\treturn this._loading;\n\t},\n\n\t// @method redraw: this\n\t// Causes the layer to clear all the tiles and request them again.\n\tredraw: function () {\n\t\tif (this._map) {\n\t\t\tthis._removeAllTiles();\n\t\t\tvar tileZoom = this._clampZoom(this._map.getZoom());\n\t\t\tif (tileZoom !== this._tileZoom) {\n\t\t\t\tthis._tileZoom = tileZoom;\n\t\t\t\tthis._updateLevels();\n\t\t\t}\n\t\t\tthis._update();\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = {\n\t\t\tviewprereset: this._invalidateAll,\n\t\t\tviewreset: this._resetView,\n\t\t\tzoom: this._resetView,\n\t\t\tmoveend: this._onMoveEnd\n\t\t};\n\n\t\tif (!this.options.updateWhenIdle) {\n\t\t\t// update tiles on move, but not more often than once per given interval\n\t\t\tif (!this._onMove) {\n\t\t\t\tthis._onMove = Util.throttle(this._onMoveEnd, this.options.updateInterval, this);\n\t\t\t}\n\n\t\t\tevents.move = this._onMove;\n\t\t}\n\n\t\tif (this._zoomAnimated) {\n\t\t\tevents.zoomanim = this._animateZoom;\n\t\t}\n\n\t\treturn events;\n\t},\n\n\t// @section Extension methods\n\t// Layers extending `GridLayer` shall reimplement the following method.\n\t// @method createTile(coords: Object, done?: Function): HTMLElement\n\t// Called only internally, must be overridden by classes extending `GridLayer`.\n\t// Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback\n\t// is specified, it must be called when the tile has finished loading and drawing.\n\tcreateTile: function () {\n\t\treturn document.createElement('div');\n\t},\n\n\t// @section\n\t// @method getTileSize: Point\n\t// Normalizes the [tileSize option](#gridlayer-tilesize) into a point. Used by the `createTile()` method.\n\tgetTileSize: function () {\n\t\tvar s = this.options.tileSize;\n\t\treturn s instanceof Point ? s : new Point(s, s);\n\t},\n\n\t_updateZIndex: function () {\n\t\tif (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) {\n\t\t\tthis._container.style.zIndex = this.options.zIndex;\n\t\t}\n\t},\n\n\t_setAutoZIndex: function (compare) {\n\t\t// go through all other layers of the same pane, set zIndex to max + 1 (front) or min - 1 (back)\n\n\t\tvar layers = this.getPane().children,\n\t\t    edgeZIndex = -compare(-Infinity, Infinity); // -Infinity for max, Infinity for min\n\n\t\tfor (var i = 0, len = layers.length, zIndex; i < len; i++) {\n\n\t\t\tzIndex = layers[i].style.zIndex;\n\n\t\t\tif (layers[i] !== this._container && zIndex) {\n\t\t\t\tedgeZIndex = compare(edgeZIndex, +zIndex);\n\t\t\t}\n\t\t}\n\n\t\tif (isFinite(edgeZIndex)) {\n\t\t\tthis.options.zIndex = edgeZIndex + compare(-1, 1);\n\t\t\tthis._updateZIndex();\n\t\t}\n\t},\n\n\t_updateOpacity: function () {\n\t\tif (!this._map) { return; }\n\n\t\t// IE doesn't inherit filter opacity properly, so we're forced to set it on tiles\n\t\tif (Browser.ielt9) { return; }\n\n\t\tDomUtil.setOpacity(this._container, this.options.opacity);\n\n\t\tvar now = +new Date(),\n\t\t    nextFrame = false,\n\t\t    willPrune = false;\n\n\t\tfor (var key in this._tiles) {\n\t\t\tvar tile = this._tiles[key];\n\t\t\tif (!tile.current || !tile.loaded) { continue; }\n\n\t\t\tvar fade = Math.min(1, (now - tile.loaded) / 200);\n\n\t\t\tDomUtil.setOpacity(tile.el, fade);\n\t\t\tif (fade < 1) {\n\t\t\t\tnextFrame = true;\n\t\t\t} else {\n\t\t\t\tif (tile.active) {\n\t\t\t\t\twillPrune = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis._onOpaqueTile(tile);\n\t\t\t\t}\n\t\t\t\ttile.active = true;\n\t\t\t}\n\t\t}\n\n\t\tif (willPrune && !this._noPrune) { this._pruneTiles(); }\n\n\t\tif (nextFrame) {\n\t\t\tUtil.cancelAnimFrame(this._fadeFrame);\n\t\t\tthis._fadeFrame = Util.requestAnimFrame(this._updateOpacity, this);\n\t\t}\n\t},\n\n\t_onOpaqueTile: Util.falseFn,\n\n\t_initContainer: function () {\n\t\tif (this._container) { return; }\n\n\t\tthis._container = DomUtil.create('div', 'leaflet-layer ' + (this.options.className || ''));\n\t\tthis._updateZIndex();\n\n\t\tif (this.options.opacity < 1) {\n\t\t\tthis._updateOpacity();\n\t\t}\n\n\t\tthis.getPane().appendChild(this._container);\n\t},\n\n\t_updateLevels: function () {\n\n\t\tvar zoom = this._tileZoom,\n\t\t    maxZoom = this.options.maxZoom;\n\n\t\tif (zoom === undefined) { return undefined; }\n\n\t\tfor (var z in this._levels) {\n\t\t\tz = Number(z);\n\t\t\tif (this._levels[z].el.children.length || z === zoom) {\n\t\t\t\tthis._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z);\n\t\t\t\tthis._onUpdateLevel(z);\n\t\t\t} else {\n\t\t\t\tDomUtil.remove(this._levels[z].el);\n\t\t\t\tthis._removeTilesAtZoom(z);\n\t\t\t\tthis._onRemoveLevel(z);\n\t\t\t\tdelete this._levels[z];\n\t\t\t}\n\t\t}\n\n\t\tvar level = this._levels[zoom],\n\t\t    map = this._map;\n\n\t\tif (!level) {\n\t\t\tlevel = this._levels[zoom] = {};\n\n\t\t\tlevel.el = DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container);\n\t\t\tlevel.el.style.zIndex = maxZoom;\n\n\t\t\tlevel.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round();\n\t\t\tlevel.zoom = zoom;\n\n\t\t\tthis._setZoomTransform(level, map.getCenter(), map.getZoom());\n\n\t\t\t// force the browser to consider the newly added element for transition\n\t\t\tUtil.falseFn(level.el.offsetWidth);\n\n\t\t\tthis._onCreateLevel(level);\n\t\t}\n\n\t\tthis._level = level;\n\n\t\treturn level;\n\t},\n\n\t_onUpdateLevel: Util.falseFn,\n\n\t_onRemoveLevel: Util.falseFn,\n\n\t_onCreateLevel: Util.falseFn,\n\n\t_pruneTiles: function () {\n\t\tif (!this._map) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar key, tile;\n\n\t\tvar zoom = this._map.getZoom();\n\t\tif (zoom > this.options.maxZoom ||\n\t\t\tzoom < this.options.minZoom) {\n\t\t\tthis._removeAllTiles();\n\t\t\treturn;\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\ttile = this._tiles[key];\n\t\t\ttile.retain = tile.current;\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\ttile = this._tiles[key];\n\t\t\tif (tile.current && !tile.active) {\n\t\t\t\tvar coords = tile.coords;\n\t\t\t\tif (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) {\n\t\t\t\t\tthis._retainChildren(coords.x, coords.y, coords.z, coords.z + 2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (key in this._tiles) {\n\t\t\tif (!this._tiles[key].retain) {\n\t\t\t\tthis._removeTile(key);\n\t\t\t}\n\t\t}\n\t},\n\n\t_removeTilesAtZoom: function (zoom) {\n\t\tfor (var key in this._tiles) {\n\t\t\tif (this._tiles[key].coords.z !== zoom) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis._removeTile(key);\n\t\t}\n\t},\n\n\t_removeAllTiles: function () {\n\t\tfor (var key in this._tiles) {\n\t\t\tthis._removeTile(key);\n\t\t}\n\t},\n\n\t_invalidateAll: function () {\n\t\tfor (var z in this._levels) {\n\t\t\tDomUtil.remove(this._levels[z].el);\n\t\t\tthis._onRemoveLevel(Number(z));\n\t\t\tdelete this._levels[z];\n\t\t}\n\t\tthis._removeAllTiles();\n\n\t\tthis._tileZoom = undefined;\n\t},\n\n\t_retainParent: function (x, y, z, minZoom) {\n\t\tvar x2 = Math.floor(x / 2),\n\t\t    y2 = Math.floor(y / 2),\n\t\t    z2 = z - 1,\n\t\t    coords2 = new Point(+x2, +y2);\n\t\tcoords2.z = +z2;\n\n\t\tvar key = this._tileCoordsToKey(coords2),\n\t\t    tile = this._tiles[key];\n\n\t\tif (tile && tile.active) {\n\t\t\ttile.retain = true;\n\t\t\treturn true;\n\n\t\t} else if (tile && tile.loaded) {\n\t\t\ttile.retain = true;\n\t\t}\n\n\t\tif (z2 > minZoom) {\n\t\t\treturn this._retainParent(x2, y2, z2, minZoom);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_retainChildren: function (x, y, z, maxZoom) {\n\n\t\tfor (var i = 2 * x; i < 2 * x + 2; i++) {\n\t\t\tfor (var j = 2 * y; j < 2 * y + 2; j++) {\n\n\t\t\t\tvar coords = new Point(i, j);\n\t\t\t\tcoords.z = z + 1;\n\n\t\t\t\tvar key = this._tileCoordsToKey(coords),\n\t\t\t\t    tile = this._tiles[key];\n\n\t\t\t\tif (tile && tile.active) {\n\t\t\t\t\ttile.retain = true;\n\t\t\t\t\tcontinue;\n\n\t\t\t\t} else if (tile && tile.loaded) {\n\t\t\t\t\ttile.retain = true;\n\t\t\t\t}\n\n\t\t\t\tif (z + 1 < maxZoom) {\n\t\t\t\t\tthis._retainChildren(i, j, z + 1, maxZoom);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_resetView: function (e) {\n\t\tvar animating = e && (e.pinch || e.flyTo);\n\t\tthis._setView(this._map.getCenter(), this._map.getZoom(), animating, animating);\n\t},\n\n\t_animateZoom: function (e) {\n\t\tthis._setView(e.center, e.zoom, true, e.noUpdate);\n\t},\n\n\t_clampZoom: function (zoom) {\n\t\tvar options = this.options;\n\n\t\tif (undefined !== options.minNativeZoom && zoom < options.minNativeZoom) {\n\t\t\treturn options.minNativeZoom;\n\t\t}\n\n\t\tif (undefined !== options.maxNativeZoom && options.maxNativeZoom < zoom) {\n\t\t\treturn options.maxNativeZoom;\n\t\t}\n\n\t\treturn zoom;\n\t},\n\n\t_setView: function (center, zoom, noPrune, noUpdate) {\n\t\tvar tileZoom = Math.round(zoom);\n\t\tif ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) ||\n\t\t    (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) {\n\t\t\ttileZoom = undefined;\n\t\t} else {\n\t\t\ttileZoom = this._clampZoom(tileZoom);\n\t\t}\n\n\t\tvar tileZoomChanged = this.options.updateWhenZooming && (tileZoom !== this._tileZoom);\n\n\t\tif (!noUpdate || tileZoomChanged) {\n\n\t\t\tthis._tileZoom = tileZoom;\n\n\t\t\tif (this._abortLoading) {\n\t\t\t\tthis._abortLoading();\n\t\t\t}\n\n\t\t\tthis._updateLevels();\n\t\t\tthis._resetGrid();\n\n\t\t\tif (tileZoom !== undefined) {\n\t\t\t\tthis._update(center);\n\t\t\t}\n\n\t\t\tif (!noPrune) {\n\t\t\t\tthis._pruneTiles();\n\t\t\t}\n\n\t\t\t// Flag to prevent _updateOpacity from pruning tiles during\n\t\t\t// a zoom anim or a pinch gesture\n\t\t\tthis._noPrune = !!noPrune;\n\t\t}\n\n\t\tthis._setZoomTransforms(center, zoom);\n\t},\n\n\t_setZoomTransforms: function (center, zoom) {\n\t\tfor (var i in this._levels) {\n\t\t\tthis._setZoomTransform(this._levels[i], center, zoom);\n\t\t}\n\t},\n\n\t_setZoomTransform: function (level, center, zoom) {\n\t\tvar scale = this._map.getZoomScale(zoom, level.zoom),\n\t\t    translate = level.origin.multiplyBy(scale)\n\t\t        .subtract(this._map._getNewPixelOrigin(center, zoom)).round();\n\n\t\tif (Browser.any3d) {\n\t\t\tDomUtil.setTransform(level.el, translate, scale);\n\t\t} else {\n\t\t\tDomUtil.setPosition(level.el, translate);\n\t\t}\n\t},\n\n\t_resetGrid: function () {\n\t\tvar map = this._map,\n\t\t    crs = map.options.crs,\n\t\t    tileSize = this._tileSize = this.getTileSize(),\n\t\t    tileZoom = this._tileZoom;\n\n\t\tvar bounds = this._map.getPixelWorldBounds(this._tileZoom);\n\t\tif (bounds) {\n\t\t\tthis._globalTileRange = this._pxBoundsToTileRange(bounds);\n\t\t}\n\n\t\tthis._wrapX = crs.wrapLng && !this.options.noWrap && [\n\t\t\tMath.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x),\n\t\t\tMath.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y)\n\t\t];\n\t\tthis._wrapY = crs.wrapLat && !this.options.noWrap && [\n\t\t\tMath.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x),\n\t\t\tMath.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y)\n\t\t];\n\t},\n\n\t_onMoveEnd: function () {\n\t\tif (!this._map || this._map._animatingZoom) { return; }\n\n\t\tthis._update();\n\t},\n\n\t_getTiledPixelBounds: function (center) {\n\t\tvar map = this._map,\n\t\t    mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(),\n\t\t    scale = map.getZoomScale(mapZoom, this._tileZoom),\n\t\t    pixelCenter = map.project(center, this._tileZoom).floor(),\n\t\t    halfSize = map.getSize().divideBy(scale * 2);\n\n\t\treturn new Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize));\n\t},\n\n\t// Private method to load tiles in the grid's active zoom level according to map bounds\n\t_update: function (center) {\n\t\tvar map = this._map;\n\t\tif (!map) { return; }\n\t\tvar zoom = this._clampZoom(map.getZoom());\n\n\t\tif (center === undefined) { center = map.getCenter(); }\n\t\tif (this._tileZoom === undefined) { return; }\t// if out of minzoom/maxzoom\n\n\t\tvar pixelBounds = this._getTiledPixelBounds(center),\n\t\t    tileRange = this._pxBoundsToTileRange(pixelBounds),\n\t\t    tileCenter = tileRange.getCenter(),\n\t\t    queue = [],\n\t\t    margin = this.options.keepBuffer,\n\t\t    noPruneRange = new Bounds(tileRange.getBottomLeft().subtract([margin, -margin]),\n\t\t                              tileRange.getTopRight().add([margin, -margin]));\n\n\t\t// Sanity check: panic if the tile range contains Infinity somewhere.\n\t\tif (!(isFinite(tileRange.min.x) &&\n\t\t      isFinite(tileRange.min.y) &&\n\t\t      isFinite(tileRange.max.x) &&\n\t\t      isFinite(tileRange.max.y))) { throw new Error('Attempted to load an infinite number of tiles'); }\n\n\t\tfor (var key in this._tiles) {\n\t\t\tvar c = this._tiles[key].coords;\n\t\t\tif (c.z !== this._tileZoom || !noPruneRange.contains(new Point(c.x, c.y))) {\n\t\t\t\tthis._tiles[key].current = false;\n\t\t\t}\n\t\t}\n\n\t\t// _update just loads more tiles. If the tile zoom level differs too much\n\t\t// from the map's, let _setView reset levels and prune old tiles.\n\t\tif (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; }\n\n\t\t// create a queue of coordinates to load tiles from\n\t\tfor (var j = tileRange.min.y; j <= tileRange.max.y; j++) {\n\t\t\tfor (var i = tileRange.min.x; i <= tileRange.max.x; i++) {\n\t\t\t\tvar coords = new Point(i, j);\n\t\t\t\tcoords.z = this._tileZoom;\n\n\t\t\t\tif (!this._isValidTile(coords)) { continue; }\n\n\t\t\t\tvar tile = this._tiles[this._tileCoordsToKey(coords)];\n\t\t\t\tif (tile) {\n\t\t\t\t\ttile.current = true;\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push(coords);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sort tile queue to load tiles in order of their distance to center\n\t\tqueue.sort(function (a, b) {\n\t\t\treturn a.distanceTo(tileCenter) - b.distanceTo(tileCenter);\n\t\t});\n\n\t\tif (queue.length !== 0) {\n\t\t\t// if it's the first batch of tiles to load\n\t\t\tif (!this._loading) {\n\t\t\t\tthis._loading = true;\n\t\t\t\t// @event loading: Event\n\t\t\t\t// Fired when the grid layer starts loading tiles.\n\t\t\t\tthis.fire('loading');\n\t\t\t}\n\n\t\t\t// create DOM fragment to append tiles in one batch\n\t\t\tvar fragment = document.createDocumentFragment();\n\n\t\t\tfor (i = 0; i < queue.length; i++) {\n\t\t\t\tthis._addTile(queue[i], fragment);\n\t\t\t}\n\n\t\t\tthis._level.el.appendChild(fragment);\n\t\t}\n\t},\n\n\t_isValidTile: function (coords) {\n\t\tvar crs = this._map.options.crs;\n\n\t\tif (!crs.infinite) {\n\t\t\t// don't load tile if it's out of bounds and not wrapped\n\t\t\tvar bounds = this._globalTileRange;\n\t\t\tif ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) ||\n\t\t\t    (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; }\n\t\t}\n\n\t\tif (!this.options.bounds) { return true; }\n\n\t\t// don't load tile if it doesn't intersect the bounds in options\n\t\tvar tileBounds = this._tileCoordsToBounds(coords);\n\t\treturn latLngBounds(this.options.bounds).overlaps(tileBounds);\n\t},\n\n\t_keyToBounds: function (key) {\n\t\treturn this._tileCoordsToBounds(this._keyToTileCoords(key));\n\t},\n\n\t_tileCoordsToNwSe: function (coords) {\n\t\tvar map = this._map,\n\t\t    tileSize = this.getTileSize(),\n\t\t    nwPoint = coords.scaleBy(tileSize),\n\t\t    sePoint = nwPoint.add(tileSize),\n\t\t    nw = map.unproject(nwPoint, coords.z),\n\t\t    se = map.unproject(sePoint, coords.z);\n\t\treturn [nw, se];\n\t},\n\n\t// converts tile coordinates to its geographical bounds\n\t_tileCoordsToBounds: function (coords) {\n\t\tvar bp = this._tileCoordsToNwSe(coords),\n\t\t    bounds = new LatLngBounds(bp[0], bp[1]);\n\n\t\tif (!this.options.noWrap) {\n\t\t\tbounds = this._map.wrapLatLngBounds(bounds);\n\t\t}\n\t\treturn bounds;\n\t},\n\t// converts tile coordinates to key for the tile cache\n\t_tileCoordsToKey: function (coords) {\n\t\treturn coords.x + ':' + coords.y + ':' + coords.z;\n\t},\n\n\t// converts tile cache key to coordinates\n\t_keyToTileCoords: function (key) {\n\t\tvar k = key.split(':'),\n\t\t    coords = new Point(+k[0], +k[1]);\n\t\tcoords.z = +k[2];\n\t\treturn coords;\n\t},\n\n\t_removeTile: function (key) {\n\t\tvar tile = this._tiles[key];\n\t\tif (!tile) { return; }\n\n\t\tDomUtil.remove(tile.el);\n\n\t\tdelete this._tiles[key];\n\n\t\t// @event tileunload: TileEvent\n\t\t// Fired when a tile is removed (e.g. when a tile goes off the screen).\n\t\tthis.fire('tileunload', {\n\t\t\ttile: tile.el,\n\t\t\tcoords: this._keyToTileCoords(key)\n\t\t});\n\t},\n\n\t_initTile: function (tile) {\n\t\tDomUtil.addClass(tile, 'leaflet-tile');\n\n\t\tvar tileSize = this.getTileSize();\n\t\ttile.style.width = tileSize.x + 'px';\n\t\ttile.style.height = tileSize.y + 'px';\n\n\t\ttile.onselectstart = Util.falseFn;\n\t\ttile.onmousemove = Util.falseFn;\n\n\t\t// update opacity on tiles in IE7-8 because of filter inheritance problems\n\t\tif (Browser.ielt9 && this.options.opacity < 1) {\n\t\t\tDomUtil.setOpacity(tile, this.options.opacity);\n\t\t}\n\t},\n\n\t_addTile: function (coords, container) {\n\t\tvar tilePos = this._getTilePos(coords),\n\t\t    key = this._tileCoordsToKey(coords);\n\n\t\tvar tile = this.createTile(this._wrapCoords(coords), Util.bind(this._tileReady, this, coords));\n\n\t\tthis._initTile(tile);\n\n\t\t// if createTile is defined with a second argument (\"done\" callback),\n\t\t// we know that tile is async and will be ready later; otherwise\n\t\tif (this.createTile.length < 2) {\n\t\t\t// mark tile as ready, but delay one frame for opacity animation to happen\n\t\t\tUtil.requestAnimFrame(Util.bind(this._tileReady, this, coords, null, tile));\n\t\t}\n\n\t\tDomUtil.setPosition(tile, tilePos);\n\n\t\t// save tile in cache\n\t\tthis._tiles[key] = {\n\t\t\tel: tile,\n\t\t\tcoords: coords,\n\t\t\tcurrent: true\n\t\t};\n\n\t\tcontainer.appendChild(tile);\n\t\t// @event tileloadstart: TileEvent\n\t\t// Fired when a tile is requested and starts loading.\n\t\tthis.fire('tileloadstart', {\n\t\t\ttile: tile,\n\t\t\tcoords: coords\n\t\t});\n\t},\n\n\t_tileReady: function (coords, err, tile) {\n\t\tif (err) {\n\t\t\t// @event tileerror: TileErrorEvent\n\t\t\t// Fired when there is an error loading a tile.\n\t\t\tthis.fire('tileerror', {\n\t\t\t\terror: err,\n\t\t\t\ttile: tile,\n\t\t\t\tcoords: coords\n\t\t\t});\n\t\t}\n\n\t\tvar key = this._tileCoordsToKey(coords);\n\n\t\ttile = this._tiles[key];\n\t\tif (!tile) { return; }\n\n\t\ttile.loaded = +new Date();\n\t\tif (this._map._fadeAnimated) {\n\t\t\tDomUtil.setOpacity(tile.el, 0);\n\t\t\tUtil.cancelAnimFrame(this._fadeFrame);\n\t\t\tthis._fadeFrame = Util.requestAnimFrame(this._updateOpacity, this);\n\t\t} else {\n\t\t\ttile.active = true;\n\t\t\tthis._pruneTiles();\n\t\t}\n\n\t\tif (!err) {\n\t\t\tDomUtil.addClass(tile.el, 'leaflet-tile-loaded');\n\n\t\t\t// @event tileload: TileEvent\n\t\t\t// Fired when a tile loads.\n\t\t\tthis.fire('tileload', {\n\t\t\t\ttile: tile.el,\n\t\t\t\tcoords: coords\n\t\t\t});\n\t\t}\n\n\t\tif (this._noTilesToLoad()) {\n\t\t\tthis._loading = false;\n\t\t\t// @event load: Event\n\t\t\t// Fired when the grid layer loaded all visible tiles.\n\t\t\tthis.fire('load');\n\n\t\t\tif (Browser.ielt9 || !this._map._fadeAnimated) {\n\t\t\t\tUtil.requestAnimFrame(this._pruneTiles, this);\n\t\t\t} else {\n\t\t\t\t// Wait a bit more than 0.2 secs (the duration of the tile fade-in)\n\t\t\t\t// to trigger a pruning.\n\t\t\t\tsetTimeout(Util.bind(this._pruneTiles, this), 250);\n\t\t\t}\n\t\t}\n\t},\n\n\t_getTilePos: function (coords) {\n\t\treturn coords.scaleBy(this.getTileSize()).subtract(this._level.origin);\n\t},\n\n\t_wrapCoords: function (coords) {\n\t\tvar newCoords = new Point(\n\t\t\tthis._wrapX ? Util.wrapNum(coords.x, this._wrapX) : coords.x,\n\t\t\tthis._wrapY ? Util.wrapNum(coords.y, this._wrapY) : coords.y);\n\t\tnewCoords.z = coords.z;\n\t\treturn newCoords;\n\t},\n\n\t_pxBoundsToTileRange: function (bounds) {\n\t\tvar tileSize = this.getTileSize();\n\t\treturn new Bounds(\n\t\t\tbounds.min.unscaleBy(tileSize).floor(),\n\t\t\tbounds.max.unscaleBy(tileSize).ceil().subtract([1, 1]));\n\t},\n\n\t_noTilesToLoad: function () {\n\t\tfor (var key in this._tiles) {\n\t\t\tif (!this._tiles[key].loaded) { return false; }\n\t\t}\n\t\treturn true;\n\t}\n});\n\n// @factory L.gridLayer(options?: GridLayer options)\n// Creates a new instance of GridLayer with the supplied options.\nexport function gridLayer(options) {\n\treturn new GridLayer(options);\n}\n", "import {GridLayer} from './GridLayer';\r\nimport Browser from '../../core/Browser';\r\nimport * as Util from '../../core/Util';\r\nimport * as DomEvent from '../../dom/DomEvent';\r\nimport * as DomUtil from '../../dom/DomUtil';\r\n\r\n\r\n/*\r\n * @class TileLayer\r\n * @inherits GridLayer\r\n * @aka L.TileLayer\r\n * Used to load and display tile layers on the map. Note that most tile servers require attribution, which you can set under `Layer`. Extends `GridLayer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', {foo: 'bar', attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'}).addTo(map);\n * ```\r\n *\r\n * @section URL template\r\n * @example\r\n *\r\n * A string of the following form:\r\n *\r\n * ```\r\n * 'https://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'\r\n * ```\r\n *\r\n * `{s}` means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; `a`, `b` or `c` by default, can be omitted), `{z}` — zoom level, `{x}` and `{y}` — tile coordinates. `{r}` can be used to add \"&commat;2x\" to the URL to load retina tiles.\r\n *\r\n * You can use custom keys in the template, which will be [evaluated](#util-template) from TileLayer options, like this:\r\n *\r\n * ```\r\n * L.tileLayer('https://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});\r\n * ```\r\n */\r\n\r\n\r\nexport var TileLayer = GridLayer.extend({\r\n\r\n\t// @section\r\n\t// @aka TileLayer options\r\n\toptions: {\r\n\t\t// @option minZoom: Number = 0\r\n\t\t// The minimum zoom level down to which this layer will be displayed (inclusive).\r\n\t\tminZoom: 0,\r\n\r\n\t\t// @option maxZoom: Number = 18\r\n\t\t// The maximum zoom level up to which this layer will be displayed (inclusive).\r\n\t\tmaxZoom: 18,\r\n\r\n\t\t// @option subdomains: String|String[] = 'abc'\r\n\t\t// Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.\r\n\t\tsubdomains: 'abc',\r\n\r\n\t\t// @option errorTileUrl: String = ''\r\n\t\t// URL to the tile image to show in place of the tile that failed to load.\r\n\t\terrorTileUrl: '',\r\n\r\n\t\t// @option zoomOffset: Number = 0\r\n\t\t// The zoom number used in tile URLs will be offset with this value.\r\n\t\tzoomOffset: 0,\r\n\r\n\t\t// @option tms: Boolean = false\r\n\t\t// If `true`, inverses Y axis numbering for tiles (turn this on for [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) services).\r\n\t\ttms: false,\r\n\r\n\t\t// @option zoomReverse: Boolean = false\r\n\t\t// If set to true, the zoom number used in tile URLs will be reversed (`maxZoom - zoom` instead of `zoom`)\r\n\t\tzoomReverse: false,\r\n\r\n\t\t// @option detectRetina: Boolean = false\r\n\t\t// If `true` and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution.\r\n\t\tdetectRetina: false,\r\n\r\n\t\t// @option crossOrigin: Boolean|String = false\r\n\t\t// Whether the crossOrigin attribute will be added to the tiles.\r\n\t\t// If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data.\r\n\t\t// Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values.\r\n\t\tcrossOrigin: false,\r\n\r\n\t\t// @option referrerPolicy: Boolean|String = false\r\n\t\t// Whether the referrerPolicy attribute will be added to the tiles.\r\n\t\t// If a String is provided, all tiles will have their referrerPolicy attribute set to the String provided.\r\n\t\t// This may be needed if your map's rendering context has a strict default but your tile provider expects a valid referrer\r\n\t\t// (e.g. to validate an API token).\r\n\t\t// Refer to [HTMLImageElement.referrerPolicy](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/referrerPolicy) for valid String values.\r\n\t\treferrerPolicy: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\toptions = Util.setOptions(this, options);\r\n\r\n\t\t// detecting retina displays, adjusting tileSize and zoom levels\r\n\t\tif (options.detectRetina && Browser.retina && options.maxZoom > 0) {\r\n\r\n\t\t\toptions.tileSize = Math.floor(options.tileSize / 2);\r\n\r\n\t\t\tif (!options.zoomReverse) {\r\n\t\t\t\toptions.zoomOffset++;\r\n\t\t\t\toptions.maxZoom = Math.max(options.minZoom, options.maxZoom - 1);\r\n\t\t\t} else {\r\n\t\t\t\toptions.zoomOffset--;\r\n\t\t\t\toptions.minZoom = Math.min(options.maxZoom, options.minZoom + 1);\r\n\t\t\t}\r\n\r\n\t\t\toptions.minZoom = Math.max(0, options.minZoom);\r\n\t\t} else if (!options.zoomReverse) {\r\n\t\t\t// make sure maxZoom is gte minZoom\r\n\t\t\toptions.maxZoom = Math.max(options.minZoom, options.maxZoom);\r\n\t\t} else {\r\n\t\t\t// make sure minZoom is lte maxZoom\r\n\t\t\toptions.minZoom = Math.min(options.maxZoom, options.minZoom);\r\n\t\t}\r\n\r\n\t\tif (typeof options.subdomains === 'string') {\r\n\t\t\toptions.subdomains = options.subdomains.split('');\r\n\t\t}\r\n\r\n\t\tthis.on('tileunload', this._onTileRemove);\r\n\t},\r\n\r\n\t// @method setUrl(url: String, noRedraw?: Boolean): this\r\n\t// Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`).\r\n\t// If the URL does not change, the layer will not be redrawn unless\r\n\t// the noRedraw parameter is set to false.\r\n\tsetUrl: function (url, noRedraw) {\r\n\t\tif (this._url === url && noRedraw === undefined) {\r\n\t\t\tnoRedraw = true;\r\n\t\t}\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// @method createTile(coords: Object, done?: Function): HTMLElement\r\n\t// Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile)\r\n\t// to return an `<img>` HTML element with the appropriate image URL given `coords`. The `done`\r\n\t// callback is called when the tile has been loaded.\r\n\tcreateTile: function (coords, done) {\r\n\t\tvar tile = document.createElement('img');\r\n\r\n\t\tDomEvent.on(tile, 'load', Util.bind(this._tileOnLoad, this, done, tile));\r\n\t\tDomEvent.on(tile, 'error', Util.bind(this._tileOnError, this, done, tile));\r\n\r\n\t\tif (this.options.crossOrigin || this.options.crossOrigin === '') {\r\n\t\t\ttile.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin;\r\n\t\t}\r\n\r\n\t\t// for this new option we follow the documented behavior\r\n\t\t// more closely by only setting the property when string\r\n\t\tif (typeof this.options.referrerPolicy === 'string') {\r\n\t\t\ttile.referrerPolicy = this.options.referrerPolicy;\r\n\t\t}\r\n\r\n\t\t// The alt attribute is set to the empty string,\r\n\t\t// allowing screen readers to ignore the decorative image tiles.\r\n\t\t// https://www.w3.org/WAI/tutorials/images/decorative/\r\n\t\t// https://www.w3.org/TR/html-aria/#el-img-empty-alt\r\n\t\ttile.alt = '';\r\n\r\n\t\ttile.src = this.getTileUrl(coords);\r\n\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t// @section Extension methods\r\n\t// @uninheritable\r\n\t// Layers extending `TileLayer` might reimplement the following method.\r\n\t// @method getTileUrl(coords: Object): String\r\n\t// Called only internally, returns the URL for a tile given its coordinates.\r\n\t// Classes extending `TileLayer` can override this function to provide custom tile URL naming schemes.\r\n\tgetTileUrl: function (coords) {\r\n\t\tvar data = {\r\n\t\t\tr: Browser.retina ? '@2x' : '',\r\n\t\t\ts: this._getSubdomain(coords),\r\n\t\t\tx: coords.x,\r\n\t\t\ty: coords.y,\r\n\t\t\tz: this._getZoomForUrl()\r\n\t\t};\r\n\t\tif (this._map && !this._map.options.crs.infinite) {\r\n\t\t\tvar invertedY = this._globalTileRange.max.y - coords.y;\r\n\t\t\tif (this.options.tms) {\r\n\t\t\t\tdata['y'] = invertedY;\r\n\t\t\t}\r\n\t\t\tdata['-y'] = invertedY;\r\n\t\t}\r\n\r\n\t\treturn Util.template(this._url, Util.extend(data, this.options));\r\n\t},\r\n\r\n\t_tileOnLoad: function (done, tile) {\r\n\t\t// For https://github.com/Leaflet/Leaflet/issues/3332\r\n\t\tif (Browser.ielt9) {\r\n\t\t\tsetTimeout(Util.bind(done, this, null, tile), 0);\r\n\t\t} else {\r\n\t\t\tdone(null, tile);\r\n\t\t}\r\n\t},\r\n\r\n\t_tileOnError: function (done, tile, e) {\r\n\t\tvar errorUrl = this.options.errorTileUrl;\r\n\t\tif (errorUrl && tile.getAttribute('src') !== errorUrl) {\r\n\t\t\ttile.src = errorUrl;\r\n\t\t}\r\n\t\tdone(e, tile);\r\n\t},\r\n\r\n\t_onTileRemove: function (e) {\r\n\t\te.tile.onload = null;\r\n\t},\r\n\r\n\t_getZoomForUrl: function () {\r\n\t\tvar zoom = this._tileZoom,\r\n\t\tmaxZoom = this.options.maxZoom,\r\n\t\tzoomReverse = this.options.zoomReverse,\r\n\t\tzoomOffset = this.options.zoomOffset;\r\n\r\n\t\tif (zoomReverse) {\r\n\t\t\tzoom = maxZoom - zoom;\r\n\t\t}\r\n\r\n\t\treturn zoom + zoomOffset;\r\n\t},\r\n\r\n\t_getSubdomain: function (tilePoint) {\r\n\t\tvar index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;\r\n\t\treturn this.options.subdomains[index];\r\n\t},\r\n\r\n\t// stops loading all tiles in the background layer\r\n\t_abortLoading: function () {\r\n\t\tvar i, tile;\r\n\t\tfor (i in this._tiles) {\r\n\t\t\tif (this._tiles[i].coords.z !== this._tileZoom) {\r\n\t\t\t\ttile = this._tiles[i].el;\r\n\r\n\t\t\t\ttile.onload = Util.falseFn;\r\n\t\t\t\ttile.onerror = Util.falseFn;\r\n\r\n\t\t\t\tif (!tile.complete) {\r\n\t\t\t\t\ttile.src = Util.emptyImageUrl;\r\n\t\t\t\t\tvar coords = this._tiles[i].coords;\r\n\t\t\t\t\tDomUtil.remove(tile);\r\n\t\t\t\t\tdelete this._tiles[i];\r\n\t\t\t\t\t// @event tileabort: TileEvent\r\n\t\t\t\t\t// Fired when a tile was loading but is now not wanted.\r\n\t\t\t\t\tthis.fire('tileabort', {\r\n\t\t\t\t\t\ttile: tile,\r\n\t\t\t\t\t\tcoords: coords\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_removeTile: function (key) {\r\n\t\tvar tile = this._tiles[key];\r\n\t\tif (!tile) { return; }\r\n\r\n\t\t// Cancels any pending http requests associated with the tile\r\n\t\ttile.el.setAttribute('src', Util.emptyImageUrl);\r\n\r\n\t\treturn GridLayer.prototype._removeTile.call(this, key);\r\n\t},\r\n\r\n\t_tileReady: function (coords, err, tile) {\r\n\t\tif (!this._map || (tile && tile.getAttribute('src') === Util.emptyImageUrl)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\treturn GridLayer.prototype._tileReady.call(this, coords, err, tile);\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.tilelayer(urlTemplate: String, options?: TileLayer options)\r\n// Instantiates a tile layer object given a `URL template` and optionally an options object.\r\n\r\nexport function tileLayer(url, options) {\r\n\treturn new TileLayer(url, options);\r\n}\r\n", "import {TileLayer} from './TileLayer';\r\nimport {extend, setOptions, getParamString} from '../../core/Util';\r\nimport Browser from '../../core/Browser';\r\nimport {EPSG4326} from '../../geo/crs/CRS.EPSG4326';\r\nimport {toBounds} from '../../geometry/Bounds';\r\n\r\n/*\r\n * @class TileLayer.WMS\r\n * @inherits TileLayer\r\n * @aka L.TileLayer.WMS\r\n * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`.\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * var nexrad = L.tileLayer.wms(\"http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi\", {\r\n * \tlayers: 'nexrad-n0r-900913',\r\n * \tformat: 'image/png',\r\n * \ttransparent: true,\r\n * \tattribution: \"Weather data © 2012 IEM Nexrad\"\r\n * });\r\n * ```\r\n */\r\n\r\nexport var TileLayerWMS = TileLayer.extend({\r\n\r\n\t// @section\r\n\t// @aka TileLayer.WMS options\r\n\t// If any custom options not documented here are used, they will be sent to the\r\n\t// WMS server as extra parameters in each request URL. This can be useful for\r\n\t// [non-standard vendor WMS parameters](https://docs.geoserver.org/stable/en/user/services/wms/vendor.html).\r\n\tdefaultWmsParams: {\r\n\t\tservice: 'WMS',\r\n\t\trequest: 'GetMap',\r\n\r\n\t\t// @option layers: String = ''\r\n\t\t// **(required)** Comma-separated list of WMS layers to show.\r\n\t\tlayers: '',\r\n\r\n\t\t// @option styles: String = ''\r\n\t\t// Comma-separated list of WMS styles.\r\n\t\tstyles: '',\r\n\r\n\t\t// @option format: String = 'image/jpeg'\r\n\t\t// WMS image format (use `'image/png'` for layers with transparency).\r\n\t\tformat: 'image/jpeg',\r\n\r\n\t\t// @option transparent: Boolean = false\r\n\t\t// If `true`, the WMS service will return images with transparency.\r\n\t\ttransparent: false,\r\n\r\n\t\t// @option version: String = '1.1.1'\r\n\t\t// Version of the WMS service to use\r\n\t\tversion: '1.1.1'\r\n\t},\r\n\r\n\toptions: {\r\n\t\t// @option crs: CRS = null\r\n\t\t// Coordinate Reference System to use for the WMS requests, defaults to\r\n\t\t// map CRS. Don't change this if you're not sure what it means.\r\n\t\tcrs: null,\r\n\r\n\t\t// @option uppercase: Boolean = false\r\n\t\t// If `true`, WMS request parameter keys will be uppercase.\r\n\t\tuppercase: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar wmsParams = extend({}, this.defaultWmsParams);\r\n\r\n\t\t// all keys that are not TileLayer options go to WMS params\r\n\t\tfor (var i in options) {\r\n\t\t\tif (!(i in this.options)) {\r\n\t\t\t\twmsParams[i] = options[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\toptions = setOptions(this, options);\r\n\r\n\t\tvar realRetina = options.detectRetina && Browser.retina ? 2 : 1;\r\n\t\tvar tileSize = this.getTileSize();\r\n\t\twmsParams.width = tileSize.x * realRetina;\r\n\t\twmsParams.height = tileSize.y * realRetina;\r\n\r\n\t\tthis.wmsParams = wmsParams;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\r\n\t\tthis._crs = this.options.crs || map.options.crs;\r\n\t\tthis._wmsVersion = parseFloat(this.wmsParams.version);\r\n\r\n\t\tvar projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';\r\n\t\tthis.wmsParams[projectionKey] = this._crs.code;\r\n\r\n\t\tTileLayer.prototype.onAdd.call(this, map);\r\n\t},\r\n\r\n\tgetTileUrl: function (coords) {\r\n\r\n\t\tvar tileBounds = this._tileCoordsToNwSe(coords),\r\n\t\t    crs = this._crs,\r\n\t\t    bounds = toBounds(crs.project(tileBounds[0]), crs.project(tileBounds[1])),\r\n\t\t    min = bounds.min,\r\n\t\t    max = bounds.max,\r\n\t\t    bbox = (this._wmsVersion >= 1.3 && this._crs === EPSG4326 ?\r\n\t\t    [min.y, min.x, max.y, max.x] :\r\n\t\t    [min.x, min.y, max.x, max.y]).join(','),\r\n\t\t    url = TileLayer.prototype.getTileUrl.call(this, coords);\r\n\t\treturn url +\r\n\t\t\tgetParamString(this.wmsParams, url, this.options.uppercase) +\r\n\t\t\t(this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox;\r\n\t},\r\n\r\n\t// @method setParams(params: Object, noRedraw?: Boolean): this\r\n\t// Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true).\r\n\tsetParams: function (params, noRedraw) {\r\n\r\n\t\textend(this.wmsParams, params);\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\n\r\n// @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options)\r\n// Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.\r\nexport function tileLayerWMS(url, options) {\r\n\treturn new TileLayerWMS(url, options);\r\n}\r\n", "export {GridLayer, gridLayer} from './GridLayer';\nimport {TileLayer, tileLayer} from './TileLayer';\nimport {TileLayerWMS, tileLayerWMS} from './TileLayer.WMS';\nTileLayer.WMS = TileLayerWMS;\ntileLayer.wms = tileLayerWMS;\nexport {TileLayer, tileLayer};\n", "import {Layer} from '../Layer';\nimport * as DomUtil from '../../dom/DomUtil';\nimport * as Util from '../../core/Util';\nimport Browser from '../../core/Browser';\nimport {Bounds} from '../../geometry/Bounds';\n\n\n\n/*\n * @class Renderer\n * @inherits Layer\n * @aka L.Renderer\n *\n * Base class for vector renderer implementations (`SVG`, `Canvas`). Handles the\n * DOM container of the renderer, its bounds, and its zoom animation.\n *\n * A `Renderer` works as an implicit layer group for all `Path`s - the renderer\n * itself can be added or removed to the map. All paths use a renderer, which can\n * be implicit (the map will decide the type of renderer and use it automatically)\n * or explicit (using the [`renderer`](#path-renderer) option of the path).\n *\n * Do not use this class directly, use `SVG` and `Canvas` instead.\n *\n * @event update: Event\n * Fired when the renderer updates its bounds, center and zoom, for example when\n * its map has moved\n */\n\nexport var Renderer = Layer.extend({\n\n\t// @section\n\t// @aka Renderer options\n\toptions: {\n\t\t// @option padding: Number = 0.1\n\t\t// How much to extend the clip area around the map view (relative to its size)\n\t\t// e.g. 0.1 would be 10% of map view in each direction\n\t\tpadding: 0.1\n\t},\n\n\tinitialize: function (options) {\n\t\tUtil.setOptions(this, options);\n\t\tUtil.stamp(this);\n\t\tthis._layers = this._layers || {};\n\t},\n\n\tonAdd: function () {\n\t\tif (!this._container) {\n\t\t\tthis._initContainer(); // defined by renderer implementations\n\n\t\t\t// always keep transform-origin as 0 0\n\t\t\tDomUtil.addClass(this._container, 'leaflet-zoom-animated');\n\t\t}\n\n\t\tthis.getPane().appendChild(this._container);\n\t\tthis._update();\n\t\tthis.on('update', this._updatePaths, this);\n\t},\n\n\tonRemove: function () {\n\t\tthis.off('update', this._updatePaths, this);\n\t\tthis._destroyContainer();\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = {\n\t\t\tviewreset: this._reset,\n\t\t\tzoom: this._onZoom,\n\t\t\tmoveend: this._update,\n\t\t\tzoomend: this._onZoomEnd\n\t\t};\n\t\tif (this._zoomAnimated) {\n\t\t\tevents.zoomanim = this._onAnimZoom;\n\t\t}\n\t\treturn events;\n\t},\n\n\t_onAnimZoom: function (ev) {\n\t\tthis._updateTransform(ev.center, ev.zoom);\n\t},\n\n\t_onZoom: function () {\n\t\tthis._updateTransform(this._map.getCenter(), this._map.getZoom());\n\t},\n\n\t_updateTransform: function (center, zoom) {\n\t\tvar scale = this._map.getZoomScale(zoom, this._zoom),\n\t\t    viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding),\n\t\t    currentCenterPoint = this._map.project(this._center, zoom),\n\n\t\t    topLeftOffset = viewHalf.multiplyBy(-scale).add(currentCenterPoint)\n\t\t\t\t  .subtract(this._map._getNewPixelOrigin(center, zoom));\n\n\t\tif (Browser.any3d) {\n\t\t\tDomUtil.setTransform(this._container, topLeftOffset, scale);\n\t\t} else {\n\t\t\tDomUtil.setPosition(this._container, topLeftOffset);\n\t\t}\n\t},\n\n\t_reset: function () {\n\t\tthis._update();\n\t\tthis._updateTransform(this._center, this._zoom);\n\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._reset();\n\t\t}\n\t},\n\n\t_onZoomEnd: function () {\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._project();\n\t\t}\n\t},\n\n\t_updatePaths: function () {\n\t\tfor (var id in this._layers) {\n\t\t\tthis._layers[id]._update();\n\t\t}\n\t},\n\n\t_update: function () {\n\t\t// Update pixel bounds of renderer container (for positioning/sizing/clipping later)\n\t\t// Subclasses are responsible of firing the 'update' event.\n\t\tvar p = this.options.padding,\n\t\t    size = this._map.getSize(),\n\t\t    min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round();\n\n\t\tthis._bounds = new Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round());\n\n\t\tthis._center = this._map.getCenter();\n\t\tthis._zoom = this._map.getZoom();\n\t}\n});\n", "import {Renderer} from './Renderer';\nimport * as DomUtil from '../../dom/DomUtil';\nimport * as DomEvent from '../../dom/DomEvent';\nimport Browser from '../../core/Browser';\nimport * as Util from '../../core/Util';\nimport {Bounds} from '../../geometry/Bounds';\n\n/*\n * @class Canvas\n * @inherits Renderer\n * @aka L.Canvas\n *\n * Allows vector layers to be displayed with [`<canvas>`](https://developer.mozilla.org/docs/Web/API/Canvas_API).\n * Inherits `Renderer`.\n *\n * Due to [technical limitations](https://caniuse.com/canvas), Canvas is not\n * available in all web browsers, notably IE8, and overlapping geometries might\n * not display properly in some edge cases.\n *\n * @example\n *\n * Use Canvas by default for all paths in the map:\n *\n * ```js\n * var map = L.map('map', {\n * \trenderer: L.canvas()\n * });\n * ```\n *\n * Use a Canvas renderer with extra padding for specific vector geometries:\n *\n * ```js\n * var map = L.map('map');\n * var myRenderer = L.canvas({ padding: 0.5 });\n * var line = L.polyline( coordinates, { renderer: myRenderer } );\n * var circle = L.circle( center, { renderer: myRenderer } );\n * ```\n */\n\nexport var Canvas = Renderer.extend({\n\n\t// @section\n\t// @aka Canvas options\n\toptions: {\n\t\t// @option tolerance: Number = 0\n\t\t// How much to extend the click tolerance around a path/object on the map.\n\t\ttolerance: 0\n\t},\n\n\tgetEvents: function () {\n\t\tvar events = Renderer.prototype.getEvents.call(this);\n\t\tevents.viewprereset = this._onViewPreReset;\n\t\treturn events;\n\t},\n\n\t_onViewPreReset: function () {\n\t\t// Set a flag so that a viewprereset+moveend+viewreset only updates&redraws once\n\t\tthis._postponeUpdatePaths = true;\n\t},\n\n\tonAdd: function () {\n\t\tRenderer.prototype.onAdd.call(this);\n\n\t\t// Redraw vectors since canvas is cleared upon removal,\n\t\t// in case of removing the renderer itself from the map.\n\t\tthis._draw();\n\t},\n\n\t_initContainer: function () {\n\t\tvar container = this._container = document.createElement('canvas');\n\n\t\tDomEvent.on(container, 'mousemove', this._onMouseMove, this);\n\t\tDomEvent.on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this);\n\t\tDomEvent.on(container, 'mouseout', this._handleMouseOut, this);\n\t\tcontainer['_leaflet_disable_events'] = true;\n\n\t\tthis._ctx = container.getContext('2d');\n\t},\n\n\t_destroyContainer: function () {\n\t\tUtil.cancelAnimFrame(this._redrawRequest);\n\t\tdelete this._ctx;\n\t\tDomUtil.remove(this._container);\n\t\tDomEvent.off(this._container);\n\t\tdelete this._container;\n\t},\n\n\t_updatePaths: function () {\n\t\tif (this._postponeUpdatePaths) { return; }\n\n\t\tvar layer;\n\t\tthis._redrawBounds = null;\n\t\tfor (var id in this._layers) {\n\t\t\tlayer = this._layers[id];\n\t\t\tlayer._update();\n\t\t}\n\t\tthis._redraw();\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom && this._bounds) { return; }\n\n\t\tRenderer.prototype._update.call(this);\n\n\t\tvar b = this._bounds,\n\t\t    container = this._container,\n\t\t    size = b.getSize(),\n\t\t    m = Browser.retina ? 2 : 1;\n\n\t\tDomUtil.setPosition(container, b.min);\n\n\t\t// set canvas size (also clearing it); use double size on retina\n\t\tcontainer.width = m * size.x;\n\t\tcontainer.height = m * size.y;\n\t\tcontainer.style.width = size.x + 'px';\n\t\tcontainer.style.height = size.y + 'px';\n\n\t\tif (Browser.retina) {\n\t\t\tthis._ctx.scale(2, 2);\n\t\t}\n\n\t\t// translate so we use the same path coordinates after canvas element moves\n\t\tthis._ctx.translate(-b.min.x, -b.min.y);\n\n\t\t// Tell paths to redraw themselves\n\t\tthis.fire('update');\n\t},\n\n\t_reset: function () {\n\t\tRenderer.prototype._reset.call(this);\n\n\t\tif (this._postponeUpdatePaths) {\n\t\t\tthis._postponeUpdatePaths = false;\n\t\t\tthis._updatePaths();\n\t\t}\n\t},\n\n\t_initPath: function (layer) {\n\t\tthis._updateDashArray(layer);\n\t\tthis._layers[Util.stamp(layer)] = layer;\n\n\t\tvar order = layer._order = {\n\t\t\tlayer: layer,\n\t\t\tprev: this._drawLast,\n\t\t\tnext: null\n\t\t};\n\t\tif (this._drawLast) { this._drawLast.next = order; }\n\t\tthis._drawLast = order;\n\t\tthis._drawFirst = this._drawFirst || this._drawLast;\n\t},\n\n\t_addPath: function (layer) {\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_removePath: function (layer) {\n\t\tvar order = layer._order;\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else {\n\t\t\tthis._drawLast = prev;\n\t\t}\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else {\n\t\t\tthis._drawFirst = next;\n\t\t}\n\n\t\tdelete layer._order;\n\n\t\tdelete this._layers[Util.stamp(layer)];\n\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updatePath: function (layer) {\n\t\t// Redraw the union of the layer's old pixel\n\t\t// bounds and the new pixel bounds.\n\t\tthis._extendRedrawBounds(layer);\n\t\tlayer._project();\n\t\tlayer._update();\n\t\t// The redraw will extend the redraw bounds\n\t\t// with the new pixel bounds.\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tthis._updateDashArray(layer);\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_updateDashArray: function (layer) {\n\t\tif (typeof layer.options.dashArray === 'string') {\n\t\t\tvar parts = layer.options.dashArray.split(/[, ]+/),\n\t\t\t    dashArray = [],\n\t\t\t    dashValue,\n\t\t\t    i;\n\t\t\tfor (i = 0; i < parts.length; i++) {\n\t\t\t\tdashValue = Number(parts[i]);\n\t\t\t\t// Ignore dash array containing invalid lengths\n\t\t\t\tif (isNaN(dashValue)) { return; }\n\t\t\t\tdashArray.push(dashValue);\n\t\t\t}\n\t\t\tlayer.options._dashArray = dashArray;\n\t\t} else {\n\t\t\tlayer.options._dashArray = layer.options.dashArray;\n\t\t}\n\t},\n\n\t_requestRedraw: function (layer) {\n\t\tif (!this._map) { return; }\n\n\t\tthis._extendRedrawBounds(layer);\n\t\tthis._redrawRequest = this._redrawRequest || Util.requestAnimFrame(this._redraw, this);\n\t},\n\n\t_extendRedrawBounds: function (layer) {\n\t\tif (layer._pxBounds) {\n\t\t\tvar padding = (layer.options.weight || 0) + 1;\n\t\t\tthis._redrawBounds = this._redrawBounds || new Bounds();\n\t\t\tthis._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding]));\n\t\t\tthis._redrawBounds.extend(layer._pxBounds.max.add([padding, padding]));\n\t\t}\n\t},\n\n\t_redraw: function () {\n\t\tthis._redrawRequest = null;\n\n\t\tif (this._redrawBounds) {\n\t\t\tthis._redrawBounds.min._floor();\n\t\t\tthis._redrawBounds.max._ceil();\n\t\t}\n\n\t\tthis._clear(); // clear layers in redraw bounds\n\t\tthis._draw(); // draw layers\n\n\t\tthis._redrawBounds = null;\n\t},\n\n\t_clear: function () {\n\t\tvar bounds = this._redrawBounds;\n\t\tif (bounds) {\n\t\t\tvar size = bounds.getSize();\n\t\t\tthis._ctx.clearRect(bounds.min.x, bounds.min.y, size.x, size.y);\n\t\t} else {\n\t\t\tthis._ctx.save();\n\t\t\tthis._ctx.setTransform(1, 0, 0, 1, 0, 0);\n\t\t\tthis._ctx.clearRect(0, 0, this._container.width, this._container.height);\n\t\t\tthis._ctx.restore();\n\t\t}\n\t},\n\n\t_draw: function () {\n\t\tvar layer, bounds = this._redrawBounds;\n\t\tthis._ctx.save();\n\t\tif (bounds) {\n\t\t\tvar size = bounds.getSize();\n\t\t\tthis._ctx.beginPath();\n\t\t\tthis._ctx.rect(bounds.min.x, bounds.min.y, size.x, size.y);\n\t\t\tthis._ctx.clip();\n\t\t}\n\n\t\tthis._drawing = true;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (!bounds || (layer._pxBounds && layer._pxBounds.intersects(bounds))) {\n\t\t\t\tlayer._updatePath();\n\t\t\t}\n\t\t}\n\n\t\tthis._drawing = false;\n\n\t\tthis._ctx.restore();  // Restore state before clipping.\n\t},\n\n\t_updatePoly: function (layer, closed) {\n\t\tif (!this._drawing) { return; }\n\n\t\tvar i, j, len2, p,\n\t\t    parts = layer._parts,\n\t\t    len = parts.length,\n\t\t    ctx = this._ctx;\n\n\t\tif (!len) { return; }\n\n\t\tctx.beginPath();\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tfor (j = 0, len2 = parts[i].length; j < len2; j++) {\n\t\t\t\tp = parts[i][j];\n\t\t\t\tctx[j ? 'lineTo' : 'moveTo'](p.x, p.y);\n\t\t\t}\n\t\t\tif (closed) {\n\t\t\t\tctx.closePath();\n\t\t\t}\n\t\t}\n\n\t\tthis._fillStroke(ctx, layer);\n\n\t\t// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature\n\t},\n\n\t_updateCircle: function (layer) {\n\n\t\tif (!this._drawing || layer._empty()) { return; }\n\n\t\tvar p = layer._point,\n\t\t    ctx = this._ctx,\n\t\t    r = Math.max(Math.round(layer._radius), 1),\n\t\t    s = (Math.max(Math.round(layer._radiusY), 1) || r) / r;\n\n\t\tif (s !== 1) {\n\t\t\tctx.save();\n\t\t\tctx.scale(1, s);\n\t\t}\n\n\t\tctx.beginPath();\n\t\tctx.arc(p.x, p.y / s, r, 0, Math.PI * 2, false);\n\n\t\tif (s !== 1) {\n\t\t\tctx.restore();\n\t\t}\n\n\t\tthis._fillStroke(ctx, layer);\n\t},\n\n\t_fillStroke: function (ctx, layer) {\n\t\tvar options = layer.options;\n\n\t\tif (options.fill) {\n\t\t\tctx.globalAlpha = options.fillOpacity;\n\t\t\tctx.fillStyle = options.fillColor || options.color;\n\t\t\tctx.fill(options.fillRule || 'evenodd');\n\t\t}\n\n\t\tif (options.stroke && options.weight !== 0) {\n\t\t\tif (ctx.setLineDash) {\n\t\t\t\tctx.setLineDash(layer.options && layer.options._dashArray || []);\n\t\t\t}\n\t\t\tctx.globalAlpha = options.opacity;\n\t\t\tctx.lineWidth = options.weight;\n\t\t\tctx.strokeStyle = options.color;\n\t\t\tctx.lineCap = options.lineCap;\n\t\t\tctx.lineJoin = options.lineJoin;\n\t\t\tctx.stroke();\n\t\t}\n\t},\n\n\t// Canvas obviously doesn't have mouse events for individual drawn objects,\n\t// so we emulate that by calculating what's under the mouse on mousemove/click manually\n\n\t_onClick: function (e) {\n\t\tvar point = this._map.mouseEventToLayerPoint(e), layer, clickedLayer;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (layer.options.interactive && layer._containsPoint(point)) {\n\t\t\t\tif (!(e.type === 'click' || e.type === 'preclick') || !this._map._draggableMoved(layer)) {\n\t\t\t\t\tclickedLayer = layer;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._fireEvent(clickedLayer ? [clickedLayer] : false, e);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; }\n\n\t\tvar point = this._map.mouseEventToLayerPoint(e);\n\t\tthis._handleMouseHover(e, point);\n\t},\n\n\n\t_handleMouseOut: function (e) {\n\t\tvar layer = this._hoveredLayer;\n\t\tif (layer) {\n\t\t\t// if we're leaving the layer, fire mouseout\n\t\t\tDomUtil.removeClass(this._container, 'leaflet-interactive');\n\t\t\tthis._fireEvent([layer], e, 'mouseout');\n\t\t\tthis._hoveredLayer = null;\n\t\t\tthis._mouseHoverThrottled = false;\n\t\t}\n\t},\n\n\t_handleMouseHover: function (e, point) {\n\t\tif (this._mouseHoverThrottled) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar layer, candidateHoveredLayer;\n\n\t\tfor (var order = this._drawFirst; order; order = order.next) {\n\t\t\tlayer = order.layer;\n\t\t\tif (layer.options.interactive && layer._containsPoint(point)) {\n\t\t\t\tcandidateHoveredLayer = layer;\n\t\t\t}\n\t\t}\n\n\t\tif (candidateHoveredLayer !== this._hoveredLayer) {\n\t\t\tthis._handleMouseOut(e);\n\n\t\t\tif (candidateHoveredLayer) {\n\t\t\t\tDomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor\n\t\t\t\tthis._fireEvent([candidateHoveredLayer], e, 'mouseover');\n\t\t\t\tthis._hoveredLayer = candidateHoveredLayer;\n\t\t\t}\n\t\t}\n\n\t\tthis._fireEvent(this._hoveredLayer ? [this._hoveredLayer] : false, e);\n\n\t\tthis._mouseHoverThrottled = true;\n\t\tsetTimeout(Util.bind(function () {\n\t\t\tthis._mouseHoverThrottled = false;\n\t\t}, this), 32);\n\t},\n\n\t_fireEvent: function (layers, e, type) {\n\t\tthis._map._fireDOMEvent(e, type || e.type, layers);\n\t},\n\n\t_bringToFront: function (layer) {\n\t\tvar order = layer._order;\n\n\t\tif (!order) { return; }\n\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else {\n\t\t\t// Already last\n\t\t\treturn;\n\t\t}\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else if (next) {\n\t\t\t// Update first entry unless this is the\n\t\t\t// single entry\n\t\t\tthis._drawFirst = next;\n\t\t}\n\n\t\torder.prev = this._drawLast;\n\t\tthis._drawLast.next = order;\n\n\t\torder.next = null;\n\t\tthis._drawLast = order;\n\n\t\tthis._requestRedraw(layer);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tvar order = layer._order;\n\n\t\tif (!order) { return; }\n\n\t\tvar next = order.next;\n\t\tvar prev = order.prev;\n\n\t\tif (prev) {\n\t\t\tprev.next = next;\n\t\t} else {\n\t\t\t// Already first\n\t\t\treturn;\n\t\t}\n\t\tif (next) {\n\t\t\tnext.prev = prev;\n\t\t} else if (prev) {\n\t\t\t// Update last entry unless this is the\n\t\t\t// single entry\n\t\t\tthis._drawLast = prev;\n\t\t}\n\n\t\torder.prev = null;\n\n\t\torder.next = this._drawFirst;\n\t\tthis._drawFirst.prev = order;\n\t\tthis._drawFirst = order;\n\n\t\tthis._requestRedraw(layer);\n\t}\n});\n\n// @factory L.canvas(options?: Renderer options)\n// Creates a Canvas renderer with the given options.\nexport function canvas(options) {\n\treturn Browser.canvas ? new Canvas(options) : null;\n}\n", "import * as DomUtil from '../../dom/DomUtil';\nimport * as Util from '../../core/Util';\nimport {Renderer} from './Renderer';\n\n/*\n * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!\n */\n\n\nexport var vmlCreate = (function () {\n\ttry {\n\t\tdocument.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');\n\t\treturn function (name) {\n\t\t\treturn document.createElement('<lvml:' + name + ' class=\"lvml\">');\n\t\t};\n\t} catch (e) {\n\t\t// Do not return fn from catch block so `e` can be garbage collected\n\t\t// See https://github.com/Leaflet/Leaflet/pull/7279\n\t}\n\treturn function (name) {\n\t\treturn document.createElement('<' + name + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">');\n\t};\n})();\n\n\n/*\n * @class SVG\n *\n *\n * VML was deprecated in 2012, which means VML functionality exists only for backwards compatibility\n * with old versions of Internet Explorer.\n */\n\n// mixin to redefine some SVG methods to handle VML syntax which is similar but with some differences\nexport var vmlMixin = {\n\n\t_initContainer: function () {\n\t\tthis._container = DomUtil.create('div', 'leaflet-vml-container');\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom) { return; }\n\t\tRenderer.prototype._update.call(this);\n\t\tthis.fire('update');\n\t},\n\n\t_initPath: function (layer) {\n\t\tvar container = layer._container = vmlCreate('shape');\n\n\t\tDomUtil.addClass(container, 'leaflet-vml-shape ' + (this.options.className || ''));\n\n\t\tcontainer.coordsize = '1 1';\n\n\t\tlayer._path = vmlCreate('path');\n\t\tcontainer.appendChild(layer._path);\n\n\t\tthis._updateStyle(layer);\n\t\tthis._layers[Util.stamp(layer)] = layer;\n\t},\n\n\t_addPath: function (layer) {\n\t\tvar container = layer._container;\n\t\tthis._container.appendChild(container);\n\n\t\tif (layer.options.interactive) {\n\t\t\tlayer.addInteractiveTarget(container);\n\t\t}\n\t},\n\n\t_removePath: function (layer) {\n\t\tvar container = layer._container;\n\t\tDomUtil.remove(container);\n\t\tlayer.removeInteractiveTarget(container);\n\t\tdelete this._layers[Util.stamp(layer)];\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tvar stroke = layer._stroke,\n\t\t    fill = layer._fill,\n\t\t    options = layer.options,\n\t\t    container = layer._container;\n\n\t\tcontainer.stroked = !!options.stroke;\n\t\tcontainer.filled = !!options.fill;\n\n\t\tif (options.stroke) {\n\t\t\tif (!stroke) {\n\t\t\t\tstroke = layer._stroke = vmlCreate('stroke');\n\t\t\t}\n\t\t\tcontainer.appendChild(stroke);\n\t\t\tstroke.weight = options.weight + 'px';\n\t\t\tstroke.color = options.color;\n\t\t\tstroke.opacity = options.opacity;\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tstroke.dashStyle = Util.isArray(options.dashArray) ?\n\t\t\t\t    options.dashArray.join(' ') :\n\t\t\t\t    options.dashArray.replace(/( *, *)/g, ' ');\n\t\t\t} else {\n\t\t\t\tstroke.dashStyle = '';\n\t\t\t}\n\t\t\tstroke.endcap = options.lineCap.replace('butt', 'flat');\n\t\t\tstroke.joinstyle = options.lineJoin;\n\n\t\t} else if (stroke) {\n\t\t\tcontainer.removeChild(stroke);\n\t\t\tlayer._stroke = null;\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tif (!fill) {\n\t\t\t\tfill = layer._fill = vmlCreate('fill');\n\t\t\t}\n\t\t\tcontainer.appendChild(fill);\n\t\t\tfill.color = options.fillColor || options.color;\n\t\t\tfill.opacity = options.fillOpacity;\n\n\t\t} else if (fill) {\n\t\t\tcontainer.removeChild(fill);\n\t\t\tlayer._fill = null;\n\t\t}\n\t},\n\n\t_updateCircle: function (layer) {\n\t\tvar p = layer._point.round(),\n\t\t    r = Math.round(layer._radius),\n\t\t    r2 = Math.round(layer._radiusY || r);\n\n\t\tthis._setPath(layer, layer._empty() ? 'M0 0' :\n\t\t\t'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360));\n\t},\n\n\t_setPath: function (layer, path) {\n\t\tlayer._path.v = path;\n\t},\n\n\t_bringToFront: function (layer) {\n\t\tDomUtil.toFront(layer._container);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tDomUtil.toBack(layer._container);\n\t}\n};\n", "import {Renderer} from './Renderer';\nimport * as DomUtil from '../../dom/DomUtil';\nimport * as DomEvent from '../../dom/DomEvent';\nimport Browser from '../../core/Browser';\nimport {stamp} from '../../core/Util';\nimport {svgCreate, pointsToPath} from './SVG.Util';\nexport {pointsToPath};\nimport {vmlMixin, vmlCreate} from './SVG.VML';\n\nexport var create = Browser.vml ? vmlCreate : svgCreate;\n\n/*\n * @class SVG\n * @inherits Renderer\n * @aka L.SVG\n *\n * Allows vector layers to be displayed with [SVG](https://developer.mozilla.org/docs/Web/SVG).\n * Inherits `Renderer`.\n *\n * Due to [technical limitations](https://caniuse.com/svg), SVG is not\n * available in all web browsers, notably Android 2.x and 3.x.\n *\n * Although SVG is not available on IE7 and IE8, these browsers support\n * [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language)\n * (a now deprecated technology), and the SVG renderer will fall back to VML in\n * this case.\n *\n * @example\n *\n * Use SVG by default for all paths in the map:\n *\n * ```js\n * var map = L.map('map', {\n * \trenderer: L.svg()\n * });\n * ```\n *\n * Use a SVG renderer with extra padding for specific vector geometries:\n *\n * ```js\n * var map = L.map('map');\n * var myRenderer = L.svg({ padding: 0.5 });\n * var line = L.polyline( coordinates, { renderer: myRenderer } );\n * var circle = L.circle( center, { renderer: myRenderer } );\n * ```\n */\n\nexport var SVG = Renderer.extend({\n\n\t_initContainer: function () {\n\t\tthis._container = create('svg');\n\n\t\t// makes it possible to click through svg root; we'll reset it back in individual paths\n\t\tthis._container.setAttribute('pointer-events', 'none');\n\n\t\tthis._rootGroup = create('g');\n\t\tthis._container.appendChild(this._rootGroup);\n\t},\n\n\t_destroyContainer: function () {\n\t\tDomUtil.remove(this._container);\n\t\tDomEvent.off(this._container);\n\t\tdelete this._container;\n\t\tdelete this._rootGroup;\n\t\tdelete this._svgSize;\n\t},\n\n\t_update: function () {\n\t\tif (this._map._animatingZoom && this._bounds) { return; }\n\n\t\tRenderer.prototype._update.call(this);\n\n\t\tvar b = this._bounds,\n\t\t    size = b.getSize(),\n\t\t    container = this._container;\n\n\t\t// set size of svg-container if changed\n\t\tif (!this._svgSize || !this._svgSize.equals(size)) {\n\t\t\tthis._svgSize = size;\n\t\t\tcontainer.setAttribute('width', size.x);\n\t\t\tcontainer.setAttribute('height', size.y);\n\t\t}\n\n\t\t// movement: update container viewBox so that we don't have to change coordinates of individual layers\n\t\tDomUtil.setPosition(container, b.min);\n\t\tcontainer.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' '));\n\n\t\tthis.fire('update');\n\t},\n\n\t// methods below are called by vector layers implementations\n\n\t_initPath: function (layer) {\n\t\tvar path = layer._path = create('path');\n\n\t\t// @namespace Path\n\t\t// @option className: String = null\n\t\t// Custom class name set on an element. Only for SVG renderer.\n\t\tif (layer.options.className) {\n\t\t\tDomUtil.addClass(path, layer.options.className);\n\t\t}\n\n\t\tif (layer.options.interactive) {\n\t\t\tDomUtil.addClass(path, 'leaflet-interactive');\n\t\t}\n\n\t\tthis._updateStyle(layer);\n\t\tthis._layers[stamp(layer)] = layer;\n\t},\n\n\t_addPath: function (layer) {\n\t\tif (!this._rootGroup) { this._initContainer(); }\n\t\tthis._rootGroup.appendChild(layer._path);\n\t\tlayer.addInteractiveTarget(layer._path);\n\t},\n\n\t_removePath: function (layer) {\n\t\tDomUtil.remove(layer._path);\n\t\tlayer.removeInteractiveTarget(layer._path);\n\t\tdelete this._layers[stamp(layer)];\n\t},\n\n\t_updatePath: function (layer) {\n\t\tlayer._project();\n\t\tlayer._update();\n\t},\n\n\t_updateStyle: function (layer) {\n\t\tvar path = layer._path,\n\t\t    options = layer.options;\n\n\t\tif (!path) { return; }\n\n\t\tif (options.stroke) {\n\t\t\tpath.setAttribute('stroke', options.color);\n\t\t\tpath.setAttribute('stroke-opacity', options.opacity);\n\t\t\tpath.setAttribute('stroke-width', options.weight);\n\t\t\tpath.setAttribute('stroke-linecap', options.lineCap);\n\t\t\tpath.setAttribute('stroke-linejoin', options.lineJoin);\n\n\t\t\tif (options.dashArray) {\n\t\t\t\tpath.setAttribute('stroke-dasharray', options.dashArray);\n\t\t\t} else {\n\t\t\t\tpath.removeAttribute('stroke-dasharray');\n\t\t\t}\n\n\t\t\tif (options.dashOffset) {\n\t\t\t\tpath.setAttribute('stroke-dashoffset', options.dashOffset);\n\t\t\t} else {\n\t\t\t\tpath.removeAttribute('stroke-dashoffset');\n\t\t\t}\n\t\t} else {\n\t\t\tpath.setAttribute('stroke', 'none');\n\t\t}\n\n\t\tif (options.fill) {\n\t\t\tpath.setAttribute('fill', options.fillColor || options.color);\n\t\t\tpath.setAttribute('fill-opacity', options.fillOpacity);\n\t\t\tpath.setAttribute('fill-rule', options.fillRule || 'evenodd');\n\t\t} else {\n\t\t\tpath.setAttribute('fill', 'none');\n\t\t}\n\t},\n\n\t_updatePoly: function (layer, closed) {\n\t\tthis._setPath(layer, pointsToPath(layer._parts, closed));\n\t},\n\n\t_updateCircle: function (layer) {\n\t\tvar p = layer._point,\n\t\t    r = Math.max(Math.round(layer._radius), 1),\n\t\t    r2 = Math.max(Math.round(layer._radiusY), 1) || r,\n\t\t    arc = 'a' + r + ',' + r2 + ' 0 1,0 ';\n\n\t\t// drawing a circle with two half-arcs\n\t\tvar d = layer._empty() ? 'M0 0' :\n\t\t\t'M' + (p.x - r) + ',' + p.y +\n\t\t\tarc + (r * 2) + ',0 ' +\n\t\t\tarc + (-r * 2) + ',0 ';\n\n\t\tthis._setPath(layer, d);\n\t},\n\n\t_setPath: function (layer, path) {\n\t\tlayer._path.setAttribute('d', path);\n\t},\n\n\t// SVG does not have the concept of zIndex so we resort to changing the DOM order of elements\n\t_bringToFront: function (layer) {\n\t\tDomUtil.toFront(layer._path);\n\t},\n\n\t_bringToBack: function (layer) {\n\t\tDomUtil.toBack(layer._path);\n\t}\n});\n\nif (Browser.vml) {\n\tSVG.include(vmlMixin);\n}\n\n// @namespace SVG\n// @factory L.svg(options?: Renderer options)\n// Creates a SVG renderer with the given options.\nexport function svg(options) {\n\treturn Browser.svg || Browser.vml ? new SVG(options) : null;\n}\n", "import {Map} from '../../map/Map';\nimport {canvas} from './Canvas';\nimport {svg} from './SVG';\n\nMap.include({\n\t// @namespace Map; @method getRenderer(layer: Path): Renderer\n\t// Returns the instance of `Renderer` that should be used to render the given\n\t// `Path`. It will ensure that the `renderer` options of the map and paths\n\t// are respected, and that the renderers do exist on the map.\n\tgetRenderer: function (layer) {\n\t\t// @namespace Path; @option renderer: Renderer\n\t\t// Use this specific instance of `Renderer` for this path. Takes\n\t\t// precedence over the map's [default renderer](#map-renderer).\n\t\tvar renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer;\n\n\t\tif (!renderer) {\n\t\t\trenderer = this._renderer = this._createRenderer();\n\t\t}\n\n\t\tif (!this.hasLayer(renderer)) {\n\t\t\tthis.addLayer(renderer);\n\t\t}\n\t\treturn renderer;\n\t},\n\n\t_getPaneRenderer: function (name) {\n\t\tif (name === 'overlayPane' || name === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar renderer = this._paneRenderers[name];\n\t\tif (renderer === undefined) {\n\t\t\trenderer = this._createRenderer({pane: name});\n\t\t\tthis._paneRenderers[name] = renderer;\n\t\t}\n\t\treturn renderer;\n\t},\n\n\t_createRenderer: function (options) {\n\t\t// @namespace Map; @option preferCanvas: Boolean = false\n\t\t// Whether `Path`s should be rendered on a `Canvas` renderer.\n\t\t// By default, all `Path`s are rendered in a `SVG` renderer.\n\t\treturn (this.options.preferCanvas && canvas(options)) || svg(options);\n\t}\n});\n", "import {Polygon} from './Polygon';\nimport {toLatLngBounds} from '../../geo/LatLngBounds';\n\n/*\n * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.\n */\n\n/*\n * @class Rectangle\n * @aka L.Rectangle\n * @inherits Polygon\n *\n * A class for drawing rectangle overlays on a map. Extends `Polygon`.\n *\n * @example\n *\n * ```js\n * // define rectangle geographical bounds\n * var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];\n *\n * // create an orange rectangle\n * L.rectangle(bounds, {color: \"#ff7800\", weight: 1}).addTo(map);\n *\n * // zoom the map to the rectangle bounds\n * map.fitBounds(bounds);\n * ```\n *\n */\n\n\nexport var Rectangle = Polygon.extend({\n\tinitialize: function (latLngBounds, options) {\n\t\tPolygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);\n\t},\n\n\t// @method setBounds(latLngBounds: LatLngBounds): this\n\t// Redraws the rectangle with the passed bounds.\n\tsetBounds: function (latLngBounds) {\n\t\treturn this.setLatLngs(this._boundsToLatLngs(latLngBounds));\n\t},\n\n\t_boundsToLatLngs: function (latLngBounds) {\n\t\tlatLngBounds = toLatLngBounds(latLngBounds);\n\t\treturn [\n\t\t\tlatLngBounds.getSouthWest(),\n\t\t\tlatLngBounds.getNorthWest(),\n\t\t\tlatLngBounds.getNorthEast(),\n\t\t\tlatLngBounds.getSouthEast()\n\t\t];\n\t}\n});\n\n\n// @factory L.rectangle(latLngBounds: LatLngBounds, options?: Polyline options)\nexport function rectangle(latLngBounds, options) {\n\treturn new Rectangle(latLngBounds, options);\n}\n", "export {Renderer} from './Renderer';\nexport {Canvas, canvas} from './Canvas';\nimport {SVG, create, pointsToPath, svg} from './SVG';\nSVG.create = create;\nSVG.pointsToPath = pointsToPath;\nexport {SVG, svg};\nimport './Renderer.getRenderer';\t// This is a bit of a hack, but needed because circular dependencies\n\nexport {Path} from './Path';\nexport {CircleMarker, circleMarker} from './CircleMarker';\nexport {Circle, circle} from './Circle';\nexport {Polyline, polyline} from './Polyline';\nexport {Polygon, polygon} from './Polygon';\nexport {Rectangle, rectangle} from './Rectangle';\n", "export {Layer} from './Layer';\nexport {LayerGroup, layerGroup} from './LayerGroup';\nexport {FeatureGroup, featureGroup} from './FeatureGroup';\nimport {GeoJSON, geoJSON, geoJson, geometryToLayer, coordsToLatLng, coordsToLatLngs, latLngToCoords, latLngsToCoords, getFeature, asFeature} from './GeoJSON';\nGeoJSON.geometryToLayer = geometryToLayer;\nGeoJSON.coordsToLatLng = coordsToLatLng;\nGeoJSON.coordsToLatLngs = coordsToLatLngs;\nGeoJSON.latLngToCoords = latLngToCoords;\nGeoJSON.latLngsToCoords = latLngsToCoords;\nGeoJSON.getFeature = getFeature;\nGeoJSON.asFeature = asFeature;\nexport {GeoJSON, geoJSON, geoJson};\n\nexport {ImageOverlay, imageOverlay} from './ImageOverlay';\nexport {VideoOverlay, videoOverlay} from './VideoOverlay';\nexport {SVGOverlay, svgOverlay} from './SVGOverlay';\n\nexport {DivOverlay} from './DivOverlay';\nexport {Popup, popup} from './Popup';\nexport {Tooltip, tooltip} from './Tooltip';\n\nexport * from './marker/index';\nexport * from './tile/index';\nexport * from './vector/index';\n", "import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport * as Util from '../../core/Util';\nimport * as DomUtil from '../../dom/DomUtil';\nimport * as DomEvent from '../../dom/DomEvent';\nimport {LatLngBounds} from '../../geo/LatLngBounds';\nimport {Bounds} from '../../geometry/Bounds';\n\n/*\n * L.Handler.BoxZoom is used to add shift-drag zoom interaction to the map\n * (zoom to a selected bounding box), enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\nMap.mergeOptions({\n\t// @option boxZoom: Boolean = true\n\t// Whether the map can be zoomed to a rectangular area specified by\n\t// dragging the mouse while pressing the shift key.\n\tboxZoom: true\n});\n\nexport var BoxZoom = Handler.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t\tthis._container = map._container;\n\t\tthis._pane = map._panes.overlayPane;\n\t\tthis._resetStateTimeout = 0;\n\t\tmap.on('unload', this._destroy, this);\n\t},\n\n\taddHooks: function () {\n\t\tDomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tDomEvent.off(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tmoved: function () {\n\t\treturn this._moved;\n\t},\n\n\t_destroy: function () {\n\t\tDomUtil.remove(this._pane);\n\t\tdelete this._pane;\n\t},\n\n\t_resetState: function () {\n\t\tthis._resetStateTimeout = 0;\n\t\tthis._moved = false;\n\t},\n\n\t_clearDeferredResetState: function () {\n\t\tif (this._resetStateTimeout !== 0) {\n\t\t\tclearTimeout(this._resetStateTimeout);\n\t\t\tthis._resetStateTimeout = 0;\n\t\t}\n\t},\n\n\t_onMouseDown: function (e) {\n\t\tif (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n\t\t// Clear the deferred resetState if it hasn't executed yet, otherwise it\n\t\t// will interrupt the interaction and orphan a box element in the container.\n\t\tthis._clearDeferredResetState();\n\t\tthis._resetState();\n\n\t\tDomUtil.disableTextSelection();\n\t\tDomUtil.disableImageDrag();\n\n\t\tthis._startPoint = this._map.mouseEventToContainerPoint(e);\n\n\t\tDomEvent.on(document, {\n\t\t\tcontextmenu: DomEvent.stop,\n\t\t\tmousemove: this._onMouseMove,\n\t\t\tmouseup: this._onMouseUp,\n\t\t\tkeydown: this._onKeyDown\n\t\t}, this);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._moved) {\n\t\t\tthis._moved = true;\n\n\t\t\tthis._box = DomUtil.create('div', 'leaflet-zoom-box', this._container);\n\t\t\tDomUtil.addClass(this._container, 'leaflet-crosshair');\n\n\t\t\tthis._map.fire('boxzoomstart');\n\t\t}\n\n\t\tthis._point = this._map.mouseEventToContainerPoint(e);\n\n\t\tvar bounds = new Bounds(this._point, this._startPoint),\n\t\t    size = bounds.getSize();\n\n\t\tDomUtil.setPosition(this._box, bounds.min);\n\n\t\tthis._box.style.width  = size.x + 'px';\n\t\tthis._box.style.height = size.y + 'px';\n\t},\n\n\t_finish: function () {\n\t\tif (this._moved) {\n\t\t\tDomUtil.remove(this._box);\n\t\t\tDomUtil.removeClass(this._container, 'leaflet-crosshair');\n\t\t}\n\n\t\tDomUtil.enableTextSelection();\n\t\tDomUtil.enableImageDrag();\n\n\t\tDomEvent.off(document, {\n\t\t\tcontextmenu: DomEvent.stop,\n\t\t\tmousemove: this._onMouseMove,\n\t\t\tmouseup: this._onMouseUp,\n\t\t\tkeydown: this._onKeyDown\n\t\t}, this);\n\t},\n\n\t_onMouseUp: function (e) {\n\t\tif ((e.which !== 1) && (e.button !== 1)) { return; }\n\n\t\tthis._finish();\n\n\t\tif (!this._moved) { return; }\n\t\t// Postpone to next JS tick so internal click event handling\n\t\t// still see it as \"moved\".\n\t\tthis._clearDeferredResetState();\n\t\tthis._resetStateTimeout = setTimeout(Util.bind(this._resetState, this), 0);\n\n\t\tvar bounds = new LatLngBounds(\n\t\t        this._map.containerPointToLatLng(this._startPoint),\n\t\t        this._map.containerPointToLatLng(this._point));\n\n\t\tthis._map\n\t\t\t.fitBounds(bounds)\n\t\t\t.fire('boxzoomend', {boxZoomBounds: bounds});\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.keyCode === 27) {\n\t\t\tthis._finish();\n\t\t\tthis._clearDeferredResetState();\n\t\t\tthis._resetState();\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property boxZoom: Handler\n// Box (shift-drag with mouse) zoom handler.\nMap.addInitHook('addHandler', 'boxZoom', BoxZoom);\n", "import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\n\n/*\n * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\n\nMap.mergeOptions({\n\t// @option doubleClickZoom: Boolean|String = true\n\t// Whether the map can be zoomed in by double clicking on it and\n\t// zoomed out by double clicking while holding shift. If passed\n\t// `'center'`, double-click zoom will zoom to the center of the\n\t//  view regardless of where the mouse was.\n\tdoubleClickZoom: true\n});\n\nexport var DoubleClickZoom = Handler.extend({\n\taddHooks: function () {\n\t\tthis._map.on('dblclick', this._onDoubleClick, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._map.off('dblclick', this._onDoubleClick, this);\n\t},\n\n\t_onDoubleClick: function (e) {\n\t\tvar map = this._map,\n\t\t    oldZoom = map.getZoom(),\n\t\t    delta = map.options.zoomDelta,\n\t\t    zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta;\n\n\t\tif (map.options.doubleClickZoom === 'center') {\n\t\t\tmap.setZoom(zoom);\n\t\t} else {\n\t\t\tmap.setZoomAround(e.containerPoint, zoom);\n\t\t}\n\t}\n});\n\n// @section Handlers\n//\n// Map properties include interaction handlers that allow you to control\n// interaction behavior in runtime, enabling or disabling certain features such\n// as dragging or touch zoom (see `Handler` methods). For example:\n//\n// ```js\n// map.doubleClickZoom.disable();\n// ```\n//\n// @property doubleClickZoom: Handler\n// Double click zoom handler.\nMap.addInitHook('addHandler', 'doubleClickZoom', DoubleClickZoom);\n", "import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport {Draggable} from '../../dom/Draggable';\nimport * as Util from '../../core/Util';\nimport * as DomUtil from '../../dom/DomUtil';\nimport {toLatLngBounds as latLngBounds} from '../../geo/LatLngBounds';\nimport {toBounds} from '../../geometry/Bounds';\n\n/*\n * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.\n */\n\n// @namespace Map\n// @section Interaction Options\nMap.mergeOptions({\n\t// @option dragging: Boolean = true\n\t// Whether the map is draggable with mouse/touch or not.\n\tdragging: true,\n\n\t// @section Panning Inertia Options\n\t// @option inertia: Boolean = *\n\t// If enabled, panning of the map will have an inertia effect where\n\t// the map builds momentum while dragging and continues moving in\n\t// the same direction for some time. Feels especially nice on touch\n\t// devices. Enabled by default.\n\tinertia: true,\n\n\t// @option inertiaDeceleration: Number = 3000\n\t// The rate with which the inertial movement slows down, in pixels/second².\n\tinertiaDeceleration: 3400, // px/s^2\n\n\t// @option inertiaMaxSpeed: Number = Infinity\n\t// Max speed of the inertial movement, in pixels/second.\n\tinertiaMaxSpeed: Infinity, // px/s\n\n\t// @option easeLinearity: Number = 0.2\n\teaseLinearity: 0.2,\n\n\t// TODO refactor, move to CRS\n\t// @option worldCopyJump: Boolean = false\n\t// With this option enabled, the map tracks when you pan to another \"copy\"\n\t// of the world and seamlessly jumps to the original one so that all overlays\n\t// like markers and vector layers are still visible.\n\tworldCopyJump: false,\n\n\t// @option maxBoundsViscosity: Number = 0.0\n\t// If `maxBounds` is set, this option will control how solid the bounds\n\t// are when dragging the map around. The default value of `0.0` allows the\n\t// user to drag outside the bounds at normal speed, higher values will\n\t// slow down map dragging outside bounds, and `1.0` makes the bounds fully\n\t// solid, preventing the user from dragging outside the bounds.\n\tmaxBoundsViscosity: 0.0\n});\n\nexport var Drag = Handler.extend({\n\taddHooks: function () {\n\t\tif (!this._draggable) {\n\t\t\tvar map = this._map;\n\n\t\t\tthis._draggable = new Draggable(map._mapPane, map._container);\n\n\t\t\tthis._draggable.on({\n\t\t\t\tdragstart: this._onDragStart,\n\t\t\t\tdrag: this._onDrag,\n\t\t\t\tdragend: this._onDragEnd\n\t\t\t}, this);\n\n\t\t\tthis._draggable.on('predrag', this._onPreDragLimit, this);\n\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\tthis._draggable.on('predrag', this._onPreDragWrap, this);\n\t\t\t\tmap.on('zoomend', this._onZoomEnd, this);\n\n\t\t\t\tmap.whenReady(this._onZoomEnd, this);\n\t\t\t}\n\t\t}\n\t\tDomUtil.addClass(this._map._container, 'leaflet-grab leaflet-touch-drag');\n\t\tthis._draggable.enable();\n\t\tthis._positions = [];\n\t\tthis._times = [];\n\t},\n\n\tremoveHooks: function () {\n\t\tDomUtil.removeClass(this._map._container, 'leaflet-grab');\n\t\tDomUtil.removeClass(this._map._container, 'leaflet-touch-drag');\n\t\tthis._draggable.disable();\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\tmoving: function () {\n\t\treturn this._draggable && this._draggable._moving;\n\t},\n\n\t_onDragStart: function () {\n\t\tvar map = this._map;\n\n\t\tmap._stop();\n\t\tif (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) {\n\t\t\tvar bounds = latLngBounds(this._map.options.maxBounds);\n\n\t\t\tthis._offsetLimit = toBounds(\n\t\t\t\tthis._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1),\n\t\t\t\tthis._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1)\n\t\t\t\t\t.add(this._map.getSize()));\n\n\t\t\tthis._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity));\n\t\t} else {\n\t\t\tthis._offsetLimit = null;\n\t\t}\n\n\t\tmap\n\t\t    .fire('movestart')\n\t\t    .fire('dragstart');\n\n\t\tif (map.options.inertia) {\n\t\t\tthis._positions = [];\n\t\t\tthis._times = [];\n\t\t}\n\t},\n\n\t_onDrag: function (e) {\n\t\tif (this._map.options.inertia) {\n\t\t\tvar time = this._lastTime = +new Date(),\n\t\t\t    pos = this._lastPos = this._draggable._absPos || this._draggable._newPos;\n\n\t\t\tthis._positions.push(pos);\n\t\t\tthis._times.push(time);\n\n\t\t\tthis._prunePositions(time);\n\t\t}\n\n\t\tthis._map\n\t\t    .fire('move', e)\n\t\t    .fire('drag', e);\n\t},\n\n\t_prunePositions: function (time) {\n\t\twhile (this._positions.length > 1 && time - this._times[0] > 50) {\n\t\t\tthis._positions.shift();\n\t\t\tthis._times.shift();\n\t\t}\n\t},\n\n\t_onZoomEnd: function () {\n\t\tvar pxCenter = this._map.getSize().divideBy(2),\n\t\t    pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);\n\n\t\tthis._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;\n\t\tthis._worldWidth = this._map.getPixelWorldBounds().getSize().x;\n\t},\n\n\t_viscousLimit: function (value, threshold) {\n\t\treturn value - (value - threshold) * this._viscosity;\n\t},\n\n\t_onPreDragLimit: function () {\n\t\tif (!this._viscosity || !this._offsetLimit) { return; }\n\n\t\tvar offset = this._draggable._newPos.subtract(this._draggable._startPos);\n\n\t\tvar limit = this._offsetLimit;\n\t\tif (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); }\n\t\tif (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); }\n\t\tif (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); }\n\t\tif (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); }\n\n\t\tthis._draggable._newPos = this._draggable._startPos.add(offset);\n\t},\n\n\t_onPreDragWrap: function () {\n\t\t// TODO refactor to be able to adjust map pane position after zoom\n\t\tvar worldWidth = this._worldWidth,\n\t\t    halfWidth = Math.round(worldWidth / 2),\n\t\t    dx = this._initialWorldOffset,\n\t\t    x = this._draggable._newPos.x,\n\t\t    newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,\n\t\t    newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,\n\t\t    newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;\n\n\t\tthis._draggable._absPos = this._draggable._newPos.clone();\n\t\tthis._draggable._newPos.x = newX;\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tvar map = this._map,\n\t\t    options = map.options,\n\n\t\t    noInertia = !options.inertia || e.noInertia || this._times.length < 2;\n\n\t\tmap.fire('dragend', e);\n\n\t\tif (noInertia) {\n\t\t\tmap.fire('moveend');\n\n\t\t} else {\n\t\t\tthis._prunePositions(+new Date());\n\n\t\t\tvar direction = this._lastPos.subtract(this._positions[0]),\n\t\t\t    duration = (this._lastTime - this._times[0]) / 1000,\n\t\t\t    ease = options.easeLinearity,\n\n\t\t\t    speedVector = direction.multiplyBy(ease / duration),\n\t\t\t    speed = speedVector.distanceTo([0, 0]),\n\n\t\t\t    limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n\t\t\t    limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n\t\t\t    decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),\n\t\t\t    offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n\t\t\tif (!offset.x && !offset.y) {\n\t\t\t\tmap.fire('moveend');\n\n\t\t\t} else {\n\t\t\t\toffset = map._limitOffset(offset, map.options.maxBounds);\n\n\t\t\t\tUtil.requestAnimFrame(function () {\n\t\t\t\t\tmap.panBy(offset, {\n\t\t\t\t\t\tduration: decelerationDuration,\n\t\t\t\t\t\teaseLinearity: ease,\n\t\t\t\t\t\tnoMoveStart: true,\n\t\t\t\t\t\tanimate: true\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property dragging: Handler\n// Map dragging handler (by both mouse and touch).\nMap.addInitHook('addHandler', 'dragging', Drag);\n", "import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport {on, off, stop} from '../../dom/DomEvent';\nimport {toPoint} from '../../geometry/Point';\n\n\n/*\n * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.\n */\n\n// @namespace Map\n// @section Keyboard Navigation Options\nMap.mergeOptions({\n\t// @option keyboard: Boolean = true\n\t// Makes the map focusable and allows users to navigate the map with keyboard\n\t// arrows and `+`/`-` keys.\n\tkeyboard: true,\n\n\t// @option keyboardPanDelta: Number = 80\n\t// Amount of pixels to pan when pressing an arrow key.\n\tkeyboardPanDelta: 80\n});\n\nexport var Keyboard = Handler.extend({\n\n\tkeyCodes: {\n\t\tleft:    [37],\n\t\tright:   [39],\n\t\tdown:    [40],\n\t\tup:      [38],\n\t\tzoomIn:  [187, 107, 61, 171],\n\t\tzoomOut: [189, 109, 54, 173]\n\t},\n\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\n\t\tthis._setPanDelta(map.options.keyboardPanDelta);\n\t\tthis._setZoomDelta(map.options.zoomDelta);\n\t},\n\n\taddHooks: function () {\n\t\tvar container = this._map._container;\n\n\t\t// make the container focusable by tabbing\n\t\tif (container.tabIndex <= 0) {\n\t\t\tcontainer.tabIndex = '0';\n\t\t}\n\n\t\ton(container, {\n\t\t\tfocus: this._onFocus,\n\t\t\tblur: this._onBlur,\n\t\t\tmousedown: this._onMouseDown\n\t\t}, this);\n\n\t\tthis._map.on({\n\t\t\tfocus: this._addHooks,\n\t\t\tblur: this._removeHooks\n\t\t}, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._removeHooks();\n\n\t\toff(this._map._container, {\n\t\t\tfocus: this._onFocus,\n\t\t\tblur: this._onBlur,\n\t\t\tmousedown: this._onMouseDown\n\t\t}, this);\n\n\t\tthis._map.off({\n\t\t\tfocus: this._addHooks,\n\t\t\tblur: this._removeHooks\n\t\t}, this);\n\t},\n\n\t_onMouseDown: function () {\n\t\tif (this._focused) { return; }\n\n\t\tvar body = document.body,\n\t\t    docEl = document.documentElement,\n\t\t    top = body.scrollTop || docEl.scrollTop,\n\t\t    left = body.scrollLeft || docEl.scrollLeft;\n\n\t\tthis._map._container.focus();\n\n\t\twindow.scrollTo(left, top);\n\t},\n\n\t_onFocus: function () {\n\t\tthis._focused = true;\n\t\tthis._map.fire('focus');\n\t},\n\n\t_onBlur: function () {\n\t\tthis._focused = false;\n\t\tthis._map.fire('blur');\n\t},\n\n\t_setPanDelta: function (panDelta) {\n\t\tvar keys = this._panKeys = {},\n\t\t    codes = this.keyCodes,\n\t\t    i, len;\n\n\t\tfor (i = 0, len = codes.left.length; i < len; i++) {\n\t\t\tkeys[codes.left[i]] = [-1 * panDelta, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.right.length; i < len; i++) {\n\t\t\tkeys[codes.right[i]] = [panDelta, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.down.length; i < len; i++) {\n\t\t\tkeys[codes.down[i]] = [0, panDelta];\n\t\t}\n\t\tfor (i = 0, len = codes.up.length; i < len; i++) {\n\t\t\tkeys[codes.up[i]] = [0, -1 * panDelta];\n\t\t}\n\t},\n\n\t_setZoomDelta: function (zoomDelta) {\n\t\tvar keys = this._zoomKeys = {},\n\t\t    codes = this.keyCodes,\n\t\t    i, len;\n\n\t\tfor (i = 0, len = codes.zoomIn.length; i < len; i++) {\n\t\t\tkeys[codes.zoomIn[i]] = zoomDelta;\n\t\t}\n\t\tfor (i = 0, len = codes.zoomOut.length; i < len; i++) {\n\t\t\tkeys[codes.zoomOut[i]] = -zoomDelta;\n\t\t}\n\t},\n\n\t_addHooks: function () {\n\t\ton(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_removeHooks: function () {\n\t\toff(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.altKey || e.ctrlKey || e.metaKey) { return; }\n\n\t\tvar key = e.keyCode,\n\t\t    map = this._map,\n\t\t    offset;\n\n\t\tif (key in this._panKeys) {\n\t\t\tif (!map._panAnim || !map._panAnim._inProgress) {\n\t\t\t\toffset = this._panKeys[key];\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\toffset = toPoint(offset).multiplyBy(3);\n\t\t\t\t}\n\n\t\t\t\tif (map.options.maxBounds) {\n\t\t\t\t\toffset = map._limitOffset(toPoint(offset), map.options.maxBounds);\n\t\t\t\t}\n\n\t\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\t\tvar newLatLng = map.wrapLatLng(map.unproject(map.project(map.getCenter()).add(offset)));\n\t\t\t\t\tmap.panTo(newLatLng);\n\t\t\t\t} else {\n\t\t\t\t\tmap.panBy(offset);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (key in this._zoomKeys) {\n\t\t\tmap.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]);\n\n\t\t} else if (key === 27 && map._popup && map._popup.options.closeOnEscapeKey) {\n\t\t\tmap.closePopup();\n\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tstop(e);\n\t}\n});\n\n// @section Handlers\n// @section Handlers\n// @property keyboard: Handler\n// Keyboard navigation handler.\nMap.addInitHook('addHandler', 'keyboard', Keyboard);\n", "import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport * as DomEvent from '../../dom/DomEvent';\nimport * as Util from '../../core/Util';\n\n/*\n * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.\n */\n\n// @namespace Map\n// @section Interaction Options\nMap.mergeOptions({\n\t// @section Mouse wheel options\n\t// @option scrollWheelZoom: Boolean|String = true\n\t// Whether the map can be zoomed by using the mouse wheel. If passed `'center'`,\n\t// it will zoom to the center of the view regardless of where the mouse was.\n\tscrollWheelZoom: true,\n\n\t// @option wheelDebounceTime: Number = 40\n\t// Limits the rate at which a wheel can fire (in milliseconds). By default\n\t// user can't zoom via wheel more often than once per 40 ms.\n\twheelDebounceTime: 40,\n\n\t// @option wheelPxPerZoomLevel: Number = 60\n\t// How many scroll pixels (as reported by [L.DomEvent.getWheelDelta](#domevent-getwheeldelta))\n\t// mean a change of one full zoom level. Smaller values will make wheel-zooming\n\t// faster (and vice versa).\n\twheelPxPerZoomLevel: 60\n});\n\nexport var ScrollWheelZoom = Handler.extend({\n\taddHooks: function () {\n\t\tDomEvent.on(this._map._container, 'wheel', this._onWheelScroll, this);\n\n\t\tthis._delta = 0;\n\t},\n\n\tremoveHooks: function () {\n\t\tDomEvent.off(this._map._container, 'wheel', this._onWheelScroll, this);\n\t},\n\n\t_onWheelScroll: function (e) {\n\t\tvar delta = DomEvent.getWheelDelta(e);\n\n\t\tvar debounce = this._map.options.wheelDebounceTime;\n\n\t\tthis._delta += delta;\n\t\tthis._lastMousePos = this._map.mouseEventToContainerPoint(e);\n\n\t\tif (!this._startTime) {\n\t\t\tthis._startTime = +new Date();\n\t\t}\n\n\t\tvar left = Math.max(debounce - (+new Date() - this._startTime), 0);\n\n\t\tclearTimeout(this._timer);\n\t\tthis._timer = setTimeout(Util.bind(this._performZoom, this), left);\n\n\t\tDomEvent.stop(e);\n\t},\n\n\t_performZoom: function () {\n\t\tvar map = this._map,\n\t\t    zoom = map.getZoom(),\n\t\t    snap = this._map.options.zoomSnap || 0;\n\n\t\tmap._stop(); // stop panning and fly animations if any\n\n\t\t// map the delta with a sigmoid function to -4..4 range leaning on -1..1\n\t\tvar d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4),\n\t\t    d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2,\n\t\t    d4 = snap ? Math.ceil(d3 / snap) * snap : d3,\n\t\t    delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom;\n\n\t\tthis._delta = 0;\n\t\tthis._startTime = null;\n\n\t\tif (!delta) { return; }\n\n\t\tif (map.options.scrollWheelZoom === 'center') {\n\t\t\tmap.setZoom(zoom + delta);\n\t\t} else {\n\t\t\tmap.setZoomAround(this._lastMousePos, zoom + delta);\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property scrollWheelZoom: Handler\n// Scroll wheel zoom handler.\nMap.addInitHook('addHandler', 'scrollWheelZoom', ScrollWheelZoom);\n", "import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport * as DomEvent from '../../dom/DomEvent';\nimport {Point} from '../../geometry/Point';\nimport * as Util from '../../core/Util';\nimport Browser from '../../core/Browser';\n\n/*\n * L.Map.TapHold is used to simulate `contextmenu` event on long hold,\n * which otherwise is not fired by mobile Safari.\n */\n\nvar tapHoldDelay = 600;\n\n// @namespace Map\n// @section Interaction Options\nMap.mergeOptions({\n\t// @section Touch interaction options\n\t// @option tapHold: Boolean\n\t// Enables simulation of `contextmenu` event, default is `true` for mobile Safari.\n\ttapHold: Browser.touchNative && Browser.safari && Browser.mobile,\n\n\t// @option tapTolerance: Number = 15\n\t// The max number of pixels a user can shift his finger during touch\n\t// for it to be considered a valid tap.\n\ttapTolerance: 15\n});\n\nexport var TapHold = Handler.extend({\n\taddHooks: function () {\n\t\tDomEvent.on(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tDomEvent.off(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\t_onDown: function (e) {\n\t\tclearTimeout(this._holdTimeout);\n\t\tif (e.touches.length !== 1) { return; }\n\n\t\tvar first = e.touches[0];\n\t\tthis._startPos = this._newPos = new Point(first.clientX, first.clientY);\n\n\t\tthis._holdTimeout = setTimeout(Util.bind(function () {\n\t\t\tthis._cancel();\n\t\t\tif (!this._isTapValid()) { return; }\n\n\t\t\t// prevent simulated mouse events https://w3c.github.io/touch-events/#mouse-events\n\t\t\tDomEvent.on(document, 'touchend', DomEvent.preventDefault);\n\t\t\tDomEvent.on(document, 'touchend touchcancel', this._cancelClickPrevent);\n\t\t\tthis._simulateEvent('contextmenu', first);\n\t\t}, this), tapHoldDelay);\n\n\t\tDomEvent.on(document, 'touchend touchcancel contextmenu', this._cancel, this);\n\t\tDomEvent.on(document, 'touchmove', this._onMove, this);\n\t},\n\n\t_cancelClickPrevent: function cancelClickPrevent() {\n\t\tDomEvent.off(document, 'touchend', DomEvent.preventDefault);\n\t\tDomEvent.off(document, 'touchend touchcancel', cancelClickPrevent);\n\t},\n\n\t_cancel: function () {\n\t\tclearTimeout(this._holdTimeout);\n\t\tDomEvent.off(document, 'touchend touchcancel contextmenu', this._cancel, this);\n\t\tDomEvent.off(document, 'touchmove', this._onMove, this);\n\t},\n\n\t_onMove: function (e) {\n\t\tvar first = e.touches[0];\n\t\tthis._newPos = new Point(first.clientX, first.clientY);\n\t},\n\n\t_isTapValid: function () {\n\t\treturn this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;\n\t},\n\n\t_simulateEvent: function (type, e) {\n\t\tvar simulatedEvent = new MouseEvent(type, {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t\tview: window,\n\t\t\t// detail: 1,\n\t\t\tscreenX: e.screenX,\n\t\t\tscreenY: e.screenY,\n\t\t\tclientX: e.clientX,\n\t\t\tclientY: e.clientY,\n\t\t\t// button: 2,\n\t\t\t// buttons: 2\n\t\t});\n\n\t\tsimulatedEvent._simulated = true;\n\n\t\te.target.dispatchEvent(simulatedEvent);\n\t}\n});\n\n// @section Handlers\n// @property tapHold: Handler\n// Long tap handler to simulate `contextmenu` event (useful in mobile Safari).\nMap.addInitHook('addHandler', 'tapHold', TapHold);\n", "import {Map} from '../Map';\nimport {Handler} from '../../core/Handler';\nimport * as DomEvent from '../../dom/DomEvent';\nimport * as Util from '../../core/Util';\nimport * as DomUtil from '../../dom/DomUtil';\nimport Browser from '../../core/Browser';\n\n/*\n * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.\n */\n\n// @namespace Map\n// @section Interaction Options\nMap.mergeOptions({\n\t// @section Touch interaction options\n\t// @option touchZoom: Boolean|String = *\n\t// Whether the map can be zoomed by touch-dragging with two fingers. If\n\t// passed `'center'`, it will zoom to the center of the view regardless of\n\t// where the touch events (fingers) were. Enabled for touch-capable web\n\t// browsers.\n\ttouchZoom: Browser.touch,\n\n\t// @option bounceAtZoomLimits: Boolean = true\n\t// Set it to false if you don't want the map to zoom beyond min/max zoom\n\t// and then bounce back when pinch-zooming.\n\tbounceAtZoomLimits: true\n});\n\nexport var TouchZoom = Handler.extend({\n\taddHooks: function () {\n\t\tDomUtil.addClass(this._map._container, 'leaflet-touch-zoom');\n\t\tDomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tDomUtil.removeClass(this._map._container, 'leaflet-touch-zoom');\n\t\tDomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\t_onTouchStart: function (e) {\n\t\tvar map = this._map;\n\t\tif (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToContainerPoint(e.touches[0]),\n\t\t    p2 = map.mouseEventToContainerPoint(e.touches[1]);\n\n\t\tthis._centerPoint = map.getSize()._divideBy(2);\n\t\tthis._startLatLng = map.containerPointToLatLng(this._centerPoint);\n\t\tif (map.options.touchZoom !== 'center') {\n\t\t\tthis._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2));\n\t\t}\n\n\t\tthis._startDist = p1.distanceTo(p2);\n\t\tthis._startZoom = map.getZoom();\n\n\t\tthis._moved = false;\n\t\tthis._zooming = true;\n\n\t\tmap._stop();\n\n\t\tDomEvent.on(document, 'touchmove', this._onTouchMove, this);\n\t\tDomEvent.on(document, 'touchend touchcancel', this._onTouchEnd, this);\n\n\t\tDomEvent.preventDefault(e);\n\t},\n\n\t_onTouchMove: function (e) {\n\t\tif (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }\n\n\t\tvar map = this._map,\n\t\t    p1 = map.mouseEventToContainerPoint(e.touches[0]),\n\t\t    p2 = map.mouseEventToContainerPoint(e.touches[1]),\n\t\t    scale = p1.distanceTo(p2) / this._startDist;\n\n\t\tthis._zoom = map.getScaleZoom(scale, this._startZoom);\n\n\t\tif (!map.options.bounceAtZoomLimits && (\n\t\t\t(this._zoom < map.getMinZoom() && scale < 1) ||\n\t\t\t(this._zoom > map.getMaxZoom() && scale > 1))) {\n\t\t\tthis._zoom = map._limitZoom(this._zoom);\n\t\t}\n\n\t\tif (map.options.touchZoom === 'center') {\n\t\t\tthis._center = this._startLatLng;\n\t\t\tif (scale === 1) { return; }\n\t\t} else {\n\t\t\t// Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng\n\t\t\tvar delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint);\n\t\t\tif (scale === 1 && delta.x === 0 && delta.y === 0) { return; }\n\t\t\tthis._center = map.unproject(map.project(this._pinchStartLatLng, this._zoom).subtract(delta), this._zoom);\n\t\t}\n\n\t\tif (!this._moved) {\n\t\t\tmap._moveStart(true, false);\n\t\t\tthis._moved = true;\n\t\t}\n\n\t\tUtil.cancelAnimFrame(this._animRequest);\n\n\t\tvar moveFn = Util.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false}, undefined);\n\t\tthis._animRequest = Util.requestAnimFrame(moveFn, this, true);\n\n\t\tDomEvent.preventDefault(e);\n\t},\n\n\t_onTouchEnd: function () {\n\t\tif (!this._moved || !this._zooming) {\n\t\t\tthis._zooming = false;\n\t\t\treturn;\n\t\t}\n\n\t\tthis._zooming = false;\n\t\tUtil.cancelAnimFrame(this._animRequest);\n\n\t\tDomEvent.off(document, 'touchmove', this._onTouchMove, this);\n\t\tDomEvent.off(document, 'touchend touchcancel', this._onTouchEnd, this);\n\n\t\t// Pinch updates GridLayers' levels only when zoomSnap is off, so zoomSnap becomes noUpdate.\n\t\tif (this._map.options.zoomAnimation) {\n\t\t\tthis._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.zoomSnap);\n\t\t} else {\n\t\t\tthis._map._resetView(this._center, this._map._limitZoom(this._zoom));\n\t\t}\n\t}\n});\n\n// @section Handlers\n// @property touchZoom: Handler\n// Touch zoom handler.\nMap.addInitHook('addHandler', 'touchZoom', TouchZoom);\n", "import {Map} from './Map';\nimport {BoxZoom} from './handler/Map.BoxZoom';\nMap.BoxZoom = BoxZoom;\nimport {DoubleClickZoom} from './handler/Map.DoubleClickZoom';\nMap.DoubleClickZoom = DoubleClickZoom;\nimport {Drag} from './handler/Map.Drag';\nMap.Drag = Drag;\nimport {Keyboard} from './handler/Map.Keyboard';\nMap.Keyboard = Keyboard;\nimport {ScrollWheelZoom} from './handler/Map.ScrollWheelZoom';\nMap.ScrollWheelZoom = ScrollWheelZoom;\nimport {TapHold} from './handler/Map.TapHold';\nMap.TapHold = TapHold;\nimport {TouchZoom} from './handler/Map.TouchZoom';\nMap.TouchZoom = TouchZoom;\n\nexport {Map, createMap as map} from './Map';\n", "/** @license\n *\n *  Copyright (C) 2012 K. Arthur Endsley (kaendsle@mtu.edu)\n *  Michigan Tech Research Institute (MTRI)\n *  3600 Green Court, Suite 100, Ann Arbor, MI, 48105\n *\n *  This program is free software: you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 3 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU 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 <http://www.gnu.org/licenses/>.\n *\n */\n\n(function (root, factory) {\n\n    if (typeof define === \"function\" && define.amd) {\n        // AMD (+ global for extensions)\n        define(function () {\n            return factory();\n        });\n    } else if (typeof module !== 'undefined' && typeof exports === \"object\") {\n        // CommonJS\n        module.exports = factory();\n    } else {\n        // Browser\n        root.Wkt = factory();\n    }\n}(this, function () {\n\n\n    var beginsWith, endsWith, root, Wkt;\n\n    // Establish the root object, window in the browser, or exports on the server\n    root = this;\n\n    /**\n     * @desc The Wkt namespace.\n     * @property    {String}    delimiter   - The default delimiter for separating components of atomic geometry (coordinates)\n     * @namespace\n     * @global\n     */\n    Wkt = function (obj) {\n        if (obj instanceof Wkt) return obj;\n        if (!(this instanceof Wkt)) return new Wkt(obj);\n        this._wrapped = obj;\n    };\n\n\n\n    /**\n     * Returns true if the substring is found at the beginning of the string.\n     * @param   str {String}    The String to search\n     * @param   sub {String}    The substring of interest\n     * @return      {Boolean}\n     * @private\n     */\n    beginsWith = function (str, sub) {\n        return str.substring(0, sub.length) === sub;\n    };\n\n    /**\n     * Returns true if the substring is found at the end of the string.\n     * @param   str {String}    The String to search\n     * @param   sub {String}    The substring of interest\n     * @return      {Boolean}\n     * @private\n     */\n    endsWith = function (str, sub) {\n        return str.substring(str.length - sub.length) === sub;\n    };\n\n    /**\n     * The default delimiter for separating components of atomic geometry (coordinates)\n     * @ignore\n     */\n    Wkt.delimiter = ' ';\n\n    /**\n     * Determines whether or not the passed Object is an Array.\n     * @param   obj {Object}    The Object in question\n     * @return      {Boolean}\n     * @member Wkt.isArray\n     * @method\n     */\n    Wkt.isArray = function (obj) {\n        return !!(obj && obj.constructor === Array);\n    };\n\n    /**\n     * Removes given character String(s) from a String.\n     * @param   str {String}    The String to search\n     * @param   sub {String}    The String character(s) to trim\n     * @return      {String}    The trimmed string\n     * @member Wkt.trim\n     * @method\n     */\n    Wkt.trim = function (str, sub) {\n        sub = sub || ' '; // Defaults to trimming spaces\n        // Trim beginning spaces\n        while (beginsWith(str, sub)) {\n            str = str.substring(1);\n        }\n        // Trim ending spaces\n        while (endsWith(str, sub)) {\n            str = str.substring(0, str.length - 1);\n        }\n        return str;\n    };\n\n    /**\n     * An object for reading WKT strings and writing geographic features\n     * @constructor this.Wkt.Wkt\n     * @param   initializer {String}    An optional WKT string for immediate read\n     * @property            {Array}     components      - Holder for atomic geometry objects (internal representation of geometric components)\n     * @property            {String}    delimiter       - The default delimiter for separating components of atomic geometry (coordinates)\n     * @property            {Object}    regExes         - Some regular expressions copied from OpenLayers.Format.WKT.js\n     * @property            {String}    type            - The Well-Known Text name (e.g. 'point') of the geometry\n     * @property            {Boolean}   wrapVerticies   - True to wrap vertices in MULTIPOINT geometries; If true: MULTIPOINT((30 10),(10 30),(40 40)); If false: MULTIPOINT(30 10,10 30,40 40)\n     * @return              {this.Wkt.Wkt}\n     * @memberof Wkt\n     */\n    Wkt.Wkt = function (initializer) {\n\n        /**\n         * The default delimiter between X and Y coordinates.\n         * @ignore\n         */\n        this.delimiter = Wkt.delimiter || ' ';\n\n        /**\n         * Configuration parameter for controlling how Wicket seralizes\n         * MULTIPOINT strings. Examples; both are valid WKT:\n         * If true: MULTIPOINT((30 10),(10 30),(40 40))\n         * If false: MULTIPOINT(30 10,10 30,40 40)\n         * @ignore\n         */\n        this.wrapVertices = true;\n\n        /**\n         * Some regular expressions copied from OpenLayers.Format.WKT.js\n         * @ignore\n         */\n        this.regExes = {\n            'typeStr': /^\\s*(\\w+)\\s*\\(\\s*(.*)\\s*\\)\\s*$/,\n            'spaces': /\\s+|\\+/, // Matches the '+' or the empty space\n            'numeric': /-*\\d+(\\.*\\d+)?/,\n            'comma': /\\s*,\\s*/,\n            'parenComma': /\\)\\s*,\\s*\\(/,\n            'coord': /-*\\d+\\.*\\d+ -*\\d+\\.*\\d+/, // e.g. \"24 -14\"\n            'doubleParenComma': /\\)\\s*\\)\\s*,\\s*\\(\\s*\\(/,\n            'ogcTypes': /^(multi)?(point|line|polygon|box)?(string)?$/i, // Captures e.g. \"Multi\",\"Line\",\"String\"\n            'crudeJson': /^{.*\"(type|coordinates|geometries|features)\":.*}$/ // Attempts to recognize JSON strings\n        };\n\n        /**\n         * Strip any whitespace and parens from front and back.\n         * This is the equivalent of s/^\\s*\\(?(.*)\\)?\\s*$/$1/ but without the risk of catastrophic backtracking.\n         * @param   str {String}\n         */\n        this._stripWhitespaceAndParens = function (fullStr) {\n            var trimmed = fullStr.trim();\n            var noParens = trimmed.replace(/^\\(?(.*?)\\)?$/, '$1');\n            return noParens;\n        };\n\n        /**\n         * The internal representation of geometry--the \"components\" of geometry.\n         * @ignore\n         */\n        this.components = undefined;\n\n        // An initial WKT string may be provided\n        if (initializer && typeof initializer === 'string') {\n            this.read(initializer);\n        } else if (initializer && typeof initializer !== undefined) {\n            this.fromObject(initializer);\n        }\n\n    };\n\n\n\n    /**\n     * Returns true if the internal geometry is a collection of geometries.\n     * @return  {Boolean}   Returns true when it is a collection\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.isCollection = function () {\n        switch (this.type.slice(0, 5)) {\n            case 'multi':\n                // Trivial; any multi-geometry is a collection\n                return true;\n            case 'polyg':\n                // Polygons with holes are \"collections\" of rings\n                return true;\n            default:\n                // Any other geometry is not a collection\n                return false;\n        }\n    };\n\n    /**\n     * Compares two x,y coordinates for equality.\n     * @param   a   {Object}    An object with x and y properties\n     * @param   b   {Object}    An object with x and y properties\n     * @return      {Boolean}\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.sameCoords = function (a, b) {\n        return (a.x === b.x && a.y === b.y);\n    };\n\n    /**\n     * Sets internal geometry (components) from framework geometry (e.g.\n     * Google Polygon objects or google.maps.Polygon).\n     * @param   obj {Object}    The framework-dependent geometry representation\n     * @return      {this.Wkt.Wkt}   The object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.fromObject = function (obj) {\n        var result;\n\n        if (obj.hasOwnProperty('type') && obj.hasOwnProperty('coordinates')) {\n            result = this.fromJson(obj);\n        } else {\n            result = this.deconstruct.call(this, obj);\n        }\n\n        this.components = result.components;\n        this.isRectangle = result.isRectangle || false;\n        this.type = result.type;\n        return this;\n    };\n\n    /**\n     * Creates external geometry objects based on a plug-in framework's\n     * construction methods and available geometry classes.\n     * @param   config  {Object}    An optional framework-dependent properties specification\n     * @return          {Object}    The framework-dependent geometry representation\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.toObject = function (config) {\n        var obj = this.construct[this.type].call(this, config);\n        // Don't assign the \"properties\" property to an Array\n        if (typeof obj === 'object' && !Wkt.isArray(obj)) {\n            obj.properties = this.properties;\n        }\n        return obj;\n    };\n\n    /**\n     * Returns the WKT string representation; the same as the write() method.\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.toString = function (config) {\n        return this.write();\n    };\n\n    /**\n     * Parses a JSON representation as an Object.\n     * @param\tobj\t{Object}\tAn Object with the GeoJSON schema\n     * @return\t{this.Wkt.Wkt}\tThe object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.fromJson = function (obj) {\n        var i, j, k, coords, iring, oring;\n\n        this.type = obj.type.toLowerCase();\n        this.components = [];\n        if (obj.hasOwnProperty('geometry')) { //Feature\n            this.fromJson(obj.geometry);\n            this.properties = obj.properties;\n            return this;\n        }\n        coords = obj.coordinates;\n\n        if (!Wkt.isArray(coords[0])) { // Point\n            this.components.push({\n                x: coords[0],\n                y: coords[1]\n            });\n\n        } else {\n\n            for (i in coords) {\n                if (coords.hasOwnProperty(i)) {\n\n                    if (!Wkt.isArray(coords[i][0])) { // LineString\n\n                        if (this.type === 'multipoint') { // MultiPoint\n                            this.components.push([{\n                                x: coords[i][0],\n                                y: coords[i][1]\n                            }]);\n\n                        } else {\n                            this.components.push({\n                                x: coords[i][0],\n                                y: coords[i][1]\n                            });\n\n                        }\n\n                    } else {\n\n                        oring = [];\n                        for (j in coords[i]) {\n                            if (coords[i].hasOwnProperty(j)) {\n\n                                if (!Wkt.isArray(coords[i][j][0])) {\n                                    oring.push({\n                                        x: coords[i][j][0],\n                                        y: coords[i][j][1]\n                                    });\n\n                                } else {\n\n                                    iring = [];\n                                    for (k in coords[i][j]) {\n                                        if (coords[i][j].hasOwnProperty(k)) {\n\n                                            iring.push({\n                                                x: coords[i][j][k][0],\n                                                y: coords[i][j][k][1]\n                                            });\n\n                                        }\n                                    }\n\n                                    oring.push(iring);\n\n                                }\n\n                            }\n                        }\n\n                        this.components.push(oring);\n                    }\n                }\n            }\n\n        }\n\n        return this;\n    };\n\n    /**\n     * Creates a JSON representation, with the GeoJSON schema, of the geometry.\n     * @return    {Object}    The corresponding GeoJSON representation\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.toJson = function () {\n        var cs, json, i, j, k, ring, rings;\n\n        cs = this.components;\n        json = {\n            coordinates: [],\n            type: (function () {\n                var i, type, s;\n\n                type = this.regExes.ogcTypes.exec(this.type).slice(1);\n                s = [];\n\n                for (i in type) {\n                    if (type.hasOwnProperty(i)) {\n                        if (type[i] !== undefined) {\n                            s.push(type[i].toLowerCase().slice(0, 1).toUpperCase() + type[i].toLowerCase().slice(1));\n                        }\n                    }\n                }\n\n                return s;\n            }.call(this)).join('')\n        }\n\n        // Wkt BOX type gets a special bbox property in GeoJSON\n        if (this.type.toLowerCase() === 'box') {\n            json.type = 'Polygon';\n            json.bbox = [];\n\n            for (i in cs) {\n                if (cs.hasOwnProperty(i)) {\n                    json.bbox = json.bbox.concat([cs[i].x, cs[i].y]);\n                }\n            }\n\n            json.coordinates = [\n                [\n                    [cs[0].x, cs[0].y],\n                    [cs[0].x, cs[1].y],\n                    [cs[1].x, cs[1].y],\n                    [cs[1].x, cs[0].y],\n                    [cs[0].x, cs[0].y]\n                ]\n            ];\n\n            return json;\n        }\n\n        // For the coordinates of most simple features\n        for (i in cs) {\n            if (cs.hasOwnProperty(i)) {\n\n                // For those nested structures\n                if (Wkt.isArray(cs[i])) {\n                    rings = [];\n\n                    for (j in cs[i]) {\n                        if (cs[i].hasOwnProperty(j)) {\n\n                            if (Wkt.isArray(cs[i][j])) { // MULTIPOLYGONS\n                                ring = [];\n\n                                for (k in cs[i][j]) {\n                                    if (cs[i][j].hasOwnProperty(k)) {\n                                        ring.push([cs[i][j][k].x, cs[i][j][k].y]);\n                                    }\n                                }\n\n                                rings.push(ring);\n\n                            } else { // POLYGONS and MULTILINESTRINGS\n\n                                if (cs[i].length > 1) {\n                                    rings.push([cs[i][j].x, cs[i][j].y]);\n\n                                } else { // MULTIPOINTS\n                                    rings = rings.concat([cs[i][j].x, cs[i][j].y]);\n                                }\n                            }\n                        }\n                    }\n\n                    json.coordinates.push(rings);\n\n                } else {\n                    if (cs.length > 1) { // For LINESTRING type\n                        json.coordinates.push([cs[i].x, cs[i].y]);\n\n                    } else { // For POINT type\n                        json.coordinates = json.coordinates.concat([cs[i].x, cs[i].y]);\n                    }\n                }\n\n            }\n        }\n\n        return json;\n    };\n\n    /**\n     * Absorbs the geometry of another this.Wkt.Wkt instance, merging it with its own,\n     * creating a collection (MULTI-geometry) based on their types, which must agree.\n     * For example, creates a MULTIPOLYGON from a POLYGON type merged with another\n     * POLYGON type, or adds a POLYGON instance to a MULTIPOLYGON instance.\n     * @param   wkt {String}    A Wkt.Wkt object\n     * @return\t{this.Wkt.Wkt}\tThe object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.merge = function (wkt) {\n        var prefix = this.type.slice(0, 5);\n\n        if (this.type !== wkt.type) {\n            if (this.type.slice(5, this.type.length) !== wkt.type) {\n                throw TypeError('The input geometry types must agree or the calling this.Wkt.Wkt instance must be a multigeometry of the other');\n            }\n        }\n\n        switch (prefix) {\n\n            case 'point':\n                this.components = [this.components.concat(wkt.components)];\n                break;\n\n            case 'multi':\n                this.components = this.components.concat((wkt.type.slice(0, 5) === 'multi') ? wkt.components : [wkt.components]);\n                break;\n\n            default:\n                this.components = [\n                    this.components,\n                    wkt.components\n                ];\n                break;\n\n        }\n\n        if (prefix !== 'multi') {\n            this.type = 'multi' + this.type;\n        }\n        return this;\n    };\n\n    /**\n     * Reads a WKT string, validating and incorporating it.\n     * @param   str {String}    A WKT or GeoJSON string\n     * @return\t{this.Wkt.Wkt}\tThe object itself\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.read = function (str) {\n        var matches;\n        matches = this.regExes.typeStr.exec(str);\n        if (matches) {\n            this.type = matches[1].toLowerCase();\n            this.base = matches[2];\n            if (this.ingest[this.type]) {\n                this.components = this.ingest[this.type].apply(this, [this.base]);\n            }\n\n        } else {\n            if (this.regExes.crudeJson.test(str)) {\n                if (typeof JSON === 'object' && typeof JSON.parse === 'function') {\n                    this.fromJson(JSON.parse(str));\n\n                } else {\n                    console.log('JSON.parse() is not available; cannot parse GeoJSON strings');\n                    throw {\n                        name: 'JSONError',\n                        message: 'JSON.parse() is not available; cannot parse GeoJSON strings'\n                    };\n                }\n\n            } else {\n                console.log('Invalid WKT string provided to read()');\n                throw {\n                    name: 'WKTError',\n                    message: 'Invalid WKT string provided to read()'\n                };\n            }\n        }\n\n        return this;\n    }; // eo readWkt\n\n    /**\n     * Writes a WKT string.\n     * @param   components  {Array}     An Array of internal geometry objects\n     * @return              {String}    The corresponding WKT representation\n     * @memberof this.Wkt.Wkt\n     * @method\n     */\n    Wkt.Wkt.prototype.write = function (components) {\n        var i, pieces, data;\n\n        components = components || this.components;\n\n        pieces = [];\n\n        pieces.push(this.type.toUpperCase() + '(');\n\n        for (i = 0; i < components.length; i += 1) {\n            if (this.isCollection() && i > 0) {\n                pieces.push(',');\n            }\n\n            // There should be an extract function for the named type\n            if (!this.extract[this.type]) {\n                return null;\n            }\n\n            data = this.extract[this.type].apply(this, [components[i]]);\n            if (this.isCollection() && this.type !== 'multipoint') {\n                pieces.push('(' + data + ')');\n\n            } else {\n                pieces.push(data);\n\n                // If not at the end of the components, add a comma\n                if (i !== (components.length - 1) && this.type !== 'multipoint') {\n                    pieces.push(',');\n                }\n\n            }\n        }\n\n        pieces.push(')');\n\n        return pieces.join('');\n    };\n\n    /**\n     * This object contains functions as property names that extract WKT\n     * strings from the internal representation.\n     * @memberof this.Wkt.Wkt\n     * @namespace this.Wkt.Wkt.extract\n     * @instance\n     */\n    Wkt.Wkt.prototype.extract = {\n        /**\n         * Return a WKT string representing atomic (point) geometry\n         * @param   point   {Object}    An object with x and y properties\n         * @return          {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        point: function (point) {\n            return String(point.x) + this.delimiter + String(point.y);\n        },\n\n        /**\n         * Return a WKT string representing multiple atoms (points)\n         * @param   multipoint  {Array}     Multiple x-and-y objects\n         * @return              {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        multipoint: function (multipoint) {\n            var i, parts = [],\n                s;\n\n            for (i = 0; i < multipoint.length; i += 1) {\n                s = this.extract.point.apply(this, [multipoint[i]]);\n\n                if (this.wrapVertices) {\n                    s = '(' + s + ')';\n                }\n\n                parts.push(s);\n            }\n\n            return parts.join(',');\n        },\n\n        /**\n         * Return a WKT string representing a chain (linestring) of atoms\n         * @param   linestring  {Array}     Multiple x-and-y objects\n         * @return              {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        linestring: function (linestring) {\n            // Extraction of linestrings is the same as for points\n            return this.extract.point.apply(this, [linestring]);\n        },\n\n        /**\n         * Return a WKT string representing multiple chains (multilinestring) of atoms\n         * @param   multilinestring {Array}     Multiple of multiple x-and-y objects\n         * @return                  {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        multilinestring: function (multilinestring) {\n            var i, parts = [];\n\n            if (multilinestring.length) {\n                for (i = 0; i < multilinestring.length; i += 1) {\n                    parts.push(this.extract.linestring.apply(this, [multilinestring[i]]));\n                }\n            } else {\n                parts.push(this.extract.point.apply(this, [multilinestring]));\n            }\n\n            return parts.join(',');\n        },\n\n        /**\n         * Return a WKT string representing multiple atoms in closed series (polygon)\n         * @param   polygon {Array}     Collection of ordered x-and-y objects\n         * @return          {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        polygon: function (polygon) {\n            // Extraction of polygons is the same as for multilinestrings\n            return this.extract.multilinestring.apply(this, [polygon]);\n        },\n\n        /**\n         * Return a WKT string representing multiple closed series (multipolygons) of multiple atoms\n         * @param   multipolygon    {Array}     Collection of ordered x-and-y objects\n         * @return                  {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        multipolygon: function (multipolygon) {\n            var i, parts = [];\n            for (i = 0; i < multipolygon.length; i += 1) {\n                parts.push('(' + this.extract.polygon.apply(this, [multipolygon[i]]) + ')');\n            }\n            return parts.join(',');\n        },\n\n        /**\n         * Return a WKT string representing a 2DBox\n         * @param   multipolygon    {Array}     Collection of ordered x-and-y objects\n         * @return                  {String}    The WKT representation\n         * @memberof this.Wkt.Wkt.extract\n         * @instance\n         */\n        box: function (box) {\n            return this.extract.linestring.apply(this, [box]);\n        },\n\n        geometrycollection: function (str) {\n            console.log('The geometrycollection WKT type is not yet supported.');\n        }\n    };\n\n    /**\n     * This object contains functions as property names that ingest WKT\n     * strings into the internal representation.\n     * @memberof this.Wkt.Wkt\n     * @namespace this.Wkt.Wkt.ingest\n     * @instance\n     */\n    Wkt.Wkt.prototype.ingest = {\n\n        /**\n         * Return point feature given a point WKT fragment.\n         * @param   str {String}    A WKT fragment representing the point\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        point: function (str) {\n            var coords = Wkt.trim(str).split(this.regExes.spaces);\n            // In case a parenthetical group of coordinates is passed...\n            return [{ // ...Search for numeric substrings\n                x: parseFloat(this.regExes.numeric.exec(coords[0])[0]),\n                y: parseFloat(this.regExes.numeric.exec(coords[1])[0])\n            }];\n        },\n\n        /**\n         * Return a multipoint feature given a multipoint WKT fragment.\n         * @param   str {String}    A WKT fragment representing the multipoint\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        multipoint: function (str) {\n            var i, components, points;\n            components = [];\n            points = Wkt.trim(str).split(this.regExes.comma);\n            for (i = 0; i < points.length; i += 1) {\n                components.push(this.ingest.point.apply(this, [points[i]]));\n            }\n            return components;\n        },\n\n        /**\n         * Return a linestring feature given a linestring WKT fragment.\n         * @param   str {String}    A WKT fragment representing the linestring\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        linestring: function (str) {\n            var i, multipoints, components;\n\n            // In our x-and-y representation of components, parsing\n            //  multipoints is the same as parsing linestrings\n            multipoints = this.ingest.multipoint.apply(this, [str]);\n\n            // However, the points need to be joined\n            components = [];\n            for (i = 0; i < multipoints.length; i += 1) {\n                components = components.concat(multipoints[i]);\n            }\n            return components;\n        },\n\n        /**\n         * Return a multilinestring feature given a multilinestring WKT fragment.\n         * @param   str {String}    A WKT fragment representing the multilinestring\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        multilinestring: function (str) {\n            var i, components, line, lines;\n            components = [];\n\n            lines = Wkt.trim(str).split(this.regExes.doubleParenComma);\n            if (lines.length === 1) { // If that didn't work...\n                lines = Wkt.trim(str).split(this.regExes.parenComma);\n            }\n\n            for (i = 0; i < lines.length; i += 1) {\n                line = this._stripWhitespaceAndParens(lines[i]);\n                components.push(this.ingest.linestring.apply(this, [line]));\n            }\n\n            return components;\n        },\n\n        /**\n         * Return a polygon feature given a polygon WKT fragment.\n         * @param   str {String}    A WKT fragment representing the polygon\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        polygon: function (str) {\n            var i, j, components, subcomponents, ring, rings;\n            rings = Wkt.trim(str).split(this.regExes.parenComma);\n            components = []; // Holds one or more rings\n            for (i = 0; i < rings.length; i += 1) {\n                ring = this._stripWhitespaceAndParens(rings[i]).split(this.regExes.comma);\n                subcomponents = []; // Holds the outer ring and any inner rings (holes)\n                for (j = 0; j < ring.length; j += 1) {\n                    // Split on the empty space or '+' character (between coordinates)\n                    var split = ring[j].split(this.regExes.spaces);\n                    if (split.length > 2) {\n                        //remove the elements which are blanks\n                        split = split.filter(function (n) {\n                            return n != \"\"\n                        });\n                    }\n                    if (split.length === 2) {\n                        var x_cord = split[0];\n                        var y_cord = split[1];\n\n                        //now push\n                        subcomponents.push({\n                            x: parseFloat(x_cord),\n                            y: parseFloat(y_cord)\n                        });\n                    }\n                }\n                components.push(subcomponents);\n            }\n            return components;\n        },\n\n        /**\n         * Return box vertices (which would become the Rectangle bounds) given a Box WKT fragment.\n         * @param   str {String}    A WKT fragment representing the box\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        box: function (str) {\n            var i, multipoints, components;\n\n            // In our x-and-y representation of components, parsing\n            //  multipoints is the same as parsing linestrings\n            multipoints = this.ingest.multipoint.apply(this, [str]);\n\n            // However, the points need to be joined\n            components = [];\n            for (i = 0; i < multipoints.length; i += 1) {\n                components = components.concat(multipoints[i]);\n            }\n\n            return components;\n        },\n\n        /**\n         * Return a multipolygon feature given a multipolygon WKT fragment.\n         * @param   str {String}    A WKT fragment representing the multipolygon\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        multipolygon: function (str) {\n            var i, components, polygon, polygons;\n            components = [];\n            polygons = Wkt.trim(str).split(this.regExes.doubleParenComma);\n            for (i = 0; i < polygons.length; i += 1) {\n                polygon = this._stripWhitespaceAndParens(polygons[i]);\n                components.push(this.ingest.polygon.apply(this, [polygon]));\n            }\n            return components;\n        },\n\n        /**\n         * Return an array of features given a geometrycollection WKT fragment.\n         * @param   str {String}    A WKT fragment representing the geometry collection\n         * @memberof this.Wkt.Wkt.ingest\n         * @instance\n         */\n        geometrycollection: function (str) {\n            console.log('The geometrycollection WKT type is not yet supported.');\n        }\n\n    }; // eo ingest\n\n    return Wkt;\n}));\n", "/** @license\n *\n *  Copyright (C) 2012 K. Arthur Endsley (kaendsle@mtu.edu)\n *  Michigan Tech Research Institute (MTRI)\n *  3600 Green Court, Suite 100, Ann Arbor, MI, 48105\n *\n *  This program is free software: you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 3 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU 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 <http://www.gnu.org/licenses/>.\n *\n */\n\n/**\n * @augments Wkt.Wkt\n * A framework-dependent flag, set for each Wkt.Wkt() instance, that indicates\n * whether or not a closed polygon geometry should be interpreted as a rectangle.\n */\n(function ( root, factory ) {\n    if ( typeof exports === 'object' ) {\n        // CommonJS\n        module.exports = factory( require('./wicket') );\n    } else if ( typeof define === 'function' && define.amd ) {\n        // AMD. Register as an anonymous module.\n        define( ['wicket'], factory);\n    } else {\n        // Browser globals\n        factory(root.Wkt );\n    }\n}\n(this, function(Wkt) {\n    Wkt.Wkt.prototype.isRectangle = false;\n\n    /**\n     * @augments Wkt.Wkt\n     * Truncates an Array of coordinates by the closing coordinate when it is\n     * equal to the first coordinate given--this is only to be used for closed\n     * geometries in order to provide merely an \"implied\" closure to Leaflet.\n     * @param   coords  {Array}     An Array of x,y coordinates (objects)\n     * @return          {Array}\n     */\n    Wkt.Wkt.prototype.trunc = function (coords) {\n        var i, verts = [];\n\n        for (i = 0; i < coords.length; i += 1) {\n            if (Wkt.isArray(coords[i])) {\n                verts.push(this.trunc(coords[i]));\n\n            } else {\n\n                // Add the first coord, but skip the last if it is identical\n                if (i === 0 || !this.sameCoords(coords[0], coords[i])) {\n                    verts.push(coords[i]);\n                }\n            }\n        }\n\n        return verts;\n    };\n\n    /**\n     * @augments Wkt.Wkt\n     * An object of framework-dependent construction methods used to generate\n     * objects belonging to the various geometry classes of the framework.\n     */\n    Wkt.Wkt.prototype.construct = {\n        /**\n         * Creates the framework's equivalent point geometry object.\n         * @param   config      {Object}    An optional properties hash the object should use\n         * @param   component   {Object}    An optional component to build from\n         * @return              {L.marker}\n         */\n        point: function (config, component) {\n            var coord = component || this.components;\n            if (coord instanceof Array) {\n                coord = coord[0];\n            }\n\n            return L.marker(this.coordsToLatLng(coord), config);\n        },\n\n        /**\n         * Creates the framework's equivalent multipoint geometry object.\n         * @param   config  {Object}    An optional properties hash the object should use\n         * @return          {L.featureGroup}\n         */\n        multipoint: function (config) {\n            var i,\n                layers = [],\n                coords = this.components;\n\n            for (i = 0; i < coords.length; i += 1) {\n                layers.push(this.construct.point.call(this, config, coords[i]));\n            }\n\n            return L.featureGroup(layers, config);\n        },\n\n        /**\n         * Creates the framework's equivalent linestring geometry object.\n         * @param   config      {Object}    An optional properties hash the object should use\n         * @param   component   {Object}    An optional component to build from\n         * @return              {L.polyline}\n         */\n        linestring: function (config, component) {\n            var coords = component || this.components,\n                latlngs = this.coordsToLatLngs(coords, 0, this.coordsToLatLng);\n\n            return L.polyline(latlngs, config);\n        },\n\n        /**\n         * Creates the framework's equivalent multilinestring geometry object.\n         * @param   config  {Object}    An optional properties hash the object should use\n         * @return          {L.multiPolyline}\n         */\n        multilinestring: function (config) {\n            var coords = this.components,\n                latlngs = this.coordsToLatLngs(coords, 1, this.coordsToLatLng);\n\n            if (L.multiPolyline) {\n                return L.multiPolyline(latlngs, config);\n            }\n            else {\n                return L.polyline(latlngs, config);\n            }\n        },\n\n        /**\n         * Creates the framework's equivalent polygon geometry object.\n         * @param   config      {Object}    An optional properties hash the object should use\n         * @return              {L.multiPolygon}\n         */\n        polygon: function (config) {\n            // Truncate the coordinates to remove the closing coordinate\n            var coords = this.trunc(this.components),\n                latlngs = this.coordsToLatLngs(coords, 1, this.coordsToLatLng);\n            return L.polygon(latlngs, config);\n        },\n\n        /**\n         * Creates the framework's equivalent multipolygon geometry object.\n         * @param   config  {Object}    An optional properties hash the object should use\n         * @return          {L.multiPolygon}\n         */\n        multipolygon: function (config) {\n            // Truncate the coordinates to remove the closing coordinate\n            var coords = this.trunc(this.components),\n                latlngs = this.coordsToLatLngs(coords, 2, this.coordsToLatLng);\n\n            if (L.multiPolygon) {\n                return L.multiPolygon(latlngs, config);\n            }\n            else {\n                return L.polygon(latlngs, config);\n            }\n        },\n\n        /**\n         * Creates the framework's equivalent collection of geometry objects.\n         * @param   config  {Object}    An optional properties hash the object should use\n         * @return          {L.featureGroup}\n         */\n        geometrycollection: function (config) {\n            var comps, i, layers;\n\n            comps = this.trunc(this.components);\n            layers = [];\n            for (i = 0; i < this.components.length; i += 1) {\n                layers.push(this.construct[comps[i].type].call(this, comps[i]));\n            }\n\n            return L.featureGroup(layers, config);\n        }\n    };\n\n    L.Util.extend(Wkt.Wkt.prototype, {\n        coordsToLatLngs: L.GeoJSON.coordsToLatLngs,\n        // TODO Why doesn't the coordsToLatLng function in L.GeoJSON already suffice?\n        coordsToLatLng: function (coords, reverse) {\n            var lat = reverse ? coords.x : coords.y,\n                lng = reverse ? coords.y : coords.x;\n\n            return L.latLng(lat, lng, true);\n        }\n    });\n\n    /**\n     * @augments Wkt.Wkt\n     * A framework-dependent deconstruction method used to generate internal\n     * geometric representations from instances of framework geometry. This method\n     * uses object detection to attempt to classify members of framework geometry\n     * classes into the standard WKT types.\n     * @param   obj {Object}    An instance of one of the framework's geometry classes\n     * @return      {Object}    A hash of the 'type' and 'components' thus derived\n     */\n    Wkt.Wkt.prototype.deconstruct = function (obj) {\n        var attr, coordsFromLatLngs, features, i, verts, rings, tmp, boundary;\n\n        /**\n         * Accepts an Array (arr) of LatLngs from which it extracts each one as a\n         *  vertex; calls itself recursively to deal with nested Arrays.\n         */\n        coordsFromLatLngs = function (arr) {\n            var i, coords;\n\n            coords = [];\n            for (i = 0; i < arr.length; i += 1) {\n                if (Wkt.isArray(arr[i])) {\n                    coords.push(coordsFromLatLngs(arr[i]));\n\n                } else {\n                    coords.push({\n                        x: arr[i].lng,\n                        y: arr[i].lat\n                    });\n                }\n            }\n\n            return coords;\n        };\n\n        // L.Marker ////////////////////////////////////////////////////////////////\n        if (obj.constructor === L.Marker || obj.constructor === L.marker) {\n            return {\n                type: 'point',\n                components: [{\n                    x: obj.getLatLng().lng,\n                    y: obj.getLatLng().lat\n                }]\n            };\n        }\n\n        // L.Rectangle /////////////////////////////////////////////////////////////\n        if (obj.constructor === L.Rectangle || obj.constructor === L.rectangle) {\n            tmp = obj.getBounds(); // L.LatLngBounds instance\n            return {\n                type: 'polygon',\n                isRectangle: true,\n                components: [\n                    [\n                        { // NW corner\n                            x: tmp.getSouthWest().lng,\n                            y: tmp.getNorthEast().lat\n                        },\n                        { // NE corner\n                            x: tmp.getNorthEast().lng,\n                            y: tmp.getNorthEast().lat\n                        },\n                        { // SE corner\n                            x: tmp.getNorthEast().lng,\n                            y: tmp.getSouthWest().lat\n                        },\n                        { // SW corner\n                            x: tmp.getSouthWest().lng,\n                            y: tmp.getSouthWest().lat\n                        },\n                        { // NW corner (again, for closure)\n                            x: tmp.getSouthWest().lng,\n                            y: tmp.getNorthEast().lat\n                        }\n                    ]\n                ]\n            };\n\n        }\n\n        // L.Polyline //////////////////////////////////////////////////////////////\n        if (obj.constructor === L.Polyline || obj.constructor === L.polyline) {\n            verts = [];\n            tmp = obj.getLatLngs();\n\n            if (!tmp[0].equals(tmp[tmp.length - 1])) {\n\n                for (i = 0; i < tmp.length; i += 1) {\n                    verts.push({\n                        x: tmp[i].lng,\n                        y: tmp[i].lat\n                    });\n                }\n\n                return {\n                    type: 'linestring',\n                    components: verts\n                };\n\n            }\n        }\n\n        // L.Polygon ///////////////////////////////////////////////////////////////\n\n        if (obj.constructor === L.Polygon || obj.constructor === L.polygon) {\n            rings = [];\n            verts = [];\n            boundary = obj.getLatLngs()[0];\n\n            // First, we deal with the boundary points\n            for (i = 0; i < boundary.length; i += 1) {\n                verts.push({ // Add the first coordinate again for closure\n                    x: boundary[i].lng,\n                    y: boundary[i].lat\n                });\n            }\n\n            verts.push({ // Add the first coordinate again for closure\n                x: boundary[0].lng,\n                y: boundary[0].lat\n            });\n\n            rings.push(verts);\n\n            // Now, any holes\n            if (obj._holes && obj._holes.length > 0) {\n                // Reworked to support holes properly\n                verts = coordsFromLatLngs(obj._holes);\n                for (i=0; i < verts.length;i++) {\n                    verts[i].push(verts[i][0]); // Copy the beginning coords again for closure\n                    rings.push(verts[i]);\n                }\n            }\n\n            return {\n                type: 'polygon',\n                components: rings\n            };\n\n        }\n\n        // L.MultiPolyline /////////////////////////////////////////////////////////\n        // L.MultiPolygon //////////////////////////////////////////////////////////\n        // L.LayerGroup ////////////////////////////////////////////////////////////\n        // L.FeatureGroup //////////////////////////////////////////////////////////\n        if (obj.constructor === L.MultiPolyline || obj.constructor === L.MultiPolygon\n                || obj.constructor === L.LayerGroup || obj.constructor === L.FeatureGroup) {\n\n            features = [];\n            tmp = obj._layers;\n\n            for (attr in tmp) {\n                if (tmp.hasOwnProperty(attr)) {\n                    if (tmp[attr].getLatLngs || tmp[attr].getLatLng) {\n                        // Recursively deconstruct each layer\n                        features.push(this.deconstruct(tmp[attr]));\n                    }\n                }\n            }\n\n            return {\n\n                type: (function () {\n                    switch (obj.constructor) {\n                    case L.MultiPolyline:\n                        return 'multilinestring';\n                    case L.MultiPolygon:\n                        return 'multipolygon';\n                    case L.FeatureGroup:\n                        return (function () {\n                            var i, mpgon, mpline, mpoint;\n\n                            // Assume that all layers are of one type (any one type)\n                            mpgon = true;\n                            mpline = true;\n                            mpoint = true;\n\n                            for (i in obj._layers) {\n                                if (obj._layers.hasOwnProperty(i)) {\n                                    if (obj._layers[i].constructor !== L.Marker) {\n                                        mpoint = false;\n                                    }\n                                    if (obj._layers[i].constructor !== L.Polyline) {\n                                        mpline = false;\n                                    }\n                                    if (obj._layers[i].constructor !== L.Polygon) {\n                                        mpgon = false;\n                                    }\n                                }\n                            }\n\n                            if (mpoint) {\n                                return 'multipoint';\n                            }\n                            if (mpline) {\n                                return 'multilinestring';\n                            }\n                            if (mpgon) {\n                                return 'multipolygon';\n                            }\n                            return 'geometrycollection';\n\n                        }());\n                    default:\n                        return 'geometrycollection';\n                    }\n                }()),\n\n                components: (function () {\n                    // Pluck the components from each Wkt\n                    var i, comps;\n\n                    comps = [];\n                    for (i = 0; i < features.length; i += 1) {\n                        if (features[i].components) {\n                            comps.push(features[i].components);\n                        }\n                    }\n\n                    return comps;\n                }())\n\n            };\n\n        }\n\n        // L.Circle ////////////////////////////////////////////////////////////////\n        if (obj.constructor === L.Circle || obj.constructor === L.circle) {\n            console.log('Deconstruction of L.Circle objects is not yet supported');\n\n        } else {\n            console.log('The passed object does not have any recognizable properties.');\n        }\n\n    };\n\n    return Wkt;\n}));\n", "(function(v){\"object\"===typeof exports?module.exports=v():\"function\"===typeof define&&define.amd?define(v):geostats=v()})(function(){var v=function(m){return\"number\"===typeof m&&parseFloat(m)==parseInt(m,10)&&!isNaN(m)};Array.prototype.indexOf||(Array.prototype.indexOf=function(m,a){if(void 0===this||null===this)throw new TypeError('\"this\" is null or not defined');var b=this.length>>>0;a=+a||0;Infinity===Math.abs(a)&&(a=0);0>a&&(a+=b,0>a&&(a=0));for(;a<b;a++)if(this[a]===m)return a;return-1});return function(m){this.objectID=\n\"\";this.legendSeparator=this.separator=\" - \";this.method=\"\";this.precision=0;this.precisionflag=\"auto\";this.roundlength=2;this.silent=this.debug=this.is_uniqueValues=!1;this.bounds=[];this.ranges=[];this.inner_ranges=null;this.colors=[];this.counter=[];this.stat_cov=this.stat_stddev=this.stat_variance=this.stat_pop=this.stat_min=this.stat_max=this.stat_sum=this.stat_median=this.stat_mean=this.stat_sorted=null;this.log=function(a,b){1!=this.debug&&null==b||console.log(this.objectID+\"(object id) :: \"+\na)};this.setBounds=function(a){this.log(\"Setting bounds (\"+a.length+\") : \"+a.join());this.bounds=a};this.setSerie=function(a){this.log(\"Setting serie (\"+a.length+\") : \"+a.join());this.serie=a;this.resetStatistics();this.setPrecision()};this.setColors=function(a){this.log(\"Setting color ramp (\"+a.length+\") : \"+a.join());this.colors=a};this.doCount=function(){if(!this._nodata()){var a=this.sorted();this.counter=[];if(1==this.is_uniqueValues)for(var b=0;b<this.bounds.length;b++)this.counter[b]=0;else for(b=\n0;b<this.bounds.length-1;b++)this.counter[b]=0;for(b=0;b<a.length;b++){var c=this.getClass(a[b]);this.counter[c]++}}};this.setPrecision=function(a){\"undefined\"!==typeof a&&(this.precisionflag=\"manual\",this.precision=a);if(\"auto\"==this.precisionflag)for(a=0;a<this.serie.length;a++){var b=isNaN(this.serie[a]+\"\")||-1==(this.serie[a]+\"\").toString().indexOf(\".\")?0:(this.serie[a]+\"\").split(\".\")[1].length;b>this.precision&&(this.precision=b)}20<this.precision&&(this.log(\"this.precision value (\"+this.precision+\n') is greater than max value. Automatic set-up to 20 to prevent \"Uncaught RangeError: toFixed()\" when calling decimalFormat() method.'),this.precision=20);this.log(\"Calling setPrecision(). Mode : \"+this.precisionflag+\" - Decimals : \"+this.precision);this.serie=this.decimalFormat(this.serie)};this.decimalFormat=function(a){for(var b=[],c=0;c<a.length;c++){var e=a[c];e=!isNaN(parseFloat(e))&&isFinite(e);b[c]=e?parseFloat(parseFloat(a[c]).toFixed(this.precision)):a[c]}return b};this.setRanges=function(){this.ranges=\n[];for(var a=0;a<this.bounds.length-1;a++)this.ranges[a]=this.bounds[a]+this.separator+this.bounds[a+1]};this.min=function(a){a=void 0===a?[]:a;if(!this._nodata()){a.includes(this.serie[0])?this.stat_min=999999999999:this.stat_min=this.serie[0];for(var b=0;b<this.pop();b++)this.serie[b]<this.stat_min&&!a.includes(this.serie[b])&&(this.stat_min=this.serie[b]);return this.stat_min}};this.max=function(a){a=void 0===a?[]:a;if(!this._nodata()){a.includes(this.serie[0])?this.stat_max=-999999999999:this.stat_max=\nthis.serie[0];for(var b=0;b<this.pop();b++)this.serie[b]>this.stat_max&&!a.includes(this.serie[b])&&(this.stat_max=this.serie[b]);return this.stat_max}};this.sum=function(){if(!this._nodata()){if(null==this.stat_sum)for(var a=this.stat_sum=0;a<this.pop();a++)this.stat_sum+=parseFloat(this.serie[a]);return this.stat_sum}};this.pop=function(){if(!this._nodata())return null==this.stat_pop&&(this.stat_pop=this.serie.length),this.stat_pop};this.mean=function(){if(!this._nodata())return null==this.stat_mean&&\n(this.stat_mean=parseFloat(this.sum()/this.pop())),this.stat_mean};this.median=function(){if(!this._nodata()){if(null==this.stat_median){this.stat_median=0;var a=this.sorted();this.stat_median=a.length%2?parseFloat(a[Math.ceil(a.length/2)-1]):(parseFloat(a[a.length/2-1])+parseFloat(a[a.length/2]))/2}return this.stat_median}};this.variance=function(){var a=\"undefined\"===typeof a?!0:!1;if(!this._nodata()){if(null==this.stat_variance){for(var b=0,c=this.mean(),e=0;e<this.pop();e++)b+=Math.pow(this.serie[e]-\nc,2);this.stat_variance=b/this.pop();1==a&&(this.stat_variance=Math.round(this.stat_variance*Math.pow(10,this.roundlength))/Math.pow(10,this.roundlength))}return this.stat_variance}};this.stddev=function(a){a=\"undefined\"===typeof a?!0:!1;if(!this._nodata())return null==this.stat_stddev&&(this.stat_stddev=Math.sqrt(this.variance()),1==a&&(this.stat_stddev=Math.round(this.stat_stddev*Math.pow(10,this.roundlength))/Math.pow(10,this.roundlength))),this.stat_stddev};this.cov=function(a){a=\"undefined\"===\ntypeof a?!0:!1;if(!this._nodata())return null==this.stat_cov&&(this.stat_cov=this.stddev()/this.mean(),1==a&&(this.stat_cov=Math.round(this.stat_cov*Math.pow(10,this.roundlength))/Math.pow(10,this.roundlength))),this.stat_cov};this.resetStatistics=function(){this.stat_cov=this.stat_stddev=this.stat_variance=this.stat_pop=this.stat_min=this.stat_max=this.stat_sum=this.stat_median=this.stat_mean=this.stat_sorted=null};this._nodata=function(){if(0==this.serie.length){if(this.silent)this.log(\"[silent mode] Error. You should first enter a serie!\",\n!0);else throw new TypeError(\"Error. You should first enter a serie!\");return 1}return 0};this._classificationCheck=function(a){if(a>=this.pop())if(a=\"Error. \"+a+\" classes are defined for only \"+this.pop()+\" values in serie ! For the current serie, no more than \"+(this.pop()-1)+\" classes can be defined.\",this.silent)this.log(a,!0);else throw alert(a),new TypeError(a);};this._nbClassInt=function(a){a=parseInt(a,10);if(isNaN(a))if(this.silent)this.log(\"[silent mode] '\"+a+\"' is not a valid integer. Enable to set class number.\",\n!0);else throw new TypeError(\"'\"+a+\"' is not a valid integer. Enable to set class number.\");else return a};this._hasNegativeValue=function(){for(var a=0;a<this.serie.length;a++)if(0>this.serie[a])return!0;return!1};this._hasZeroValue=function(){for(var a=0;a<this.serie.length;a++)if(0===parseFloat(this.serie[a]))return!0;return!1};this.sorted=function(){null==this.stat_sorted&&(this.stat_sorted=0==this.is_uniqueValues?this.serie.sort(function(a,b){return a-b}):this.serie.sort(function(a,b){var c=\na.toString().toLowerCase(),e=b.toString().toLowerCase();return c<e?-1:c>e?1:0}));return this.stat_sorted};this.info=function(){if(!this._nodata()){var a=\"Population : \"+this.pop()+\" - [Min : \"+this.min()+\" | Max : \"+this.max()+\"]\\n\";a+=\"Mean : \"+this.mean()+\" - Median : \"+this.median()+\"\\n\";return a+=\"Variance : \"+this.variance()+\" - Standard deviation : \"+this.stddev()+\" - Coefficient of variation : \"+this.cov()+\"\\n\"}};this.setClassManually=function(a){if(!this._nodata())if(a[0]!==this.min()||a[a.length-\n1]!==this.max())if(this.silent)this.log(\"[silent mode] \"+t(\"Given bounds may not be correct! please check your input.\\nMin value : \"+this.min()+\" / Max value : \"+this.max()),!0);else throw new TypeError(\"Given bounds may not be correct! please check your input.\\nMin value : \"+this.min()+\" / Max value : \"+this.max());else return this.setBounds(a),this.setRanges(),this.method=\"manual classification (\"+(a.length-1)+\" classes)\",this.bounds};this.getClassEqInterval=function(a,b,c){a=this._nbClassInt(a);\nif(!this._nodata()){var e=\"undefined\"===typeof b?this.min():b;c=\"undefined\"===typeof c?this.max():c;b=[];var d=e;e=(c-e)/a;for(var f=0;f<=a;f++)b[f]=d,d+=e;b[a]=c;this.setBounds(b);this.setRanges();this.method=\"eq. intervals (\"+a+\" classes)\";return this.bounds}};this.getQuantiles=function(a){a=this._nbClassInt(a);for(var b=this.sorted(),c=[],e=this.pop()/a,d=1;d<a;d++)c.push(b[Math.round(d*e+.49)-1]);return c};this.getClassQuantile=function(a){a=this._nbClassInt(a);if(!this._nodata()){this._classificationCheck(a);\nvar b=this.sorted(),c=this.getQuantiles(a);c.unshift(b[0]);c[b.length-1]!==b[b.length-1]&&c.push(b[b.length-1]);this.setBounds(c);this.setRanges();this.method=\"quantile (\"+a+\" classes)\";return this.bounds}};this.getClassStdDeviation=function(a,b){a=this._nbClassInt(a);if(!this._nodata()){var c=this.max(),e=this.min(),d=this.stddev(),f=this.mean(),g=[];if(1==a%2){var h=Math.floor(a/2),l=h+1;g[h]=f-d/2;g[l]=f+d/2;for(f=h-1;0<f;f--)h=g[f+1]-d,g[f]=h;f=l+1}else{l=a/2;g[l]=f;for(f=l-1;0<f;f--)h=g[f+1]-\nd,g[f]=h;f=l+1}for(;f<a;f++)h=g[f-1]+d,g[f]=h;g[0]=\"undefined\"===typeof b?g[1]-d:e;g[a]=\"undefined\"===typeof b?g[a-1]+d:c;this.setBounds(g);this.setRanges();this.method=\"std deviation (\"+a+\" classes)\";return this.bounds}};this.getClassGeometricProgression=function(a){a=this._nbClassInt(a);if(!this._nodata())if(this._hasNegativeValue()||this._hasZeroValue())if(this.silent)this.log(\"[silent mode] geometric progression can't be applied with a serie containing negative or zero values.\",!0);else throw new TypeError(\"geometric progression can't be applied with a serie containing negative or zero values.\");\nelse{var b=[],c=this.min(),e=this.max();c=Math.log(c)/Math.LN10;e=(Math.log(e)/Math.LN10-c)/a;for(var d=0;d<a;d++)b[d]=0==d?c:b[d-1]+e;b=b.map(function(f){return Math.pow(10,f)});b.push(this.max());this.setBounds(b);this.setRanges();this.method=\"geometric progression (\"+a+\" classes)\";return this.bounds}};this.getClassArithmeticProgression=function(a){a=this._nbClassInt(a);if(!this._nodata()){for(var b=0,c=1;c<=a;c++)b+=c;var e=[],d=this.min(),f=this.max();b=(f-d)/b;for(c=0;c<=a;c++)e[c]=0==c?d:c==\na?f:e[c-1]+c*b;this.setBounds(e);this.setRanges();this.method=\"arithmetic progression (\"+a+\" classes)\";return this.bounds}};this.getClassJenks2=function(a){a=this._nbClassInt(a);if(!this._nodata()){this._classificationCheck(a);for(var b=this.sorted(),c=[],e=0,d=b.length+1;e<d;e++){for(var f=[],g=0,h=a+1;g<h;g++)f.push(0);c.push(f)}e=[];d=0;for(f=b.length+1;d<f;d++){g=[];h=0;for(var l=a+1;h<l;h++)g.push(0);e.push(g)}d=1;for(f=a+1;d<f;d++){c[0][d]=1;e[0][d]=0;var k=1;for(g=b.length+1;k<g;k++)e[k][d]=\nInfinity;k=0}d=2;for(f=b.length+1;d<f;d++){l=h=g=0;for(var r=1,u=d+1;r<u;r++){var n=d-r+1;k=parseFloat(b[n-1]);h+=k*k;g+=k;l+=1;k=h-g*g/l;var p=n-1;if(0!=p)for(var q=2,w=a+1;q<w;q++)e[d][q]>=k+e[p][q-1]&&(c[d][q]=n,e[d][q]=k+e[p][q-1])}c[d][1]=1;e[d][1]=k}k=b.length;e=[];for(d=0;d<=a;d++)e.push(0);e[a]=parseFloat(b[b.length-1]);e[0]=parseFloat(b[0]);for(d=a;2<=d;)f=parseInt(c[k][d]-2),e[d-1]=b[f],k=parseInt(c[k][d]-1),--d;e[0]==e[1]&&(e[0]=0);this.setBounds(e);this.setRanges();this.method=\"Jenks2 (\"+\na+\" classes)\";return this.bounds}};this.getClassJenks=function(a){a=this._nbClassInt(a);if(!this._nodata()){this._classificationCheck(a);var b=this.sorted(),c=a,e=[],d=[],f,g,h=0;for(f=0;f<b.length+1;f++){var l=[],k=[];for(g=0;g<c+1;g++)l.push(0),k.push(0);e.push(l);d.push(k)}for(f=1;f<c+1;f++)for(e[1][f]=1,d[1][f]=0,g=2;g<b.length+1;g++)d[g][f]=Infinity;for(f=2;f<b.length+1;f++){for(var r=k=l=0,u,n=1;n<f+1;n++){var p=f-n+1;g=b[p-1];r++;l+=g;k+=g*g;h=k-l*l/r;u=p-1;if(0!==u)for(g=2;g<c+1;g++)d[f][g]>=\nh+d[u][g-1]&&(e[f][g]=p,d[f][g]=h+d[u][g-1])}e[f][1]=1;d[f][1]=h}c=b.length-1;d=[];g=a;d[a]=b[b.length-1];for(d[0]=b[0];1<g;)d[g-1]=b[e[c][g]-2],c=e[c][g]-1,g--;this.setBounds(d);this.setRanges();this.method=\"Jenks (\"+a+\" classes)\";return this.bounds}};this.getClassUniqueValues=function(){if(!this._nodata()){this.is_uniqueValues=!0;for(var a=this.sorted(),b=[],c=0;c<this.pop();c++)-1===b.indexOf(a[c])&&b.push(a[c]);this.bounds=b;this.method=\"unique values\";return b}};this.getClass=function(a){for(var b=\n0;b<this.bounds.length;b++)if(1==this.is_uniqueValues){if(a==this.bounds[b])return b}else if(parseFloat(a)<=this.bounds[b+1])return b;return\"Unable to get value's class.\"};this.getRanges=function(){return this.ranges};this.getRangeNum=function(a){var b;for(b=0;b<this.ranges.length;b++){var c=this.ranges[b].split(/ - /);if(a<=parseFloat(c[1]))return b}};this.getInnerRanges=function(){if(null!=this.inner_ranges)return this.inner_ranges;for(var a=[],b=this.sorted(),c=1,e=0;e<b.length;e++){if(0==e)var d=\nb[e];parseFloat(b[e])>parseFloat(this.bounds[c])&&(a[c-1]=\"\"+d+this.separator+b[e-1],d=b[e],c++);if(c==this.bounds.length-1)return a[c-1]=\"\"+d+this.separator+b[b.length-1],this.inner_ranges=a}};this.getSortedlist=function(){return this.sorted().join(\", \")};this.getHtmlLegend=function(a,b,c,e,d,f){var g=\"\",h=[];this.doCount();ccolors=null!=a?a:this.colors;lg=null!=b?b:\"Legend\";getcounter=null!=c?!0:!1;fn=null!=e?e:function(l){return l};null==d&&(d=\"default\");if(\"discontinuous\"==d&&(this.getInnerRanges(),\n-1!==this.counter.indexOf(0))){if(this.silent)this.log(\"[silent mode] Geostats cannot apply 'discontinuous' mode to the getHtmlLegend() method because some classes are not populated.\\nPlease switch to 'default' or 'distinct' modes. Exit!\",!0);else throw new TypeError(\"Geostats cannot apply 'discontinuous' mode to the getHtmlLegend() method because some classes are not populated.\\nPlease switch to 'default' or 'distinct' modes. Exit!\");return}\"DESC\"!==f&&(f=\"ASC\");if(ccolors.length<this.ranges.length)if(this.silent)this.log(\"[silent mode] The number of colors should fit the number of ranges. Exit!\",\n!0);else throw new TypeError(\"The number of colors should fit the number of ranges. Exit!\");else{if(0==this.is_uniqueValues)for(a=0;a<this.ranges.length;a++)!0===getcounter&&(g=' <span class=\"geostats-legend-counter\">('+this.counter[a]+\")</span>\"),c=this.ranges[a].split(this.separator),b=parseFloat(c[0]).toFixed(this.precision),c=parseFloat(c[1]).toFixed(this.precision),\"distinct\"==d&&0!=a&&(v(b)?(b=parseInt(b)+1,\"manual\"==this.precisionflag&&0!=this.precision&&(b=parseFloat(b).toFixed(this.precision))):\n(b=parseFloat(b)+1/Math.pow(10,this.precision),b=parseFloat(b).toFixed(this.precision))),\"discontinuous\"==d&&(c=this.inner_ranges[a].split(this.separator),b=parseFloat(c[0]).toFixed(this.precision),c=parseFloat(c[1]).toFixed(this.precision)),b=fn(b)+this.legendSeparator+fn(c),b='<div><div class=\"geostats-legend-block\" style=\"background-color:'+ccolors[a]+'\"></div> '+b+g+\"</div>\",h.push(b);else for(a=0;a<this.bounds.length;a++)!0===getcounter&&(g=' <span class=\"geostats-legend-counter\">('+this.counter[a]+\n\")</span>\"),b=fn(this.bounds[a]),b='<div><div class=\"geostats-legend-block\" style=\"background-color:'+ccolors[a]+'\"></div> '+b+g+\"</div>\",h.push(b);\"DESC\"===f&&h.reverse();d='<div class=\"geostats-legend\"><div class=\"geostats-legend-title\">'+lg+\"</div>\";for(a=0;a<h.length;a++)d+=h[a];return d+\"</div>\"}};this.objectID=(new Date).getUTCMilliseconds();this.log(\"Creating new geostats object\");\"undefined\"!==typeof m&&0<m.length?(this.serie=m,this.setPrecision(),this.log(\"Setting serie (\"+m.length+\") : \"+\nm.join())):this.serie=[];this.getJenks=this.getClassJenks;this.getJenks2=this.getClassJenks2;this.getGeometricProgression=this.getClassGeometricProgression;this.getEqInterval=this.getClassEqInterval;this.getQuantile=this.getClassQuantile;this.getStdDeviation=this.getClassStdDeviation;this.getUniqueValues=this.getClassUniqueValues;this.getArithmeticProgression=this.getClassArithmeticProgression}});", "export default {\n  logger: typeof console !== \"undefined\" ? console : undefined,\n  WebSocket: typeof WebSocket !== \"undefined\" ? WebSocket : undefined,\n}\n", "import adapters from \"./adapters\"\n\n// The logger is disabled by default. You can enable it with:\n//\n//   ActionCable.logger.enabled = true\n//\n//   Example:\n//\n//   import * as ActionCable from '@rails/actioncable'\n//\n//   ActionCable.logger.enabled = true\n//   ActionCable.logger.log('Connection Established.')\n//\n\nexport default {\n  log(...messages) {\n    if (this.enabled) {\n      messages.push(Date.now())\n      adapters.logger.log(\"[ActionCable]\", ...messages)\n    }\n  },\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting\n// revival reconnections if things go astray. Internal class, not intended for direct user manipulation.\n\nconst now = () => new Date().getTime()\n\nconst secondsSince = time => (now() - time) / 1000\n\nclass ConnectionMonitor {\n  constructor(connection) {\n    this.visibilityDidChange = this.visibilityDidChange.bind(this)\n    this.connection = connection\n    this.reconnectAttempts = 0\n  }\n\n  start() {\n    if (!this.isRunning()) {\n      this.startedAt = now()\n      delete this.stoppedAt\n      this.startPolling()\n      addEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`)\n    }\n  }\n\n  stop() {\n    if (this.isRunning()) {\n      this.stoppedAt = now()\n      this.stopPolling()\n      removeEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(\"ConnectionMonitor stopped\")\n    }\n  }\n\n  isRunning() {\n    return this.startedAt && !this.stoppedAt\n  }\n\n  recordMessage() {\n    this.pingedAt = now()\n  }\n\n  recordConnect() {\n    this.reconnectAttempts = 0\n    delete this.disconnectedAt\n    logger.log(\"ConnectionMonitor recorded connect\")\n  }\n\n  recordDisconnect() {\n    this.disconnectedAt = now()\n    logger.log(\"ConnectionMonitor recorded disconnect\")\n  }\n\n  // Private\n\n  startPolling() {\n    this.stopPolling()\n    this.poll()\n  }\n\n  stopPolling() {\n    clearTimeout(this.pollTimeout)\n  }\n\n  poll() {\n    this.pollTimeout = setTimeout(() => {\n      this.reconnectIfStale()\n      this.poll()\n    }\n    , this.getPollInterval())\n  }\n\n  getPollInterval() {\n    const { staleThreshold, reconnectionBackoffRate } = this.constructor\n    const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10))\n    const jitterMax = this.reconnectAttempts === 0 ? 1.0 : reconnectionBackoffRate\n    const jitter = jitterMax * Math.random()\n    return staleThreshold * 1000 * backoff * (1 + jitter)\n  }\n\n  reconnectIfStale() {\n    if (this.connectionIsStale()) {\n      logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`)\n      this.reconnectAttempts++\n      if (this.disconnectedRecently()) {\n        logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`)\n      } else {\n        logger.log(\"ConnectionMonitor reopening\")\n        this.connection.reopen()\n      }\n    }\n  }\n\n  get refreshedAt() {\n    return this.pingedAt ? this.pingedAt : this.startedAt\n  }\n\n  connectionIsStale() {\n    return secondsSince(this.refreshedAt) > this.constructor.staleThreshold\n  }\n\n  disconnectedRecently() {\n    return this.disconnectedAt && (secondsSince(this.disconnectedAt) < this.constructor.staleThreshold)\n  }\n\n  visibilityDidChange() {\n    if (document.visibilityState === \"visible\") {\n      setTimeout(() => {\n        if (this.connectionIsStale() || !this.connection.isOpen()) {\n          logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`)\n          this.connection.reopen()\n        }\n      }\n      , 200)\n    }\n  }\n\n}\n\nConnectionMonitor.staleThreshold = 6 // Server::Connections::BEAT_INTERVAL * 2 (missed two pings)\nConnectionMonitor.reconnectionBackoffRate = 0.15\n\nexport default ConnectionMonitor\n", "export default {\n  \"message_types\": {\n    \"welcome\": \"welcome\",\n    \"disconnect\": \"disconnect\",\n    \"ping\": \"ping\",\n    \"confirmation\": \"confirm_subscription\",\n    \"rejection\": \"reject_subscription\"\n  },\n  \"disconnect_reasons\": {\n    \"unauthorized\": \"unauthorized\",\n    \"invalid_request\": \"invalid_request\",\n    \"server_restart\": \"server_restart\",\n    \"remote\": \"remote\"\n  },\n  \"default_mount_path\": \"/cable\",\n  \"protocols\": [\n    \"actioncable-v1-json\",\n    \"actioncable-unsupported\"\n  ]\n}\n", "import adapters from \"./adapters\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\n\n// Encapsulate the cable connection held by the consumer. This is an internal class not intended for direct user manipulation.\n\nconst {message_types, protocols} = INTERNAL\nconst supportedProtocols = protocols.slice(0, protocols.length - 1)\n\nconst indexOf = [].indexOf\n\nclass Connection {\n  constructor(consumer) {\n    this.open = this.open.bind(this)\n    this.consumer = consumer\n    this.subscriptions = this.consumer.subscriptions\n    this.monitor = new ConnectionMonitor(this)\n    this.disconnected = true\n  }\n\n  send(data) {\n    if (this.isOpen()) {\n      this.webSocket.send(JSON.stringify(data))\n      return true\n    } else {\n      return false\n    }\n  }\n\n  open() {\n    if (this.isActive()) {\n      logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`)\n      return false\n    } else {\n      const socketProtocols = [...protocols, ...this.consumer.subprotocols || []]\n      logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`)\n      if (this.webSocket) { this.uninstallEventHandlers() }\n      this.webSocket = new adapters.WebSocket(this.consumer.url, socketProtocols)\n      this.installEventHandlers()\n      this.monitor.start()\n      return true\n    }\n  }\n\n  close({allowReconnect} = {allowReconnect: true}) {\n    if (!allowReconnect) { this.monitor.stop() }\n    // Avoid closing websockets in a \"connecting\" state due to Safari 15.1+ bug. See: https://github.com/rails/rails/issues/43835#issuecomment-1002288478\n    if (this.isOpen()) {\n      return this.webSocket.close()\n    }\n  }\n\n  reopen() {\n    logger.log(`Reopening WebSocket, current state is ${this.getState()}`)\n    if (this.isActive()) {\n      try {\n        return this.close()\n      } catch (error) {\n        logger.log(\"Failed to reopen WebSocket\", error)\n      }\n      finally {\n        logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`)\n        setTimeout(this.open, this.constructor.reopenDelay)\n      }\n    } else {\n      return this.open()\n    }\n  }\n\n  getProtocol() {\n    if (this.webSocket) {\n      return this.webSocket.protocol\n    }\n  }\n\n  isOpen() {\n    return this.isState(\"open\")\n  }\n\n  isActive() {\n    return this.isState(\"open\", \"connecting\")\n  }\n\n  triedToReconnect() {\n    return this.monitor.reconnectAttempts > 0\n  }\n\n  // Private\n\n  isProtocolSupported() {\n    return indexOf.call(supportedProtocols, this.getProtocol()) >= 0\n  }\n\n  isState(...states) {\n    return indexOf.call(states, this.getState()) >= 0\n  }\n\n  getState() {\n    if (this.webSocket) {\n      for (let state in adapters.WebSocket) {\n        if (adapters.WebSocket[state] === this.webSocket.readyState) {\n          return state.toLowerCase()\n        }\n      }\n    }\n    return null\n  }\n\n  installEventHandlers() {\n    for (let eventName in this.events) {\n      const handler = this.events[eventName].bind(this)\n      this.webSocket[`on${eventName}`] = handler\n    }\n  }\n\n  uninstallEventHandlers() {\n    for (let eventName in this.events) {\n      this.webSocket[`on${eventName}`] = function() {}\n    }\n  }\n\n}\n\nConnection.reopenDelay = 500\n\nConnection.prototype.events = {\n  message(event) {\n    if (!this.isProtocolSupported()) { return }\n    const {identifier, message, reason, reconnect, type} = JSON.parse(event.data)\n    this.monitor.recordMessage()\n    switch (type) {\n      case message_types.welcome:\n        if (this.triedToReconnect()) {\n          this.reconnectAttempted = true\n        }\n        this.monitor.recordConnect()\n        return this.subscriptions.reload()\n      case message_types.disconnect:\n        logger.log(`Disconnecting. Reason: ${reason}`)\n        return this.close({allowReconnect: reconnect})\n      case message_types.ping:\n        return null\n      case message_types.confirmation:\n        this.subscriptions.confirmSubscription(identifier)\n        if (this.reconnectAttempted) {\n          this.reconnectAttempted = false\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: true})\n        } else {\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: false})\n        }\n      case message_types.rejection:\n        return this.subscriptions.reject(identifier)\n      default:\n        return this.subscriptions.notify(identifier, \"received\", message)\n    }\n  },\n\n  open() {\n    logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`)\n    this.disconnected = false\n    if (!this.isProtocolSupported()) {\n      logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\")\n      return this.close({allowReconnect: false})\n    }\n  },\n\n  close(event) {\n    logger.log(\"WebSocket onclose event\")\n    if (this.disconnected) { return }\n    this.disconnected = true\n    this.monitor.recordDisconnect()\n    return this.subscriptions.notifyAll(\"disconnected\", {willAttemptReconnect: this.monitor.isRunning()})\n  },\n\n  error() {\n    logger.log(\"WebSocket onerror event\")\n  }\n}\n\nexport default Connection\n", "// A new subscription is created through the ActionCable.Subscriptions instance available on the consumer.\n// It provides a number of callbacks and a method for calling remote procedure calls on the corresponding\n// Channel instance on the server side.\n//\n// An example demonstrates the basic functionality:\n//\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\", {\n//     connected() {\n//       // Called once the subscription has been successfully completed\n//     },\n//\n//     disconnected({ willAttemptReconnect: boolean }) {\n//       // Called when the client has disconnected with the server.\n//       // The object will have an `willAttemptReconnect` property which\n//       // says whether the client has the intention of attempting\n//       // to reconnect.\n//     },\n//\n//     appear() {\n//       this.perform('appear', {appearing_on: this.appearingOn()})\n//     },\n//\n//     away() {\n//       this.perform('away')\n//     },\n//\n//     appearingOn() {\n//       $('main').data('appearing-on')\n//     }\n//   })\n//\n// The methods #appear and #away forward their intent to the remote AppearanceChannel instance on the server\n// by calling the `perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away).\n// The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter.\n//\n// This is how the server component would look:\n//\n//   class AppearanceChannel < ApplicationActionCable::Channel\n//     def subscribed\n//       current_user.appear\n//     end\n//\n//     def unsubscribed\n//       current_user.disappear\n//     end\n//\n//     def appear(data)\n//       current_user.appear on: data['appearing_on']\n//     end\n//\n//     def away\n//       current_user.away\n//     end\n//   end\n//\n// The \"AppearanceChannel\" name is automatically mapped between the client-side subscription creation and the server-side Ruby class name.\n// The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the perform method.\n\nconst extend = function(object, properties) {\n  if (properties != null) {\n    for (let key in properties) {\n      const value = properties[key]\n      object[key] = value\n    }\n  }\n  return object\n}\n\nexport default class Subscription {\n  constructor(consumer, params = {}, mixin) {\n    this.consumer = consumer\n    this.identifier = JSON.stringify(params)\n    extend(this, mixin)\n  }\n\n  // Perform a channel action with the optional data passed as an attribute\n  perform(action, data = {}) {\n    data.action = action\n    return this.send(data)\n  }\n\n  send(data) {\n    return this.consumer.send({command: \"message\", identifier: this.identifier, data: JSON.stringify(data)})\n  }\n\n  unsubscribe() {\n    return this.consumer.subscriptions.remove(this)\n  }\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring channel subscribe command is confirmed, retrying until confirmation is received.\n// Internal class, not intended for direct user manipulation.\n\nclass SubscriptionGuarantor {\n  constructor(subscriptions) {\n    this.subscriptions = subscriptions\n    this.pendingSubscriptions = []\n  }\n\n  guarantee(subscription) {\n    if(this.pendingSubscriptions.indexOf(subscription) == -1){ \n      logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`)\n      this.pendingSubscriptions.push(subscription) \n    }\n    else {\n      logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`)\n    }\n    this.startGuaranteeing()\n  }\n\n  forget(subscription) {\n    logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`)\n    this.pendingSubscriptions = (this.pendingSubscriptions.filter((s) => s !== subscription))\n  }\n\n  startGuaranteeing() {\n    this.stopGuaranteeing()\n    this.retrySubscribing()\n  }\n  \n  stopGuaranteeing() {\n    clearTimeout(this.retryTimeout)\n  }\n\n  retrySubscribing() {\n    this.retryTimeout = setTimeout(() => {\n      if (this.subscriptions && typeof(this.subscriptions.subscribe) === \"function\") {\n        this.pendingSubscriptions.map((subscription) => {\n          logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`)\n          this.subscriptions.subscribe(subscription)\n        })\n      }\n    }\n    , 500)\n  }\n}\n\nexport default SubscriptionGuarantor", "import logger from \"./logger\"\nimport Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\n\n// Collection class for creating (and internally managing) channel subscriptions.\n// The only method intended to be triggered by the user is ActionCable.Subscriptions#create,\n// and it should be called through the consumer like so:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n\nexport default class Subscriptions {\n  constructor(consumer) {\n    this.consumer = consumer\n    this.guarantor = new SubscriptionGuarantor(this)\n    this.subscriptions = []\n  }\n\n  create(channelName, mixin) {\n    const channel = channelName\n    const params = typeof channel === \"object\" ? channel : {channel}\n    const subscription = new Subscription(this.consumer, params, mixin)\n    return this.add(subscription)\n  }\n\n  // Private\n\n  add(subscription) {\n    this.subscriptions.push(subscription)\n    this.consumer.ensureActiveConnection()\n    this.notify(subscription, \"initialized\")\n    this.subscribe(subscription)\n    return subscription\n  }\n\n  remove(subscription) {\n    this.forget(subscription)\n    if (!this.findAll(subscription.identifier).length) {\n      this.sendCommand(subscription, \"unsubscribe\")\n    }\n    return subscription\n  }\n\n  reject(identifier) {\n    return this.findAll(identifier).map((subscription) => {\n      this.forget(subscription)\n      this.notify(subscription, \"rejected\")\n      return subscription\n    })\n  }\n\n  forget(subscription) {\n    this.guarantor.forget(subscription)\n    this.subscriptions = (this.subscriptions.filter((s) => s !== subscription))\n    return subscription\n  }\n\n  findAll(identifier) {\n    return this.subscriptions.filter((s) => s.identifier === identifier)\n  }\n\n  reload() {\n    return this.subscriptions.map((subscription) =>\n      this.subscribe(subscription))\n  }\n\n  notifyAll(callbackName, ...args) {\n    return this.subscriptions.map((subscription) =>\n      this.notify(subscription, callbackName, ...args))\n  }\n\n  notify(subscription, callbackName, ...args) {\n    let subscriptions\n    if (typeof subscription === \"string\") {\n      subscriptions = this.findAll(subscription)\n    } else {\n      subscriptions = [subscription]\n    }\n\n    return subscriptions.map((subscription) =>\n      (typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined))\n  }\n\n  subscribe(subscription) {\n    if (this.sendCommand(subscription, \"subscribe\")) {\n      this.guarantor.guarantee(subscription)\n    }\n  }\n\n  confirmSubscription(identifier) {\n    logger.log(`Subscription confirmed ${identifier}`)\n    this.findAll(identifier).map((subscription) =>\n      this.guarantor.forget(subscription))\n  }\n\n  sendCommand(subscription, command) {\n    const {identifier} = subscription\n    return this.consumer.send({command, identifier})\n  }\n}\n", "import Connection from \"./connection\"\nimport Subscriptions from \"./subscriptions\"\n\n// The ActionCable.Consumer establishes the connection to a server-side Ruby Connection object. Once established,\n// the ActionCable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates.\n// The Consumer instance is also the gateway to establishing subscriptions to desired channels through the #createSubscription\n// method.\n//\n// The following example shows how this can be set up:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n//\n// When a consumer is created, it automatically connects with the server.\n//\n// To disconnect from the server, call\n//\n//   App.cable.disconnect()\n//\n// and to restart the connection:\n//\n//   App.cable.connect()\n//\n// Any channel subscriptions which existed prior to disconnecting will\n// automatically resubscribe.\n\nexport default class Consumer {\n  constructor(url) {\n    this._url = url\n    this.subscriptions = new Subscriptions(this)\n    this.connection = new Connection(this)\n    this.subprotocols = []\n  }\n\n  get url() {\n    return createWebSocketURL(this._url)\n  }\n\n  send(data) {\n    return this.connection.send(data)\n  }\n\n  connect() {\n    return this.connection.open()\n  }\n\n  disconnect() {\n    return this.connection.close({allowReconnect: false})\n  }\n\n  ensureActiveConnection() {\n    if (!this.connection.isActive()) {\n      return this.connection.open()\n    }\n  }\n\n  addSubProtocol(subprotocol) {\n    this.subprotocols = [...this.subprotocols, subprotocol]\n  }\n}\n\nexport function createWebSocketURL(url) {\n  if (typeof url === \"function\") {\n    url = url()\n  }\n\n  if (url && !/^wss?:/i.test(url)) {\n    const a = document.createElement(\"a\")\n    a.href = url\n    // Fix populating Location properties in IE. Otherwise, protocol will be blank.\n    a.href = a.href // eslint-disable-line\n    a.protocol = a.protocol.replace(\"http\", \"ws\")\n    return a.href\n  } else {\n    return url\n  }\n}\n", "import adapters from \"./adapters\"\nimport Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\nimport Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport Subscriptions from \"./subscriptions\"\n\nexport {\n  Connection,\n  ConnectionMonitor,\n  Consumer,\n  INTERNAL,\n  Subscription,\n  Subscriptions,\n  SubscriptionGuarantor,\n  adapters,\n  createWebSocketURL,\n  logger,\n}\n\nexport function createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n  return new Consumer(url)\n}\n\nexport function getConfig(name) {\n  const element = document.head.querySelector(`meta[name='action-cable-${name}']`)\n  if (element) {\n    return element.getAttribute(\"content\")\n  }\n}\n", "/*\nStimulus 3.2.1\nCopyright \u00A9 2023 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    hasBindings() {\n        return this.unorderedBindings.size > 0;\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            },\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map();\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach((eventListener) => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach((eventListener) => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding, clearEventListeners = false) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n        if (clearEventListeners)\n            this.clearEventListenersForBinding(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    clearEventListenersForBinding(binding) {\n        const eventListener = this.fetchEventListenerForBinding(binding);\n        if (!eventListener.hasBindings()) {\n            eventListener.disconnect();\n            this.removeMappedEventListenerFor(binding);\n        }\n    }\n    removeMappedEventListenerFor(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        eventListenerMap.delete(cacheKey);\n        if (eventListenerMap.size == 0)\n            this.eventListenerMaps.delete(eventTarget);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map();\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions)\n            .sort()\n            .forEach((key) => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst defaultActionDescriptorFilters = {\n    stop({ event, value }) {\n        if (value)\n            event.stopPropagation();\n        return true;\n    },\n    prevent({ event, value }) {\n        if (value)\n            event.preventDefault();\n        return true;\n    },\n    self({ event, value, element }) {\n        if (value) {\n            return element === event.target;\n        }\n        else {\n            return true;\n        }\n    },\n};\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    let eventName = matches[2];\n    let keyFilter = matches[3];\n    if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n        eventName += `.${keyFilter}`;\n        keyFilter = \"\";\n    }\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName,\n        eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n        identifier: matches[5],\n        methodName: matches[6],\n        keyFilter: matches[1] || keyFilter,\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions\n        .split(\":\")\n        .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction namespaceCamelize(value) {\n    return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"));\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nfunction isSomething(object) {\n    return object !== null && object !== undefined;\n}\nfunction hasProperty(object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"];\nclass Action {\n    constructor(element, index, descriptor, schema) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n        this.keyFilter = descriptor.keyFilter || \"\";\n        this.schema = schema;\n    }\n    static forToken(token, schema) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content), schema);\n    }\n    toString() {\n        const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\";\n        const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`;\n    }\n    shouldIgnoreKeyboardEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = this.keyFilter.split(\"+\");\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0];\n        if (!standardFilter) {\n            return false;\n        }\n        if (!hasProperty(this.keyMappings, standardFilter)) {\n            error(`contains unknown key filter: ${this.keyFilter}`);\n        }\n        return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase();\n    }\n    shouldIgnoreMouseEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = [this.keyFilter];\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        return false;\n    }\n    get params() {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n        for (const { name, value } of Array.from(this.element.attributes)) {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                params[camelize(key)] = typecast(value);\n            }\n        }\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n    get keyMappings() {\n        return this.schema.keyMappings;\n    }\n    keyFilterDissatisfied(event, filters) {\n        const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier));\n        return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift;\n    }\n}\nconst defaultEventNames = {\n    a: () => \"click\",\n    button: () => \"click\",\n    form: () => \"submit\",\n    details: () => \"toggle\",\n    input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n    select: () => \"change\",\n    textarea: () => \"input\",\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        const actionEvent = this.prepareActionEvent(event);\n        if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n            this.invokeWithEvent(actionEvent);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    applyEventModifiers(event) {\n        const { element } = this.action;\n        const { actionDescriptorFilters } = this.context.application;\n        const { controller } = this.context;\n        let passes = true;\n        for (const [name, value] of Object.entries(this.eventOptions)) {\n            if (name in actionDescriptorFilters) {\n                const filter = actionDescriptorFilters[name];\n                passes = passes && filter({ name, value, event, element, controller });\n            }\n            else {\n                continue;\n            }\n        }\n        return passes;\n    }\n    prepareActionEvent(event) {\n        return Object.assign(event, { params: this.action.params });\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            this.method.call(this.controller, event);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n            return false;\n        }\n        if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n            return false;\n        }\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(element, attributeName) {\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some((set) => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([_key, values]) => values.has(value))\n            .map(([key, _values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map();\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass SelectorObserver {\n    constructor(element, selector, delegate, details) {\n        this._selector = selector;\n        this.details = details;\n        this.elementObserver = new ElementObserver(element, this);\n        this.delegate = delegate;\n        this.matchesByElement = new Multimap();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    get selector() {\n        return this._selector;\n    }\n    set selector(selector) {\n        this._selector = selector;\n        this.refresh();\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    matchElement(element) {\n        const { selector } = this;\n        if (selector) {\n            const matches = element.matches(selector);\n            if (this.delegate.selectorMatchElement) {\n                return matches && this.delegate.selectorMatchElement(element, this.details);\n            }\n            return matches;\n        }\n        else {\n            return false;\n        }\n    }\n    matchElementsInTree(tree) {\n        const { selector } = this;\n        if (selector) {\n            const match = this.matchElement(tree) ? [tree] : [];\n            const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match));\n            return match.concat(matches);\n        }\n        else {\n            return [];\n        }\n    }\n    elementMatched(element) {\n        const { selector } = this;\n        if (selector) {\n            this.selectorMatched(element, selector);\n        }\n    }\n    elementUnmatched(element) {\n        const selectors = this.matchesByElement.getKeysForValue(element);\n        for (const selector of selectors) {\n            this.selectorUnmatched(element, selector);\n        }\n    }\n    elementAttributeChanged(element, _attributeName) {\n        const { selector } = this;\n        if (selector) {\n            const matches = this.matchElement(element);\n            const matchedBefore = this.matchesByElement.has(selector, element);\n            if (matches && !matchedBefore) {\n                this.selectorMatched(element, selector);\n            }\n            else if (!matches && matchedBefore) {\n                this.selectorUnmatched(element, selector);\n            }\n        }\n    }\n    selectorMatched(element, selector) {\n        this.delegate.selectorMatched(element, selector, this.details);\n        this.matchesByElement.add(selector, element);\n    }\n    selectorUnmatched(element, selector) {\n        this.delegate.selectorUnmatched(element, selector, this.details);\n        this.matchesByElement.delete(selector, element);\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map((attribute) => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap();\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach((token) => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach((token) => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString\n        .trim()\n        .split(/\\s+/)\n        .filter((content) => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap();\n        this.valuesByTokenByElement = new WeakMap();\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map();\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map();\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token, this.schema);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n    }\n    start() {\n        this.stringMapObserver.start();\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            try {\n                const value = descriptor.reader(rawValue);\n                let oldValue = rawOldValue;\n                if (rawOldValue) {\n                    oldValue = descriptor.reader(rawOldValue);\n                }\n                changedMethod.call(this.receiver, value, oldValue);\n            }\n            catch (error) {\n                if (error instanceof TypeError) {\n                    error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n                }\n                throw error;\n            }\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach((key) => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap();\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name));\n        return values;\n    }, new Set()));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : [];\n}\n\nclass OutletObserver {\n    constructor(context, delegate) {\n        this.started = false;\n        this.context = context;\n        this.delegate = delegate;\n        this.outletsByName = new Multimap();\n        this.outletElementsByName = new Multimap();\n        this.selectorObserverMap = new Map();\n        this.attributeObserverMap = new Map();\n    }\n    start() {\n        if (!this.started) {\n            this.outletDefinitions.forEach((outletName) => {\n                this.setupSelectorObserverForOutlet(outletName);\n                this.setupAttributeObserverForOutlet(outletName);\n            });\n            this.started = true;\n            this.dependentContexts.forEach((context) => context.refresh());\n        }\n    }\n    refresh() {\n        this.selectorObserverMap.forEach((observer) => observer.refresh());\n        this.attributeObserverMap.forEach((observer) => observer.refresh());\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.disconnectAllOutlets();\n            this.stopSelectorObservers();\n            this.stopAttributeObservers();\n        }\n    }\n    stopSelectorObservers() {\n        if (this.selectorObserverMap.size > 0) {\n            this.selectorObserverMap.forEach((observer) => observer.stop());\n            this.selectorObserverMap.clear();\n        }\n    }\n    stopAttributeObservers() {\n        if (this.attributeObserverMap.size > 0) {\n            this.attributeObserverMap.forEach((observer) => observer.stop());\n            this.attributeObserverMap.clear();\n        }\n    }\n    selectorMatched(element, _selector, { outletName }) {\n        const outlet = this.getOutlet(element, outletName);\n        if (outlet) {\n            this.connectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorUnmatched(element, _selector, { outletName }) {\n        const outlet = this.getOutletFromMap(element, outletName);\n        if (outlet) {\n            this.disconnectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorMatchElement(element, { outletName }) {\n        const selector = this.selector(outletName);\n        const hasOutlet = this.hasOutlet(element, outletName);\n        const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`);\n        if (selector) {\n            return hasOutlet && hasOutletController && element.matches(selector);\n        }\n        else {\n            return false;\n        }\n    }\n    elementMatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementAttributeValueChanged(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementUnmatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    connectOutlet(outlet, element, outletName) {\n        var _a;\n        if (!this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.add(outletName, outlet);\n            this.outletElementsByName.add(outletName, element);\n            (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName));\n        }\n    }\n    disconnectOutlet(outlet, element, outletName) {\n        var _a;\n        if (this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.delete(outletName, outlet);\n            this.outletElementsByName.delete(outletName, element);\n            (_a = this.selectorObserverMap\n                .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName));\n        }\n    }\n    disconnectAllOutlets() {\n        for (const outletName of this.outletElementsByName.keys) {\n            for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n                for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n                    this.disconnectOutlet(outlet, element, outletName);\n                }\n            }\n        }\n    }\n    updateSelectorObserverForOutlet(outletName) {\n        const observer = this.selectorObserverMap.get(outletName);\n        if (observer) {\n            observer.selector = this.selector(outletName);\n        }\n    }\n    setupSelectorObserverForOutlet(outletName) {\n        const selector = this.selector(outletName);\n        const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName });\n        this.selectorObserverMap.set(outletName, selectorObserver);\n        selectorObserver.start();\n    }\n    setupAttributeObserverForOutlet(outletName) {\n        const attributeName = this.attributeNameForOutletName(outletName);\n        const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this);\n        this.attributeObserverMap.set(outletName, attributeObserver);\n        attributeObserver.start();\n    }\n    selector(outletName) {\n        return this.scope.outlets.getSelectorForOutletName(outletName);\n    }\n    attributeNameForOutletName(outletName) {\n        return this.scope.schema.outletAttributeForScope(this.identifier, outletName);\n    }\n    getOutletNameFromOutletAttributeName(attributeName) {\n        return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName);\n    }\n    get outletDependencies() {\n        const dependencies = new Multimap();\n        this.router.modules.forEach((module) => {\n            const constructor = module.definition.controllerConstructor;\n            const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n            outlets.forEach((outlet) => dependencies.add(outlet, module.identifier));\n        });\n        return dependencies;\n    }\n    get outletDefinitions() {\n        return this.outletDependencies.getKeysForValue(this.identifier);\n    }\n    get dependentControllerIdentifiers() {\n        return this.outletDependencies.getValuesForKey(this.identifier);\n    }\n    get dependentContexts() {\n        const identifiers = this.dependentControllerIdentifiers;\n        return this.router.contexts.filter((context) => identifiers.includes(context.identifier));\n    }\n    hasOutlet(element, outletName) {\n        return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName);\n    }\n    getOutlet(element, outletName) {\n        return this.application.getControllerForElementAndIdentifier(element, outletName);\n    }\n    getOutletFromMap(element, outletName) {\n        return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element);\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get router() {\n        return this.application.router;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        this.outletObserver = new OutletObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        this.outletObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    refresh() {\n        this.outletObserver.refresh();\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.outletObserver.stop();\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    outletConnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element);\n    }\n    outletDisconnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended },\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () {\n            this.a.call(this);\n        };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b();\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor),\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap();\n        this.connectedContexts = new Set();\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap();\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set();\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName),\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass OutletSet {\n    constructor(scope, controllerElement) {\n        this.scope = scope;\n        this.controllerElement = controllerElement;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(outletName) {\n        return this.find(outletName) != null;\n    }\n    find(...outletNames) {\n        return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined);\n    }\n    findAll(...outletNames) {\n        return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []);\n    }\n    getSelectorForOutletName(outletName) {\n        const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName);\n        return this.controllerElement.getAttribute(attributeName);\n    }\n    findOutlet(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        if (selector)\n            return this.findElement(selector, outletName);\n    }\n    findAllOutlets(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        return selector ? this.findAllElements(selector, outletName) : [];\n    }\n    findElement(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName))[0];\n    }\n    findAllElements(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName));\n    }\n    matchesElement(element, selector, outletName) {\n        const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\";\n        return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName);\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n        this.outlets = new OutletSet(this.documentScope, element);\n    }\n    findElement(selector) {\n        return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...(this.element.matches(selector) ? [this.element] : []),\n            ...this.queryElements(selector).filter(this.containsElement),\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n    get isDocumentScope() {\n        return this.element === document.documentElement;\n    }\n    get documentScope() {\n        return this.isDocumentScope\n            ? this\n            : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap();\n        this.scopeReferenceCounts = new WeakMap();\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        return this.parseValueForElementAndIdentifier(element, identifier);\n    }\n    parseValueForElementAndIdentifier(element, identifier) {\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map();\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap();\n        this.modulesByIdentifier = new Map();\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n        const afterLoad = definition.controllerConstructor.afterLoad;\n        if (afterLoad) {\n            afterLoad.call(definition.controllerConstructor, definition.identifier, this.application);\n        }\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find((context) => context.element == element);\n        }\n    }\n    proposeToConnectScopeForElementAndIdentifier(element, identifier) {\n        const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier);\n        if (scope) {\n            this.scopeObserver.elementMatchedValue(scope.element, scope);\n        }\n        else {\n            console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and element:`, element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n    outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n    keyMappings: Object.assign(Object.assign({ enter: \"Enter\", tab: \"Tab\", esc: \"Escape\", space: \" \", up: \"ArrowUp\", down: \"ArrowDown\", left: \"ArrowLeft\", right: \"ArrowRight\", home: \"Home\", end: \"End\", page_up: \"PageUp\", page_down: \"PageDown\" }, objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c]))), objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n]))),\n};\nfunction objectFromEntries(array) {\n    return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {});\n}\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n        this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n    }\n    static start(element, schema) {\n        const application = new this(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        this.load({ identifier, controllerConstructor });\n    }\n    registerActionOption(name, filter) {\n        this.actionDescriptorFilters[name] = filter;\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach((definition) => {\n            if (definition.controllerConstructor.shouldLoad) {\n                this.router.loadDefinition(definition);\n            }\n        });\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map((context) => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise((resolve) => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            },\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            },\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            },\n        },\n    };\n}\n\nfunction OutletPropertiesBlessing(constructor) {\n    const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n    return outlets.reduce((properties, outletDefinition) => {\n        return Object.assign(properties, propertiesForOutletDefinition(outletDefinition));\n    }, {});\n}\nfunction getOutletController(controller, element, identifier) {\n    return controller.application.getControllerForElementAndIdentifier(element, identifier);\n}\nfunction getControllerAndEnsureConnectedScope(controller, element, outletName) {\n    let outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n    controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName);\n    outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n}\nfunction propertiesForOutletDefinition(name) {\n    const camelizedName = namespaceCamelize(name);\n    return {\n        [`${camelizedName}Outlet`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                    if (outletController)\n                        return outletController;\n                    throw new Error(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`);\n                }\n                throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n            },\n        },\n        [`${camelizedName}Outlets`]: {\n            get() {\n                const outlets = this.outlets.findAll(name);\n                if (outlets.length > 0) {\n                    return outlets\n                        .map((outletElement) => {\n                        const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                        if (outletController)\n                            return outletController;\n                        console.warn(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`, outletElement);\n                    })\n                        .filter((controller) => controller);\n                }\n                return [];\n            },\n        },\n        [`${camelizedName}OutletElement`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    return outletElement;\n                }\n                else {\n                    throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n                }\n            },\n        },\n        [`${camelizedName}OutletElements`]: {\n            get() {\n                return this.outlets.findAll(name);\n            },\n        },\n        [`has${capitalize(camelizedName)}Outlet`]: {\n            get() {\n                return this.outlets.has(name);\n            },\n        },\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            },\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            },\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            },\n        },\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            },\n        },\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair, controller) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            },\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            },\n        },\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition], controller) {\n    return valueDescriptorForTokenAndTypeDefinition({\n        controller,\n        token,\n        typeDefinition,\n    });\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array:\n            return \"array\";\n        case Boolean:\n            return \"boolean\";\n        case Number:\n            return \"number\";\n        case Object:\n            return \"object\";\n        case String:\n            return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\":\n            return \"boolean\";\n        case \"number\":\n            return \"number\";\n        case \"string\":\n            return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(payload) {\n    const { controller, token, typeObject } = payload;\n    const hasType = isSomething(typeObject.type);\n    const hasDefault = isSomething(typeObject.default);\n    const fullObject = hasType && hasDefault;\n    const onlyType = hasType && !hasDefault;\n    const onlyDefault = !hasType && hasDefault;\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default);\n    if (onlyType)\n        return typeFromObject;\n    if (onlyDefault)\n        return typeFromDefaultValue;\n    if (typeFromObject !== typeFromDefaultValue) {\n        const propertyPath = controller ? `${controller}.${token}` : token;\n        throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`);\n    }\n    if (fullObject)\n        return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n    const { controller, token, typeDefinition } = payload;\n    const typeObject = { controller, token, typeObject: typeDefinition };\n    const typeFromObject = parseValueTypeObject(typeObject);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    const propertyPath = controller ? `${controller}.${typeDefinition}` : token;\n    throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const hasDefault = hasProperty(typeDefinition, \"default\");\n    const hasType = hasProperty(typeDefinition, \"type\");\n    const typeObject = typeDefinition;\n    if (hasDefault)\n        return typeObject.default;\n    if (hasType) {\n        const { type } = typeObject;\n        const constantFromType = parseValueTypeConstant(type);\n        if (constantFromType)\n            return defaultValuesByType[constantFromType];\n    }\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n    const { token, typeDefinition } = payload;\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(payload);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() {\n            return defaultValueForDefinition(typeDefinition);\n        },\n        get hasCustomDefaultValue() {\n            return parseValueTypeDefault(typeDefinition) !== undefined;\n        },\n        reader: readers[type],\n        writer: writers[type] || writers.default,\n    };\n}\nconst defaultValuesByType = {\n    get array() {\n        return [];\n    },\n    boolean: false,\n    number: 0,\n    get object() {\n        return {};\n    },\n    string: \"\",\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n    },\n    number(value) {\n        return Number(value.replace(/_/g, \"\"));\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`);\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    },\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON,\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    static afterLoad(_identifier, _application) {\n        return;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get outlets() {\n        return this.scope.outlets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true, } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [\n    ClassPropertiesBlessing,\n    TargetPropertiesBlessing,\n    ValuePropertiesBlessing,\n    OutletPropertiesBlessing,\n];\nController.targets = [];\nController.outlets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, SelectorObserver, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n", "import { Application } from \"@hotwired/stimulus\"\n\nconst application = Application.start()\n\n// Configure Stimulus development experience\napplication.debug = false\nwindow.Stimulus   = application\n\nexport { application }\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"input\", \"autocompleteIdField\", \"boostScoreInput\"]\n  static values = {\n    findIdUrl: String\n  }\n\n  connect() {\n    // Set up boost score button handler\n    this.setupBoostScoreButton()\n  }\n\n  handleAutocompleteSelected(event) {\n    const suggestion = event.detail?.suggestion\n    if (!suggestion || !suggestion.slug) return\n\n    // Prevent default navigation if still happening\n    event.preventDefault()\n    event.stopPropagation()\n\n    // Find the autocomplete_id from the slug\n    fetch(`${this.findIdUrlValue}?slug=${encodeURIComponent(suggestion.slug)}`)\n      .then(response => response.json())\n      .then(data => {\n        if (data.autocomplete_id) {\n          this.autocompleteIdFieldTarget.value = data.autocomplete_id\n\n          // Update input to show selected place\n          const input = this.inputTarget\n          let displayName = suggestion.name\n          if (suggestion.locality_name) displayName += ', ' + suggestion.locality_name\n          if (suggestion.region_name) displayName += ', ' + suggestion.region_name\n          if (typeof $ !== 'undefined' && $(input).data('ttTypeahead')) {\n            $(input).typeahead('val', displayName)\n            // Hide the dropdown\n            $(input).siblings('.tt-menu').hide()\n          }\n\n          // Update polygon info display\n          const polygonInfo = document.getElementById('polygon-info')\n          const polygonType = document.getElementById('polygon-type')\n          const polygonCountry = document.getElementById('polygon-country')\n          if (polygonInfo && polygonType && polygonCountry) {\n            polygonType.textContent = data.polygon_type || '-'\n            polygonCountry.textContent = data.country_name || '-'\n            polygonInfo.classList.remove('hidden')\n          }\n        } else {\n          alert('Could not find autocomplete_id for selected place')\n        }\n      })\n      .catch(error => {\n        console.error('Error finding autocomplete_id:', error)\n        alert('Error finding autocomplete_id. Please try again.')\n      })\n  }\n\n  setupBoostScoreButton() {\n    const button = this.element.querySelector('#set-boost-100')\n    if (button && this.hasBoostScoreInputTarget) {\n      button.addEventListener('click', (e) => {\n        e.preventDefault()\n        this.boostScoreInputTarget.value = 100\n        // Trigger input event to ensure form validation sees the change\n        this.boostScoreInputTarget.dispatchEvent(new Event('input', { bubbles: true }))\n      })\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nString.prototype.capitalize = function() {\n  return this.replace(/(?:^|\\s)\\S/g, function(a) { return a.toUpperCase(); });\n};\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    chartDataSeries: Object, // Object with multiple series { premium: [[date, value]], high_performing: [[date, value]], ... }\n    locale: String,\n    today: Number,\n    currencyCode: { type: String, default: 'USD' },\n    selectedTier: { type: String, default: 'mid_range' }\n  }\n  static activeClasses = ['bg-[#E4F0EA]', 'border-[#1F6F54]', 'text-[#0C1A14]', 'shadow-sm']\n  static inactiveClasses = ['bg-gray-50', 'border-gray-200', 'text-gray-500', 'shadow-sm', 'hover:shadow-md']\n\n  connect() {\n    this.chart = null\n    // Calculate global min/max across all tiers for fixed scale\n    this.calculateGlobalScale()\n    this.initializeChart()\n  }\n\n  calculateGlobalScale() {\n    let globalMax = -Infinity\n\n    // Iterate through all tier data series to find the maximum value\n    Object.values(this.chartDataSeriesValue).forEach(seriesData => {\n      if (Array.isArray(seriesData)) {\n        seriesData.forEach(([date, value]) => {\n          if (typeof value === 'number') {\n            globalMax = Math.max(globalMax, value)\n          }\n        })\n      }\n    })\n\n    // Always start at 0, add padding (5%) to the max\n    this.globalMin = 0\n    this.globalMax = globalMax * 1.05\n  }\n\n  selectTier(event) {\n    const tier = event.currentTarget.dataset.tier\n    if (tier === this.selectedTierValue) return\n\n    this.selectedTierValue = tier\n    this.updateActiveButton()\n    this.updateChart()\n  }\n\n  updateActiveButton() {\n    const buttons = this.element.querySelectorAll('.adr-tier-selector')\n    buttons.forEach(button => {\n      const buttonTier = button.dataset.tier\n      button.classList.remove(...this.constructor.activeClasses, ...this.constructor.inactiveClasses)\n      if (buttonTier === this.selectedTierValue) {\n        button.classList.add(...this.constructor.activeClasses)\n      } else {\n        button.classList.add(...this.constructor.inactiveClasses)\n      }\n    })\n  }\n\n  updateChart() {\n    const chartData = this.chartDataSeriesValue[this.selectedTierValue]\n    if (!chartData || !this.chart) return\n\n    // Update chart data\n    this.chart.data.labels = chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(this.localeValue, { month: 'short', timeZone: 'UTC' }).capitalize())\n    this.chart.data.datasets[0].data = chartData.map(([, value]) => value)\n\n    // Update tooltip title\n    this.chart.options.plugins.tooltip.callbacks.title = (tooltipItems) => {\n      const dataIndex = tooltipItems[0].dataIndex\n      const dateString = chartData[dataIndex][0]\n      const date = new Date(dateString + 'T00:00:00Z')\n      return date.toLocaleString(this.localeValue, {\n        month: 'long',\n        year: 'numeric',\n        timeZone: 'UTC'\n      })\n    }\n\n    this.chart.update()\n  }\n\n  initializeChart() {\n    const canvasElement = this.canvasTarget\n    const ctx = canvasElement.getContext('2d')\n    const chartData = this.chartDataSeriesValue[this.selectedTierValue] || this.chartDataSeriesValue['mid_range']\n    const dates = chartData.map(([date]) => new Date(date))\n    const todayValue = this.todayValue\n    const localeValue = this.localeValue\n    const currencyCodeValue = this.currencyCodeValue\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      type: 'line', // ADR chart is a line chart\n      data: {\n        labels: chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(localeValue, { month: 'short', timeZone: 'UTC' }).capitalize()),\n        datasets: [{\n          data: chartData.map(([, value]) => value),\n          tension: 0,\n          segment: {\n            borderDash: ctx => {\n              const currentDate = dates[ctx.p1DataIndex]\n              const now = new Date(todayValue)\n              return currentDate >= now ? [5, 5] : []\n            }\n          },\n          borderColor: function(context) {\n            const chart = context.chart\n            const {ctx, chartArea} = chart\n            if (!chartArea) {\n              return\n            }\n            return getGradient(ctx, chartArea)\n          },\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const {ctx, chartArea} = chart\n            if (!chartArea) {\n              return\n            }\n            const gradient = getGradient(ctx, chartArea)\n            const currentDate = dates[context.dataIndex]\n            const now = new Date(todayValue)\n            if (currentDate >= now) {\n              return 'rgba(31, 111, 84, 0.3)'\n            }\n            return gradient\n          },\n          pointBackgroundColor: '#8FCBB0',\n          pointRadius: 2,\n          pointHoverRadius: 4\n        }]\n      },\n      options: {\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: false\n          },\n          tooltip: {\n            callbacks: {\n              title: (tooltipItems) => {\n                const dataIndex = tooltipItems[0].dataIndex\n                const dateString = chartData[dataIndex][0]\n                const date = new Date(dateString + 'T00:00:00Z')\n                return date.toLocaleString(localeValue, {\n                  month: 'long',\n                  year: 'numeric',\n                  timeZone: 'UTC'\n                })\n              },\n              label: (context) => {\n                const value = context.raw\n                return new Intl.NumberFormat(localeValue, {\n                  style: 'currency',\n                  currency: currencyCodeValue,\n                  minimumFractionDigits: 0,\n                  maximumFractionDigits: 0\n                }).format(value)\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            grid: {\n              display: false\n            }\n          },\n          y: {\n            min: this.globalMin,\n            max: this.globalMax,\n            grid: {\n              drawOnChartArea: true\n            },\n            ticks: {\n              callback: (value) => {\n                return new Intl.NumberFormat(localeValue, {\n                  style: 'currency',\n                  currency: currencyCodeValue,\n                  minimumFractionDigits: 0,\n                  maximumFractionDigits: 0,\n                  notation: 'compact'\n                }).format(value)\n              }\n            }\n          }\n        }\n      }\n    })\n\n    // Set initial active button\n    this.updateActiveButton()\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    labels: Array,\n    listingCounts: Array,\n    totalListings: Number\n  }\n\n  connect() {\n    this.chart = null\n    this.initializeChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  initializeChart() {\n    const canvas = this.hasCanvasTarget ? this.canvasTarget : this.element\n    const ctx = canvas.getContext('2d')\n\n    // Calculate percentages\n    const percentages = this.listingCountsValue.map(count =>\n      parseFloat(((count / this.totalListingsValue) * 100).toFixed(1))\n    )\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: this.labelsValue,\n        datasets: [{\n          type: 'bar',\n          data: percentages,\n          barThickness: 8,\n          borderRadius: 4,\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const { ctx, chartArea } = chart\n\n            if (!chartArea) {\n              return\n            }\n            return getGradient(ctx, chartArea)\n          }\n        }]\n      },\n      options: {\n        indexAxis: 'y',\n        maintainAspectRatio: false,\n        plugins: {\n          legend: { display: false },\n          tooltip: {\n            callbacks: {\n              label: function(context) {\n                return `${context.parsed.x}%`\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            display: true,\n            grid: {\n              display: false\n            },\n            ticks: {\n              callback: function(value) {\n                return value + '%'\n              }\n            }\n          },\n          y: {\n            grid: {\n              display: false\n            }\n          }\n        }\n      }\n    })\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"checkbox\", \"clearButton\"]\n\n  connect() {\n    this.submitting = false\n    this.wired = false\n    this.wireDropdownRetries = 0\n    this.form = this.element.querySelector(\"form\")\n\n    if (this.form) {\n      this.boundSubmit = () => {\n        this.submitting = true\n        this.persistInitialCheckedState()\n      }\n      this.form.addEventListener(\"submit\", this.boundSubmit)\n    }\n\n    this.boundOpen = () => this.handleOpen()\n    this.boundClose = () => this.handleClose()\n    this.boundDocumentClick = this.handleDocumentClick.bind(this)\n\n    this.element.addEventListener(\"open.hs.dropdown\", this.boundOpen)\n    this.element.addEventListener(\"close.hs.dropdown\", this.boundClose)\n    document.addEventListener(\"click\", this.boundDocumentClick, true)\n\n    requestAnimationFrame(() => this.wireDropdownInstance())\n\n    if (this.hasClearButtonTarget) {\n      this.setupClearButton()\n    }\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"open.hs.dropdown\", this.boundOpen)\n    this.element.removeEventListener(\"close.hs.dropdown\", this.boundClose)\n    document.removeEventListener(\"click\", this.boundDocumentClick, true)\n\n    if (this.form && this.boundSubmit) {\n      this.form.removeEventListener(\"submit\", this.boundSubmit)\n    }\n  }\n\n  wireDropdownInstance() {\n    if (typeof HSDropdown === \"undefined\") {\n      if (++this.wireDropdownRetries < 20) {\n        requestAnimationFrame(() => this.wireDropdownInstance())\n      }\n      return\n    }\n\n    if (!window.$hsDropdownCollection) {\n      HSDropdown.autoInit()\n    }\n\n    let collectionItem = window.$hsDropdownCollection?.find(\n      item => item.element.el === this.element\n    )\n\n    if (!collectionItem) {\n      new HSDropdown(this.element)\n      collectionItem = window.$hsDropdownCollection?.find(\n        item => item.element.el === this.element\n      )\n    }\n\n    if (!collectionItem) {\n      if (++this.wireDropdownRetries < 20) {\n        requestAnimationFrame(() => this.wireDropdownInstance())\n      }\n      return\n    }\n\n    if (this.wired) return\n\n    this.wired = true\n    collectionItem.element.on(\"open\", this.boundOpen)\n    collectionItem.element.on(\"close\", this.boundClose)\n  }\n\n  handleOpen() {\n    this.submitting = false\n  }\n\n  handleClose() {\n    this.applyPendingChanges()\n  }\n\n  handleDocumentClick(event) {\n    if (!this.element.classList.contains(\"open\")) return\n    if (this.element.contains(event.target)) return\n\n    this.applyPendingChanges()\n  }\n\n  applyPendingChanges() {\n    if (this.submitting || !this.checkboxesDirty()) return\n\n    setTimeout(() => {\n      if (this.submitting || !this.checkboxesDirty()) return\n      this.submitForm()\n    }, 0)\n  }\n\n  setupClearButton() {\n    this.clearButtonTarget.addEventListener(\"click\", (e) => {\n      e.preventDefault()\n      this.checkboxTargets.forEach(checkbox => {\n        checkbox.checked = false\n      })\n      this.submitForm()\n    })\n  }\n\n  persistInitialCheckedState() {\n    this.checkboxTargets.forEach(checkbox => {\n      checkbox.dataset.initialChecked = checkbox.checked ? \"true\" : \"false\"\n    })\n  }\n\n  isInitiallyChecked(checkbox) {\n    if (checkbox.hasAttribute(\"data-initial-checked\")) {\n      const value = checkbox.getAttribute(\"data-initial-checked\")\n      if (value === \"false\") return false\n\n      return true\n    }\n\n    return checkbox.defaultChecked\n  }\n\n  checkboxesDirty() {\n    return this.checkboxTargets.some(checkbox => {\n      return checkbox.checked !== this.isInitiallyChecked(checkbox)\n    })\n  }\n\n  submitForm() {\n    if (!this.form) return\n\n    this.submitting = true\n\n    if (typeof this.form.requestSubmit === \"function\") {\n      this.form.requestSubmit()\n    } else {\n      this.form.submit()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    apiKey: String,\n    userEmail: String,\n    plan: String,\n    primaryIntent: String,\n    trackEvents: Boolean\n  }\n\n  initialize() {\n    if (!this.trackEventsValue || !window.amplitude) {\n      return\n    }\n\n    if (!window.__amplitudeInitialized) {\n      if (window.sessionReplay) {\n        const plugin = window.sessionReplay.plugin({\n          sampleRate: 1\n        });\n        window.amplitude.add(plugin);\n      }\n\n      if (window.engagement) {\n        window.amplitude.add(window.engagement.plugin());\n      }\n\n      window.amplitude.init(this.apiKeyValue, {\n        autocapture: {\n          elementInteractions: true\n        }\n      })\n\n      window.__amplitudeInitialized = true\n    }\n\n    // Set user properties if available\n    if (this.hasUserEmailValue) {\n      window.amplitude.setUserId(this.userEmailValue)\n    }\n\n    if (this.hasPlanValue) {\n      this.trackUserProperty('plan', this.planValue)\n    }\n\n    // Set primary intent user property if available\n    if (this.hasPrimaryIntentValue && this.primaryIntentValue) {\n      this.trackUserProperty('user_primary_intent', this.primaryIntentValue)\n    }\n\n    this.trackUserProperty('user_agent', this.getUserAgent())\n  }\n\n  connect() {\n    // Listen for track events from other controllers\n    this.element.addEventListener('trackEvent', (event) => {\n      const { name, properties } = event.detail;\n      this.trackEvent(name, properties)\n    })\n\n    this.element.addEventListener('trackUserProperty', (event) => {\n      const { name, value } = event.detail;\n      this.trackUserProperty(name, value)\n    })\n  }\n\n  trackUserProperty(name, value) {\n    if (this.trackEventsValue && typeof window.amplitude !== 'undefined') {\n      const identifyEvent = new window.amplitude.Identify();\n      identifyEvent.set(name, value)\n      window.amplitude.identify(identifyEvent)\n    } else {\n      console.log(\"[Amplitude DEBUG - User Property]\", name, value)\n    }\n  }\n\n  // Track custom events\n  track(event) {\n    const eventName = event.currentTarget.dataset.analyticsEvent\n    const eventProperties = this.parseEventProperties(event.currentTarget.dataset.analyticsProps)\n    this.trackEvent(eventName, eventProperties)\n  }\n\n  // Track form submission with form values\n  trackFormSubmit(event) {\n    const eventName = event.currentTarget.dataset.analyticsEvent || 'Form Submitted'\n    const baseProperties = this.parseEventProperties(event.currentTarget.dataset.analyticsProps)\n\n    // Capture form values\n    const form = event.currentTarget\n    const formData = new FormData(form)\n    const formProperties = {}\n\n    // Extract specific fields we want to track\n    const subjectField = form.querySelector('#contact-subject')\n    const emailField = form.querySelector('#contact-email')\n    const messageField = form.querySelector('#contact-message')\n\n    if (subjectField) {\n      formProperties.subject = subjectField.value\n    }\n    if (emailField) {\n      formProperties.email_address = emailField.value\n    }\n    if (messageField) {\n      formProperties.body = messageField.value\n    }\n\n    // Merge base properties with form properties\n    const allProperties = { ...baseProperties, ...formProperties }\n\n    this.trackEvent(eventName, allProperties)\n  }\n\n  trackEventFromDetail(event) {\n    const { name, properties } = event.detail || {}\n    if (name) this.trackEvent(name, properties)\n  }\n\n  // Helper method to track events\n  trackEvent(eventName, eventProperties = {}) {\n    if (this.trackEventsValue && typeof window.amplitude !== 'undefined') {\n      window.amplitude.track(eventName, eventProperties)\n    } else {\n      console.log(\"[Amplitude DEBUG]\", eventName, eventProperties)\n    }\n  }\n\n  // Helper method to parse event properties from data attribute\n  parseEventProperties(propsString) {\n    if (!propsString) return {}\n    try {\n      return JSON.parse(propsString)\n    } catch (e) {\n      console.error('Invalid analytics properties format:', e)\n      return {}\n    }\n  }\n\n  getUserAgent() {\n    return navigator.userAgent\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"mobileSearchContainer\", \"autocomplete\", \"pricingModal\", \"filtersExplainerModal\"]\n\n  static values = {\n    cityName: String,\n    source: String,\n    polygonId: String,\n    countryName: String\n  }\n\n  toggleMobileSearch() {\n    this.mobileSearchContainerTarget.classList.toggle(\"hidden\");\n    $(this.autocompleteTarget).focus();\n  }\n\n  openPricingModal(event) {\n    event.preventDefault()\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Pricing Modal Opened',\n      }\n    })\n    HSOverlay.open(this.pricingModalTarget)\n  }\n\n  openFiltersExplainerModal(event) {\n    event.preventDefault()\n\n    // Get city name from data attribute or controller value\n    const cityName = event.currentTarget?.dataset?.cityName || this.cityNameValue || null\n\n    // Track Filter Locked Clicked event\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Filter Locked Clicked',\n        properties: {\n          city_name: cityName\n        }\n      }\n    })\n\n    // Open the filters explainer modal\n    const filtersExplainerModal = document.querySelector('#filters-explainer-modal')\n    if (filtersExplainerModal) {\n      HSOverlay.open(filtersExplainerModal)\n    } else {\n      // Fallback to pricing modal if explainer modal doesn't exist\n      HSOverlay.open(this.pricingModalTarget)\n    }\n  }\n\n  openSignupModal(event) {\n    event.preventDefault()\n    const authSource = event?.params?.authSource || null\n    HSOverlay.open('#hs-modal-signup')\n    window.dispatchEvent(new CustomEvent('signup-modal:opened', {\n      detail: { authSource }\n    }))\n  }\n\n  smoothScrollTo(event) {\n    event.preventDefault()\n    const target = event.currentTarget.href.split('#')[1]\n    const targetElement = document.querySelector(`#${target}`)\n\n    // Scroll and then highlight\n    const scrollPromise = new Promise((resolve) => {\n      targetElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })\n      targetElement.classList.add('ring-2', 'ring-primary', 'transition-shadow', 'duration-1000')\n\n      // Since scrollIntoView doesn't return a promise, we'll wait a bit to ensure scroll completes\n      setTimeout(resolve, 5000)\n    })\n\n    scrollPromise.then(() => {\n      targetElement.classList.remove('ring-2', 'ring-primary', 'transition-shadow')\n    })\n  }\n\n  connect() {\n    // Auto-dismiss flash messages after 5 seconds if this controller is on the flash container\n    if (this.element.querySelector('[data-flash-message=\"true\"]')) {\n      this.autoDismissFlashMessages()\n    }\n\n    if (this.element !== document.body) return\n\n    this.onSignupModalOpened = this.trackSignupModalOpened.bind(this)\n    window.addEventListener('signup-modal:opened', this.onSignupModalOpened)\n  }\n\n  disconnect() {\n    if (!this.onSignupModalOpened) return\n\n    window.removeEventListener('signup-modal:opened', this.onSignupModalOpened)\n    this.onSignupModalOpened = null\n  }\n\n  trackSignupModalOpened(event) {\n    const authSource = event.detail?.authSource || null\n    if (authSource) {\n      sessionStorage.setItem('signup_modal_source', authSource)\n    }\n\n    const properties = { source: authSource }\n    if (authSource === 'auto_open') {\n      properties.trigger = 'auto_open'\n    } else if (authSource) {\n      properties.trigger = 'user_click'\n    }\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Signup Modal Opened',\n        properties\n      }\n    })\n  }\n\n  switchSection(event) {\n    event.preventDefault()\n    const sectionName = event.params.sectionName\n    const url = event.params.url\n\n    // Dispatch the event using Stimulus dispatch, which will bubble to window\n    this.dispatch('switch-section', {\n      detail: { sectionName, url },\n      prefix: 'story-tabs'\n    })\n  }\n\n  switchStoryTab(event) {\n    event.preventDefault()\n    const sectionId = event.params.sectionId\n\n    // Dispatch the event to switch tabs\n    window.dispatchEvent(new CustomEvent('story:switchTab', {\n      detail: { sectionId: sectionId }\n    }))\n  }\n\n  autoDismissFlashMessages() {\n    const flashMessages = this.element.querySelectorAll('[data-flash-message=\"true\"]')\n    flashMessages.forEach((message) => {\n      setTimeout(() => {\n        this.removeFlashMessage(message)\n      }, 5000)\n    })\n  }\n\n  dismissFlash(event) {\n    event.preventDefault()\n    const button = event.currentTarget\n    const flashMessage = button.closest('[data-flash-message=\"true\"]')\n    if (flashMessage) {\n      this.removeFlashMessage(flashMessage)\n    }\n  }\n\n  removeFlashMessage(flashMessage) {\n    flashMessage.style.transition = 'opacity 0.3s ease-out'\n    flashMessage.style.opacity = '0'\n    setTimeout(() => {\n      flashMessage.remove()\n      // If no flash messages remain, remove the container\n      const container = flashMessage.closest('.fixed.left-0.right-0.z-50')\n      if (container && container.querySelectorAll('[data-flash-message=\"true\"]').length === 0) {\n        container.remove()\n      }\n    }, 300)\n  }\n\n  trackCustomAreaButtonClick(event) {\n    const source = this.hasSourceValue ? this.sourceValue : 'unknown'\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Create Custom Area Button Clicked',\n        properties: {\n          source: source\n        }\n      }\n    })\n  }\n\n  trackViewInsightsClick(event) {\n    const polygonId = this.hasPolygonIdValue ? this.polygonIdValue : null\n    const countryName = this.hasCountryNameValue ? this.countryNameValue : null\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'View Insights Clicked',\n        properties: {\n          polygon_id: polygonId,\n          country_name: countryName\n        }\n      }\n    })\n  }\n\n  trackEditCustomAreaClick(event) {\n    const polygonId = this.hasPolygonIdValue ? this.polygonIdValue : null\n    const countryName = this.hasCountryNameValue ? this.countryNameValue : null\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Edit Custom Area Clicked',\n        properties: {\n          polygon_id: polygonId,\n          country_name: countryName\n        }\n      }\n    })\n  }\n\n  trackCustomAreaFormSubmit(event) {\n    const form = event.currentTarget\n\n    // Determine if this is create or update based on form action\n    const isCreate = form.action.includes('/custom-areas') && form.method === 'post'\n    const eventName = isCreate ? 'Custom Area Form Submitted' : 'Custom Area Update Form Submitted'\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: eventName\n      }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"modal\"]\n\n  connect() {\n    // Close modal when clicking outside\n    this.modalTarget.addEventListener('click', (e) => {\n      if (e.target === this.modalTarget) {\n        this.closeModal()\n      }\n    })\n  }\n\n  openModal() {\n    this.modalTarget.classList.remove('hidden')\n    // Prevent body scrolling when modal is open\n    document.body.style.overflow = 'hidden'\n  }\n\n  closeModal() {\n    this.modalTarget.classList.add('hidden')\n    document.body.style.overflow = 'auto'\n  }\n\n  // Handle the signup action\n  signup(event) {\n    event.preventDefault()\n    this.openModal()\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    locale: String,\n    action: String\n  }\n\n  initialize() {\n    this.element.addEventListener('pricing:toggleBillingType', this.toggleBillingType.bind(this))\n\n    if (this.hasActionValue) {\n      setTimeout(() => {\n        if (this.actionValue == 'signup_completed') {\n          const source = sessionStorage.getItem('signup_modal_source')\n          const properties = {}\n          if (source) properties.source = source\n\n          this.dispatch('trackEvent', {\n            prefix: null,\n            detail: {\n              name: 'Signup Completed',\n              properties\n            }\n          });\n        } else if (this.actionValue == 'signin_completed') {\n          this.dispatch('trackEvent', {\n            prefix: null,\n            detail: {\n              name: 'Sign In Completed'\n            }\n          });\n        }\n      }, 500)\n    }\n  }\n\n  toggleBillingType(event) {\n    const { billingType } = event.detail;\n    $(\"[data-auth-billing-type-param]\").attr('data-auth-billing-type-param', billingType);\n  }\n\n  signup(event) {\n    event.preventDefault()\n\n    const { action, planId, billingType, source, returnToPage } = event.params;\n\n    // Create a hidden form and submit it\n    const form = document.createElement('form')\n    form.method = 'POST'\n    form.action = '/auth/auth0'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').content\n    const csrfInput = document.createElement('input')\n    csrfInput.type = 'hidden'\n    csrfInput.name = 'authenticity_token'\n    csrfInput.value = csrfToken\n\n    // Add screen_hint param\n    const screenHintInput = document.createElement('input')\n    screenHintInput.type = 'hidden'\n    screenHintInput.name = 'screen_hint'\n    screenHintInput.value = 'signup'\n\n    // Add ui_locales param\n    const localeInput = document.createElement('input')\n    localeInput.type = 'hidden'\n    localeInput.name = 'ui_locales'\n    localeInput.value = this.localeValue\n\n    if (action) {\n      const originInput = document.createElement('input')\n      originInput.type = 'hidden'\n      originInput.name = 'origin'\n      const url = new URL(window.location.href);\n      url.searchParams.append('action', action);\n      url.searchParams.append('planId', planId);\n      url.searchParams.append('billingType', billingType);\n      originInput.value = url.toString();\n      form.appendChild(originInput);\n    }\n\n    if (returnToPage) {\n      window.sessionStorage.setItem('returnToPage', returnToPage)\n    }\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Signup Clicked',\n        properties: {\n          action,\n          planId,\n          billingType,\n          source\n        }\n      }\n    });\n\n    form.appendChild(csrfInput)\n    form.appendChild(screenHintInput)\n    form.appendChild(localeInput)\n\n    document.body.appendChild(form)\n    form.submit()\n  }\n\n  login(event) {\n    event.preventDefault()\n\n    const form = document.createElement('form')\n    form.method = 'POST'\n    form.action = '/auth/auth0'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').content\n    const csrfInput = document.createElement('input')\n    csrfInput.type = 'hidden'\n    csrfInput.name = 'authenticity_token'\n    csrfInput.value = csrfToken\n\n    // Add screen_hint param\n    const screenHintInput = document.createElement('input')\n    screenHintInput.type = 'hidden'\n    screenHintInput.name = 'screen_hint'\n    screenHintInput.value = 'signin'\n\n    // Add ui_locales param\n    const localeInput = document.createElement('input')\n    localeInput.type = 'hidden'\n    localeInput.name = 'ui_locales'\n    localeInput.value = this.localeValue\n\n    // Add origin param for redirecting back\n    const originInput = document.createElement('input')\n    originInput.type = 'hidden'\n    originInput.name = 'origin'\n    originInput.value = window.location.href\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Sign In Clicked'\n      }\n    });\n\n    form.appendChild(csrfInput)\n    form.appendChild(screenHintInput)\n    form.appendChild(localeInput)\n    form.appendChild(originInput)\n\n    document.body.appendChild(form)\n    form.submit()\n  }\n}", "function parseSearchedAt(value) {\n  if (value == null || value === \"\") return null\n  const parsed = typeof value === \"number\" ? value : Date.parse(value)\n  return Number.isFinite(parsed) ? parsed : null\n}\n\n// Insights stored before searched_at existed: keep array order but don't treat as \"just now\".\nconst LEGACY_INSIGHTS_OFFSET_MS = 30 * 24 * 60 * 60 * 1000\n\nfunction insightSearchedAt(item, index, total) {\n  const parsed = parseSearchedAt(item.searched_at)\n  if (parsed != null) return parsed\n\n  return Date.now() - LEGACY_INSIGHTS_OFFSET_MS - (total - 1 - index) * 60_000\n}\n\nexport function mergeRecentSearches({ insights = [], calculator = [], limit = null }) {\n  const normalizedInsights = insights.map((item, index) => ({\n    ...item,\n    type: \"insights\",\n    name: item.name || item.label || \"\",\n    searched_at: insightSearchedAt(item, index, insights.length)\n  }))\n\n  const normalizedCalculator = calculator.map((item) => ({\n    ...item,\n    type: \"calculator\",\n    name: item.label || item.name || \"\",\n    searched_at: parseSearchedAt(item.searched_at) ?? 0\n  }))\n\n  const merged = [...normalizedInsights, ...normalizedCalculator]\n    .sort((a, b) => b.searched_at - a.searched_at)\n\n  return limit ? merged.slice(0, limit) : merged\n}\n\nexport function filterRecentSearches(items, query) {\n  const normalizedQuery = query.toLowerCase()\n\n  return items.filter((item) => {\n    if (item.type === \"calculator\") {\n      return (item.name || \"\").toLowerCase().includes(normalizedQuery) ||\n        (item.subtitle || \"\").toLowerCase().includes(normalizedQuery)\n    }\n\n    return (item.name || \"\").toLowerCase().includes(normalizedQuery) ||\n      (item.locality_name && item.locality_name.toLowerCase().includes(normalizedQuery)) ||\n      (item.region_name && item.region_name.toLowerCase().includes(normalizedQuery))\n  })\n}\n", "/**\n * ISO 3166-1 alpha-2 from Google Places (new API) or Geocoder (legacy address_components).\n */\nexport function countryCodeFromPlace(place) {\n  const components = place?.addressComponents\n  if (!components?.length) return null\n\n  for (const component of components) {\n    const types = component.types || []\n    if (types.includes(\"country\")) {\n      const code = component.shortText || component.short_name\n      return code ? String(code).trim().toUpperCase() : null\n    }\n  }\n\n  return null\n}\n\nexport function countryCodeFromGeocoderResult(result) {\n  const components = result?.address_components\n  if (!components?.length) return null\n\n  for (const component of components) {\n    const types = component.types || []\n    if (types.includes(\"country\")) {\n      const code = component.short_name || component.shortText\n      return code ? String(code).trim().toUpperCase() : null\n    }\n  }\n\n  return null\n}\n", "let mapsLoadPromise = null\n\nexport function resolvedGoogleMapsApiKey() {\n  return (\n    document.querySelector('meta[name=\"google-maps-api-key\"]')?.getAttribute(\"content\")?.trim() || \"\"\n  )\n}\n\n// Google's dynamic library import bootstrap \u2014 script onload is not enough with loading=async.\nfunction ensureGoogleMapsBootstrap(options) {\n  if (window.google?.maps?.importLibrary) return\n\n  ;((g) => {\n    let h\n    const p = \"The Google Maps JavaScript API\"\n    const c = \"google\"\n    const l = \"importLibrary\"\n    const q = \"__ib__\"\n    const m = document\n    let b = window\n    b = b[c] || (b[c] = {})\n    const d = b.maps || (b.maps = {})\n    const r = new Set()\n    const e = new URLSearchParams()\n    const u = () =>\n      h ||\n      (h = new Promise((resolve, reject) => {\n        const a = m.createElement(\"script\")\n        e.set(\"libraries\", [...r] + \"\")\n        for (const k in g) {\n          e.set(k.replace(/[A-Z]/g, (t) => `_${t[0].toLowerCase()}`), g[k])\n        }\n        e.set(\"callback\", `${c}.maps.${q}`)\n        a.src = `https://maps.${c}apis.com/maps/api/js?${e}`\n        d[q] = resolve\n        a.onerror = () => reject(new Error(`${p} could not load.`))\n        a.nonce = m.querySelector(\"script[nonce]\")?.nonce || \"\"\n        m.head.append(a)\n      }))\n\n    if (d[l]) {\n      console.warn(`${p} only loads once. Ignoring:`, g)\n      return\n    }\n\n    d[l] = (lib, ...args) => r.add(lib) && u().then(() => d[l](lib, ...args))\n  })(options)\n}\n\nexport function loadGoogleMaps(apiKey, language) {\n  if (!apiKey) return Promise.reject(new Error(\"Missing Google Maps API key\"))\n\n  if (!mapsLoadPromise) {\n    mapsLoadPromise = (async () => {\n      const options = { key: apiKey, v: \"weekly\" }\n      if (language) options.language = language\n\n      ensureGoogleMapsBootstrap(options)\n      await window.google.maps.importLibrary(\"places\")\n      return window.google.maps\n    })().catch((error) => {\n      mapsLoadPromise = null\n      throw error\n    })\n  }\n\n  return mapsLoadPromise\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { mergeRecentSearches, filterRecentSearches } from \"../lib/merge_recent_searches\"\nimport { countryCodeFromGeocoderResult } from \"../lib/google_places_country\"\nimport { loadGoogleMaps, resolvedGoogleMapsApiKey } from \"../lib/google_maps\"\n\nexport default class extends Controller {\n  static targets = [\"input\"]\n  static values = {\n    path: String,\n    suffix: String,\n    noResultsMessage: String,\n    noAddressesMessage: String,\n    recentHeader: String,\n    noRecentSearchesMessage: String,\n    startSearchingMessage: String,\n    searchResultsHeader: String,\n    useStartUrl: Boolean,\n    disableNavigation: Boolean,\n    calculatorRecentSearches: { type: Array, default: [] },\n    calculatorResultsUrl: String,\n    calculatorStartUrl: String,\n    calculatorAddressCta: String,\n    calculatorDefaultBedrooms: { type: Number, default: 2 },\n    calculatorDefaultCapacity: { type: Number, default: 4 }\n  }\n\n  connect() {\n    // Initialize storage for original icon content\n    this.originalIconContent = null;\n\n    if (!this.hasInputTarget) return;\n\n    if (!this.hasRecentHeaderValue || !this.hasNoRecentSearchesMessageValue || !this.hasStartSearchingMessageValue || !this.hasSearchResultsHeaderValue) {\n      throw new Error('autocomplete_controller: missing required translation values')\n    }\n\n    const recentHeader = this.recentHeaderValue\n    const noRecentSearchesMessage = this.noRecentSearchesMessageValue\n    const startSearchingMessage = this.startSearchingMessageValue\n    const searchResultsHeader = this.searchResultsHeaderValue\n\n    // Get recent activity for display (insights localStorage + calculator from server)\n    const recentActivity = this.getMergedRecentActivity(3);\n\n    var locations = new Bloodhound({\n      datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),\n      queryTokenizer: Bloodhound.tokenizers.whitespace,\n      identify: function(obj) { return obj.id; },\n      indexRemote: true,\n      remote: {\n        url: '/search/autocomplete?q=%QUERY',\n        wildcard: '%QUERY'\n      },\n    });\n\n    locations.initialize();\n\n    const datasets = [];\n\n    // Add recent searches dataset if there are any\n    if (recentActivity.length > 0) {\n      datasets.push({\n        name: 'recent',\n        display: 'name',\n        source: function(query, syncCallback) {\n          // Show recent searches when query is empty or short\n          if (query.length <= 1) {\n            syncCallback(recentActivity);\n          } else {\n            // Filter recent searches by query\n            const filtered = filterRecentSearches(recentActivity, query);\n            syncCallback(filtered);\n          }\n        },\n        templates: {\n          header: `<div class=\"px-4 py-2 text-xs font-semibold text-gray-500 uppercase border-b border-gray-200\">${recentHeader}</div>`,\n          empty: function(context) {\n            // Only show empty state if we're showing recent searches (query length <= 1)\n            if (context.query.length <= 1) {\n              return `\n                <div class=\"px-4 py-6 text-center text-gray-400\">\n                  <div class=\"iconify mdi--clock-outline text-2xl mb-2 mx-auto\"></div>\n                  <div class=\"text-sm\">${noRecentSearchesMessage}</div>\n                  <div class=\"text-xs text-gray-300 mt-1\">${startSearchingMessage}</div>\n                </div>\n              `;\n            }\n            return '';\n          },\n          suggestion: (data) => this.recentSuggestionTemplate(data)\n        }\n      });\n    }\n\n    // Add main search dataset\n    datasets.push({\n      name: 'locations',\n      display: 'name',\n      source: function(query, syncCallback, asyncCallback) {\n        // Only search if there's an actual query (length > 1 to match original minLength behavior)\n        if (query.length >= 2) {\n          locations.ttAdapter()(query, syncCallback, asyncCallback);\n        } else {\n          // Return empty results for short queries\n          syncCallback([]);\n        }\n      },\n      limit: 12,\n      templates: {\n        header: recentActivity.length > 0 ? `<div class=\"px-4 py-2 text-xs font-semibold text-gray-500 uppercase border-b border-gray-200\">${searchResultsHeader}</div>` : null,\n        empty: (context) => {\n          const query = context.query;\n          // Only show \"no results\" message if we actually searched (query length >= 2)\n          if (query.length >= 2) {\n            if (this.looksLikeAddress(query) && this.hasCalculatorResultsUrlValue) {\n              return this.calculatorAddressSuggestionTemplate(query);\n            }\n\n            return `\n              <div class=\"p-4 text-sm text-gray-500\" data-no-results>\n                ${this.noResultsMessageValue}\n              </div>\n            `;\n          }\n          return '';\n        },\n        suggestion: function(data) {\n          // Special formatting for neighborhoods\n          if (data.t === 'n' && data.locality_name) {\n            return `\n              <div>\n                <div class='title'>\n                  ${data.name}, ${data.locality_name}\n                </div>\n                <div class='subtitle'>\n                  ${data.region_name}${data.country_name ? ', ' + data.country_name : ''}\n                </div>\n              </div>\n            `;\n          }\n\n          return `\n            <div>\n              <div class='title'>\n                ${data.name}${data.region_name ? ', ' + data.region_name : ''}\n              </div>\n              <div class='subtitle'>\n                ${data.crawling_area_name ? data.crawling_area_name + ', ' : ''}\n                ${data.country_name}\n              </div>\n            </div>\n          `;\n        }\n      }\n    });\n\n    $(this.inputTarget).typeahead({\n        hint: false,\n        highlight: false,\n        minLength: recentActivity.length > 0 ? 0 : 2,\n      }, ...datasets).on('typeahead:selected', (ev, suggestion) => {\n      if (suggestion.type === 'calculator') {\n        if (this.hasDisableNavigationValue && this.disableNavigationValue) {\n          return\n        }\n\n        window.location.href = suggestion.url\n        return\n      }\n\n      // Dispatch custom event for admin controllers to listen to\n      this.dispatch('autocompleteSelected', { \n        bubbles: true, \n        detail: { suggestion: suggestion } \n      })\n\n      // Track autocomplete selection in Amplitude\n      this.trackAutocompleteSelection(suggestion);\n\n      // Store the clicked result in localStorage\n      this.storeClickedResult(suggestion);\n\n      // Only navigate if navigation is not disabled\n      if (this.hasDisableNavigationValue && this.disableNavigationValue) {\n        // Navigation is disabled, stop here and let custom handlers take over\n        return;\n      }\n\n      // Show loading state - try new method first, fallback to old method\n      this.showLoadingState();\n\n      // Replace current subdomain with 'app' subdomain\n      const currentHost = window.location.host;\n      let targetHost;\n\n      // Check if host already has a subdomain\n      if (currentHost.includes('.')) {\n        // Host has a domain with subdomain\n        targetHost = currentHost.replace(/^[^.]*\\./, 'app.');\n      } else {\n        // Host is localhost without subdomain\n        targetHost = `app.${currentHost}`;\n      }\n\n      const protocol = window.location.protocol;\n      let targetUrl;\n\n      // Use dashboard_url with market_id if useStartUrl is true and safe_uuid is available\n      if (this.useStartUrlValue && suggestion.safe_uuid) {\n        targetUrl = `${protocol}//${targetHost}/dashboard?market_id=${suggestion.safe_uuid}`;\n      } else {\n        const path = this.pathValue && this.pathValue !== '' ? this.pathValue : 'insights';\n        const suffix = this.suffixValue && this.suffixValue !== '' ? `/${this.suffixValue}` : '';\n        targetUrl = `${protocol}//${targetHost}/${path}/${suggestion.slug}${suffix}`;\n      }\n\n      if (currentHost === targetHost) {\n        window.history.pushState({}, '', targetUrl);\n      }\n\n      window.location.href = targetUrl;\n    }).on('typeahead:render', (e, suggestion) => {\n      if (suggestion) {\n        var searchTerm = e.currentTarget.value;\n        $(e.currentTarget).siblings(\".tt-menu\").find('.title').mark(searchTerm);\n      }\n      this.bindCalculatorAddressClicks();\n    }).on('keyup', (e) => {\n      if (e.which === 13) {\n        const $menu = $(this.inputTarget).siblings('.tt-menu');\n        const isMenuVisible = $menu.hasClass('tt-open');\n        const $firstSuggestion = $menu.find('.tt-dataset-locations .tt-suggestion:first, .tt-dataset-recent .tt-suggestion:first');\n        const $calculatorCta = $menu.find('[data-calculator-address]').first();\n\n        // If menu is visible and has suggestions, but none is selected\n        if (isMenuVisible && !$menu.find('.tt-suggestion.tt-cursor').length) {\n          if ($firstSuggestion.length > 0) {\n            e.preventDefault();\n            e.stopPropagation();\n            $firstSuggestion.trigger('click');\n            return;\n          }\n\n          if ($calculatorCta.length > 0) {\n            e.preventDefault();\n            e.stopPropagation();\n            const raw = $calculatorCta.attr('data-calculator-address') || '';\n            this.navigateToCalculatorFromAddress(decodeURIComponent(raw));\n          }\n        }\n      }\n    });\n\n    this.bindCalculatorAddressClicks();\n\n    // Show recent searches on focus if input is empty\n    if (recentActivity.length > 0) {\n      $(this.inputTarget).on('focus', (e) => {\n        if (e.target.value.length === 0) {\n          $(e.target).typeahead('val', ' ').typeahead('val', '');\n        }\n      });\n    }\n  }\n\n  looksLikeAddress(query) {\n    return /\\d{2,}/.test(query);\n  }\n\n  calculatorAddressSuggestionTemplate(query) {\n    const escapedAddress = this.escapeHtml(query);\n    const message = (this.calculatorAddressCtaValue || \"\")\n      .replace(\"%{address}\", `<strong>${escapedAddress}</strong>`);\n\n    return `\n      <button type=\"button\" class=\"w-full text-left px-4 py-3 text-sm text-gray-700 hover:bg-[#E4F0EA] transition-colors\" data-calculator-address=\"${encodeURIComponent(query)}\">\n        <span class=\"iconify mdi--calculator text-[#1F6F54] inline-block align-middle mr-2\"></span>\n        <span>${message}</span>\n        <span class=\"iconify mdi--arrow-right inline-block align-middle text-[#1F6F54] ml-1\"></span>\n      </button>\n    `;\n  }\n\n  bindCalculatorAddressClicks() {\n    const $menu = $(this.inputTarget).siblings('.tt-menu');\n    $menu.find('[data-calculator-address]').off('click.calculatorAddress').on('click.calculatorAddress', (event) => {\n      event.preventDefault();\n      const raw = $(event.currentTarget).attr('data-calculator-address') || '';\n      this.navigateToCalculatorFromAddress(decodeURIComponent(raw));\n    });\n  }\n\n  async navigateToCalculatorFromAddress(address) {\n    if (!this.hasCalculatorResultsUrlValue) return;\n    if (this.hasDisableNavigationValue && this.disableNavigationValue) return;\n\n    const query = (address || \"\").trim();\n    if (!query) return;\n\n    this.showLoadingState();\n\n    try {\n      const apiKey = resolvedGoogleMapsApiKey();\n      if (!apiKey) throw new Error(\"Missing Google Maps API key\");\n\n      const language = (document.documentElement.lang || \"en\").split(\"-\")[0] || \"en\";\n      const maps = await loadGoogleMaps(apiKey, language);\n      const { Geocoder } = await maps.importLibrary(\"geocoding\");\n      const geocoder = new Geocoder();\n      const { results } = await geocoder.geocode({ address: query });\n\n      if (!results?.length) throw new Error(\"No geocoding results\");\n\n      const location = results[0].geometry?.location;\n      const lat = location?.lat?.();\n      const lng = location?.lng?.();\n      if (!Number.isFinite(lat) || !Number.isFinite(lng)) throw new Error(\"Invalid coordinates\");\n\n      const country = countryCodeFromGeocoderResult(results[0]);\n      if (!country) throw new Error(\"Missing country code\");\n\n      const params = new URLSearchParams({\n        lat: String(lat),\n        lng: String(lng),\n        address: results[0].formatted_address || query,\n        bedrooms: String(this.calculatorDefaultBedroomsValue),\n        capacity: String(this.calculatorDefaultCapacityValue),\n        country: country\n      });\n\n      window.location.href = `${this.calculatorResultsUrlValue}?${params.toString()}`;\n    } catch (error) {\n      console.error(\"Calculator address geocoding failed:\", error);\n      this.hideLoadingState();\n\n      if (this.hasCalculatorStartUrlValue) {\n        const params = new URLSearchParams({ address: query });\n        window.location.href = `${this.calculatorStartUrlValue}?${params.toString()}`;\n      }\n    }\n  }\n\n  escapeHtml(text) {\n    const div = document.createElement(\"div\");\n    div.textContent = text;\n    return div.innerHTML;\n  }\n\n  showLoadingState() {\n    // Try to find icon containers within the controller element in order of priority\n    const $controller = $(this.element);\n    const $iconContainer = $controller.find('#search-icon-container');\n    const $headerIconContainer = $controller.find('#header-search-icon-container');\n    const $mobileIconContainer = $controller.find('#mobile-search-icon-container');\n\n    if ($iconContainer.length) {\n      // Store original content before replacing\n      this.originalIconContent = $iconContainer.html();\n      $iconContainer.html(`\n        <svg class=\"animate-spin w-7 h-7 text-[#8FCBB0]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n          <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n          <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n        </svg>\n      `);\n\n      // After 10 seconds, restore the original icon content if still present\n      setTimeout(() => {\n        // Only restore if the loading spinner is still present and originalIconContent is set\n        if (this.originalIconContent && $iconContainer.length) {\n          $iconContainer.html(this.originalIconContent);\n          this.originalIconContent = null;\n        }\n      }, 10000);\n    } else if ($headerIconContainer.length) {\n      // Store original content before replacing\n      this.originalIconContent = $headerIconContainer.html();\n      $headerIconContainer.html(`\n        <svg class=\"animate-spin flex-shrink-0 size-4 text-gray-500\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n          <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n          <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n        </svg>\n      `);\n    } else if ($mobileIconContainer.length) {\n      // Store original content before replacing\n      this.originalIconContent = $mobileIconContainer.html();\n      $mobileIconContainer.html(`\n        <svg class=\"animate-spin flex-shrink-0 size-4 text-gray-500\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n          <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n          <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n        </svg>\n      `);\n    } else {\n      // Fallback to original loading indicator method for other autocomplete instances\n      const $input = $(this.inputTarget);\n      const $container = $input.parent();\n\n      this.cleanupOriginalLoadingIndicator();\n\n      // Create and append the loading indicator\n      const $loadingIndicator = $('<div class=\"loading-indicator absolute right-3 top-1/2 -translate-y-1/2\"><svg class=\"animate-spin h-5 w-5 text-gray-500\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"><circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle><path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path></svg></div>');\n      $container.append($loadingIndicator);\n\n      // Add right padding to input to prevent text overlap with loading indicator\n      $input.addClass('pr-10');\n    }\n  }\n\n  hideLoadingState() {\n    // Only restore if we have stored original content\n    if (!this.originalIconContent) {\n      // Fallback to original cleanup method for other autocomplete instances\n      this.cleanupOriginalLoadingIndicator();\n      return;\n    }\n\n    // Try to restore icons within the controller element in order of priority\n    const $controller = $(this.element);\n    const $iconContainer = $controller.find('#search-icon-container');\n    const $headerIconContainer = $controller.find('#header-search-icon-container');\n    const $mobileIconContainer = $controller.find('#mobile-search-icon-container');\n\n    if ($iconContainer.length) {\n      $iconContainer.html(this.originalIconContent);\n    } else if ($headerIconContainer.length) {\n      $headerIconContainer.html(this.originalIconContent);\n    } else if ($mobileIconContainer.length) {\n      $mobileIconContainer.html(this.originalIconContent);\n    }\n\n    // Clear the stored content\n    this.originalIconContent = null;\n  }\n\n  cleanupOriginalLoadingIndicator() {\n    if (!this.hasInputTarget) return;\n\n    const $input = $(this.inputTarget);\n    const $container = $input.parent();\n    $container.find('.loading-indicator').remove();\n    $input.removeClass('pr-10');\n  }\n\n  cleanupLoadingIndicator() {\n    // This method is kept for compatibility and now handles both cases\n    this.hideLoadingState();\n  }\n\n  storeClickedResult(suggestion) {\n    // Store the complete suggestion object for later use in recent activity\n    const storageItemKey = 'recentAutocompleteActivity';\n    let recentActivity = [];\n\n    try {\n      const stored = localStorage.getItem(storageItemKey);\n      if (stored) {\n        recentActivity = JSON.parse(stored);\n        // Ensure it's an array\n        if (!Array.isArray(recentActivity)) {\n          recentActivity = [];\n        }\n      }\n    } catch (e) {\n      console.error('Error parsing stored recent activity:', e);\n      recentActivity = [];\n    }\n\n    // Store all the data that's displayed in the autocomplete\n    const activityItem = {\n      name: suggestion.name,\n      locality_name: suggestion.locality_name,\n      region_name: suggestion.region_name,\n      crawling_area_name: suggestion.crawling_area_name,\n      country_name: suggestion.country_name,\n      slug: suggestion.slug,\n      t: suggestion.t, // polygon type\n      safe_uuid: suggestion.safe_uuid, // safe_uuid for start_url\n      searched_at: Date.now()\n    };\n\n    // Remove any existing entry with the same slug to avoid duplicates\n    recentActivity = recentActivity.filter(item => item.slug !== suggestion.slug);\n\n    // Add the new item at the beginning (most recent first)\n    recentActivity.unshift(activityItem);\n\n    // Limit the stored items to prevent localStorage from growing too large (e.g., keep last 50)\n    const maxItems = 50;\n    if (recentActivity.length > maxItems) {\n      recentActivity = recentActivity.slice(0, maxItems);\n    }\n\n    // Store back to localStorage\n    try {\n      localStorage.setItem(storageItemKey, JSON.stringify(recentActivity));\n      console.log(`Stored recent activity for: ${suggestion.name}`);\n\n      // Dispatch a custom event to notify other controllers\n      window.dispatchEvent(new CustomEvent('recentSearchesUpdated', {\n        detail: { suggestion: activityItem }\n      }));\n    } catch (e) {\n      console.error('Error storing recent activity:', e);\n      // If storage fails due to quota, try removing oldest items\n      if (e.name === 'QuotaExceededError' && recentActivity.length > 10) {\n        try {\n          recentActivity = recentActivity.slice(0, 10);\n          localStorage.setItem(storageItemKey, JSON.stringify(recentActivity));\n        } catch (retryError) {\n          console.error('Error storing recent activity even after reducing size:', retryError);\n        }\n      }\n    }\n  }\n\n  getMergedRecentActivity(limit) {\n    return mergeRecentSearches({\n      insights: this.getRecentActivity(null),\n      calculator: this.calculatorRecentSearchesItems(),\n      limit\n    })\n  }\n\n  calculatorRecentSearchesItems() {\n    const value = this.calculatorRecentSearchesValue\n    if (Array.isArray(value)) return value\n    if (typeof value === \"string\" && value.length > 0) {\n      try {\n        const parsed = JSON.parse(value)\n        return Array.isArray(parsed) ? parsed : []\n      } catch {\n        return []\n      }\n    }\n    return []\n  }\n\n  recentSuggestionTemplate(data) {\n    if (data.type === 'calculator') {\n      return `\n        <div>\n          <div class='title'>${data.name}</div>\n          <div class='subtitle'>${data.subtitle || ''}</div>\n        </div>\n      `\n    }\n\n    if (data.t === 'n' && data.locality_name) {\n      return `\n        <div>\n          <div class='title'>\n            ${data.name}, ${data.locality_name}\n          </div>\n          <div class='subtitle'>\n            ${data.region_name}${data.country_name ? ', ' + data.country_name : ''}\n          </div>\n        </div>\n      `\n    }\n\n    return `\n      <div>\n        <div class='title'>\n          ${data.name}${data.region_name ? ', ' + data.region_name : ''}\n        </div>\n        <div class='subtitle'>\n          ${data.crawling_area_name ? data.crawling_area_name + ', ' : ''}\n          ${data.country_name}\n        </div>\n      </div>\n    `\n  }\n\n  // Instance method to get recent activity for use within the controller\n  getRecentActivity(limit = 10) {\n    const storageItemKey = 'recentAutocompleteActivity';\n    try {\n      const stored = localStorage.getItem(storageItemKey);\n      const activity = stored ? JSON.parse(stored) : [];\n      const normalized = activity.map((item, index) => ({\n        ...item,\n        searched_at: item.searched_at ?? null\n      }));\n      return limit ? normalized.slice(0, limit) : normalized;\n    } catch (e) {\n      console.error('Error retrieving recent activity:', e);\n      return [];\n    }\n  }\n\n  // Utility method to get recent activity (can be called from browser console or used in autocomplete)\n  static getRecentActivity(limit = 10) {\n    const storageItemKey = 'recentAutocompleteActivity';\n    try {\n      const stored = localStorage.getItem(storageItemKey);\n      const activity = stored ? JSON.parse(stored) : [];\n      const normalized = activity.map((item) => ({\n        ...item,\n        searched_at: item.searched_at ?? null\n      }));\n      return limit ? normalized.slice(0, limit) : normalized;\n    } catch (e) {\n      console.error('Error retrieving recent activity:', e);\n      return [];\n    }\n  }\n\n  // Utility method to clear recent activity (can be called from browser console)\n  static clearRecentActivity() {\n    const storageItemKey = 'recentAutocompleteActivity';\n    try {\n      localStorage.removeItem(storageItemKey);\n      console.log('Cleared recent autocomplete activity');\n    } catch (e) {\n      console.error('Error clearing recent activity:', e);\n    }\n  }\n\n  // Utility method to remove a specific item from recent activity\n  static removeFromRecentActivity(slug) {\n    const storageItemKey = 'recentAutocompleteActivity';\n    try {\n      const stored = localStorage.getItem(storageItemKey);\n      if (stored) {\n        let recentActivity = JSON.parse(stored);\n        recentActivity = recentActivity.filter(item => item.slug !== slug);\n        localStorage.setItem(storageItemKey, JSON.stringify(recentActivity));\n        console.log(`Removed ${slug} from recent activity`);\n      }\n    } catch (e) {\n      console.error('Error removing item from recent activity:', e);\n    }\n  }\n\n  trackAutocompleteSelection(suggestion) {\n    // Dispatch event to amplitude controller (which is attached to body element)\n    const event = new CustomEvent('trackEvent', {\n      detail: {\n        name: 'Autocomplete Item Selected',\n        properties: {\n          autocomplete_name: suggestion.name,\n          autocomplete_slug: suggestion.slug,\n          autocomplete_type: suggestion.t,\n          locality_name: suggestion.locality_name || null,\n          region_name: suggestion.region_name || null,\n          country_name: suggestion.country_name || null,\n          crawling_area_name: suggestion.crawling_area_name || null\n        }\n      },\n      bubbles: true\n    });\n    document.body.dispatchEvent(event);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    labels: Array,\n    counts: Array\n  }\n\n  connect() {\n    this.chart = null\n    this.initializeChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  initializeChart() {\n    const canvas = this.hasCanvasTarget ? this.canvasTarget : this.element\n    const ctx = canvas.getContext('2d')\n\n    // Calculate total and percentages\n    const total = this.countsValue.reduce((sum, value) => sum + value, 0)\n    const percentages = this.countsValue.map(count =>\n      parseFloat(((count / total) * 100).toFixed(1))\n    )\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: this.labelsValue,\n        datasets: [{\n          type: 'bar',\n          data: percentages,\n          barThickness: 12,\n          borderRadius: 4,\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const { ctx, chartArea } = chart\n\n            if (!chartArea) {\n              return\n            }\n            return getGradient(ctx, chartArea)\n          }\n        }]\n      },\n      options: {\n        indexAxis: 'y',\n        maintainAspectRatio: false,\n        plugins: {\n          legend: { display: false },\n          tooltip: {\n            callbacks: {\n              label: function(context) {\n                return `${context.parsed.x}%`\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            display: true,\n            grid: {\n              display: false\n            },\n            ticks: {\n              callback: function(value) {\n                return value + '%'\n              }\n            }\n          },\n          y: {\n            grid: {\n              display: false\n            }\n          }\n        }\n      }\n    })\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    events: Array\n  }\n\n  connect() {\n    this.initializeCalendar()\n  }\n\n  initializeCalendar() {\n    this.calendar = new FullCalendar.Calendar(this.element, {\n      headerToolbar: {\n        left: 'today',\n        center: 'title',\n        right: 'prev,next'\n      },\n      displayEventTime: false,\n      events: this.eventsValue,\n      eventDidMount: this.eventDidMount,\n      dayCellDidMount: this.dayCellDidMount\n    })\n\n    this.calendar.render()\n  }\n\n  eventDidMount = (info) => {\n    let blocking_reason = ''\n    let review = ''\n    let discount = ''\n\n    if (info.event.extendedProps.blocking_reason) {\n      blocking_reason = `\n        <div class=\"flex justify-between py-1\">\n          <dt>Blocking reason</dt>\n          <dd>${info.event.extendedProps.blocking_reason}</dd>\n        </div>\n      `\n    }\n\n    if (info.event.extendedProps.review) {\n      review = `\n        <div class=\"flex justify-between py-1\">\n          <dt>Review</dt>\n          <dd>${info.event.extendedProps.review}</dd>\n        </div>\n      `\n    }\n\n    if (info.event.extendedProps.discount) {\n      discount = `\n        <div class=\"flex justify-between py-1\">\n          <dt>Discount</dt>\n          <dd>${info.event.extendedProps.discount}%</dd>\n        </div>\n      `\n    }\n\n    let tooltip = `\n      <div class=\"divide-y divide-gray-100 bg-white shadow-sm border w-80 px-2 rounded-lg text-sm\">\n        <div class=\"flex justify-between py-2\" style=\"z-index: 238293\">\n          <dt>Created at</dt>\n          <dd>${info.event.extendedProps.created_at}</dd>\n        </div>\n        ${blocking_reason}\n        ${review}\n        <div class=\"flex justify-between py-1\">\n          <dt>Lead days</dt>\n          <dd>${info.event.extendedProps.lead_days}</dd>\n        </div>\n        <div class=\"flex justify-between py-1\">\n          <dt>Duration</dt>\n          <dd>${info.event.extendedProps.booking_duration}</dd>\n        </div>\n        <div class=\"flex justify-between py-1\">\n          <dt>ADR</dt>\n          <dd>${info.event.extendedProps.adr}</dd>\n        </div>\n        ${discount}\n      </div>\n    `\n    if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip) {\n      new bootstrap.Tooltip(info.el, { html: true, customClass: 'tooltip-class', title: tooltip })\n    } else {\n      info.el.setAttribute('title', tooltip.replace(/<[^>]*>/g, ''))\n    }\n  }\n\n  dayCellDidMount = (dateObj) => {\n    const date = dateObj.date\n\n    const isBlocking = this.eventsValue.find((e) => {\n      return e.type == 'blocking' &&\n        new Date(`${e.start} 00:00`) < date &&\n        new Date(`${e.end} 00:00`) >= date\n    })\n\n    if (isBlocking) {\n      $(dateObj.el).addClass('fc-day-blocking')\n    }\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nString.prototype.capitalize = function() {\n  return this.replace(/(?:^|\\s)\\S/g, function(a) { return a.toUpperCase(); });\n};\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    chartData: Array,\n    chartDataSeries: Object, // Optional: object with multiple series { p25: [[date, value]], p50: [[date, value]], ... }\n    dottedFutureMonths: Boolean,\n    today: Number,\n    locale: String,\n    chartType: { type: String, default: 'line' },\n    dataType: { type: String, default: 'number' }, // 'currency', 'percentage', 'number'\n    currencyCode: { type: String, default: 'USD' },\n    showLegend: { type: Boolean, default: false },\n    unitLabel: { type: String, default: '' }, // Optional unit label to append to values (e.g., \"listings\", \"bookings\")\n    legendPadding: { type: Number, default: 30 }, // Legend padding, can be reduced for mobile\n    tierLabels: Object, // Optional: object mapping tier keys to translated labels { entry_level: \"Entry Level\", ... }\n    tension: { type: Number, default: 0 },\n    sortByCalendarMonth: { type: Boolean, default: false },\n    tooltipMonthOnly: { type: Boolean, default: false }\n  }\n\n  connect() {\n    this.chart = null\n    this.seriesKeyMap = {\n      'entry_level': 'p25',\n      'average': 'p50',\n      'high_performing': 'p75',\n      'premium': 'p90'\n    }\n    // Reverse mapping: percentile keys to tier keys\n    this.percentileToTierMap = {\n      'p25': 'entry_level',\n      'p50': 'average',\n      'p75': 'high_performing',\n      'p90': 'premium'\n    }\n    // Tier label mapping (will be used in tooltip) - use provided labels or fallback to English\n    this.tierLabels = this.hasTierLabelsValue ? this.tierLabelsValue : {\n      'entry_level': 'Entry Level',\n      'average': 'Market Median',\n      'high_performing': 'High Performing Properties',\n      'premium': 'Most Booked Properties'\n    }\n    this.datasetIndexMap = {} // Map series keys to dataset indices\n    this.initializeChart()\n  }\n\n  toggleSeries(event) {\n    if (!this.chart) return\n\n    const tierKey = event.currentTarget.dataset.tier\n    const seriesKey = this.seriesKeyMap[tierKey]\n\n    if (!seriesKey || this.datasetIndexMap[seriesKey] === undefined) return\n\n    const datasetIndex = this.datasetIndexMap[seriesKey]\n    const meta = this.chart.getDatasetMeta(datasetIndex)\n    meta.hidden = !meta.hidden\n    this.chart.update()\n\n    // Update all button styles based on their series visibility\n    this.updateAllButtonStyles()\n  }\n\n  updateAllButtonStyles() {\n    if (!this.chart) return\n\n    // Find all tier buttons\n    const buttons = this.element.querySelectorAll('.occupancy-tier-selector')\n\n    buttons.forEach(button => {\n      const tierKey = button.dataset.tier\n      const seriesKey = this.seriesKeyMap[tierKey]\n\n      if (!seriesKey || this.datasetIndexMap[seriesKey] === undefined) return\n\n      const datasetIndex = this.datasetIndexMap[seriesKey]\n      const meta = this.chart.getDatasetMeta(datasetIndex)\n\n      // Find label text element\n      const labelText = button.querySelector('span.text-gray-700, span.text-gray-400')\n\n      // Update visual state\n      if (meta.hidden) {\n        // Hidden state - lighter text\n        if (labelText) {\n          labelText.classList.remove('text-gray-700')\n          labelText.classList.add('text-gray-400')\n        }\n      } else {\n        // Visible state - darker text\n        if (labelText) {\n          labelText.classList.remove('text-gray-400')\n          labelText.classList.add('text-gray-700')\n        }\n      }\n    })\n  }\n\n  initializeChart() {\n    const canvasElement = this.hasCanvasTarget ? this.canvasTarget : this.element\n    const ctx = canvasElement.getContext('2d')\n\n    // Check if we have multiple series or single series\n    const hasMultipleSeries = this.hasChartDataSeriesValue && Object.keys(this.chartDataSeriesValue).length > 0\n    let chartData = hasMultipleSeries ? Object.values(this.chartDataSeriesValue)[0] : [...this.chartDataValue]\n    if (this.sortByCalendarMonthValue) {\n      chartData.sort((a, b) => {\n        return new Date(a[0] + 'T00:00:00Z').getUTCMonth() - new Date(b[0] + 'T00:00:00Z').getUTCMonth()\n      })\n    }\n    const dates = chartData.map(([date]) => new Date(date))\n    const now = new Date(this.todayValue)\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    // Build datasets - either multiple series or single series\n    let datasets = []\n    if (hasMultipleSeries) {\n      // Define colors for percentile series\n      const seriesConfig = {\n        p25: { color: '#A7D4C2', borderDash: [] },\n        p50: { color: '#1F6F54', borderDash: [] },\n        p75: { color: '#8FCBB0', borderDash: [] },\n        p90: { color: '#1A5F48', borderDash: [] }\n      }\n\n      Object.entries(this.chartDataSeriesValue).forEach(([key, data], index) => {\n        const config = seriesConfig[key] || { color: '#1F6F54', borderDash: [] }\n        this.datasetIndexMap[key] = index // Store mapping for toggle functionality\n        // Generate colors for bedroom count series if not in seriesConfig\n        let seriesColor = config.color\n        if (!seriesConfig[key] && this.showLegendValue) {\n          // Use a color palette for bedroom counts\n          const bedroomColors = ['#1F6F54', '#1A5F48', '#8FCBB0', '#0C1A14', '#F59E0B', '#10B981', '#166348']\n          seriesColor = bedroomColors[index % bedroomColors.length]\n        }\n        // Use tier label if available, otherwise use the key\n        const tierKey = this.percentileToTierMap[key]\n        const displayLabel = tierKey && this.tierLabels[tierKey] ? this.tierLabels[tierKey] : key\n        datasets.push({\n          type: this.chartTypeValue,\n          label: displayLabel, // Always set label for tooltip, even if legend is hidden\n          data: data.map(([, value]) => value),\n          tension: this.tensionValue,\n          fill: true,\n          borderColor: seriesColor,\n          backgroundColor: seriesColor + '20', // Add transparency\n          pointBackgroundColor: seriesColor,\n          borderDash: config.borderDash,\n          pointRadius: 2,\n          pointHoverRadius: 4\n        })\n      })\n    } else {\n      // Single series (original behavior)\n      datasets = [{\n        type: this.chartTypeValue,\n        data: chartData.map(([, value]) => value),\n        tension: this.tensionValue,\n        segment: {\n          borderDash: ctx => {\n            if (!this.dottedFutureMonthsValue) {\n              return []\n            }\n            const currentDate = dates[ctx.p1DataIndex]\n            return currentDate >= now ? [5, 5] : []\n          }\n        },\n        borderColor: function(context) {\n          const chart = context.chart\n          const {ctx, chartArea} = chart\n          if (!chartArea) {\n            return\n          }\n          return getGradient(ctx, chartArea)\n        },\n        backgroundColor: function(context) {\n          const chart = context.chart\n          const {ctx, chartArea} = chart\n          if (!chartArea) {\n            return\n          }\n          const gradient = getGradient(ctx, chartArea)\n\n          const currentDate = dates[context.dataIndex]\n          if (currentDate >= now) {\n            return 'rgba(31, 111, 84, 0.3)'\n          }\n          return gradient\n        },\n        pointBackgroundColor: '#8FCBB0',\n      }]\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(this.localeValue, { month: 'short', timeZone: 'UTC' }).capitalize()),\n        datasets: datasets\n      },\n      options: {\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: this.showLegendValue, // Show legend if showLegend is true\n            position: 'bottom', // Position legend at the bottom\n            labels: {\n              padding: this.legendPaddingValue,\n              usePointStyle: true, // Use dots instead of squares\n              boxWidth: window.innerWidth < 640 ? 8 : 12,\n              font: {\n                size: window.innerWidth < 640 ? 10 : 12\n              }\n            },\n            onHover: (e, legendItem) => {\n              e.native.target.style.cursor = 'pointer'\n            },\n            onLeave: (e, legendItem) => {\n              e.native.target.style.cursor = 'default'\n            }\n          },\n          tooltip: {\n            mode: 'index',\n            intersect: false,\n            callbacks: {\n              title: (tooltipItems) => {\n                // Get the date from the chartData array\n                const dataIndex = tooltipItems[0].dataIndex\n                const dateString = chartData[dataIndex][0]\n                const date = new Date(dateString + 'T00:00:00Z')\n\n                const titleOptions = { month: 'long', timeZone: 'UTC' }\n                if (!this.tooltipMonthOnlyValue) {\n                  titleOptions.year = 'numeric'\n                }\n                return date.toLocaleString(this.localeValue, titleOptions)\n              },\n              label: (context) => {\n                const value = context.raw\n                const datasetLabel = context.dataset.label || ''\n\n                let formattedValue\n                switch (this.dataTypeValue) {\n                  case 'currency':\n                    formattedValue = new Intl.NumberFormat(this.localeValue, {\n                      style: 'currency',\n                      currency: this.currencyCodeValue,\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0\n                    }).format(value)\n                    break\n                  case 'percentage':\n                    formattedValue = `${Math.round(value)}%`\n                    break\n                  case 'days':\n                    formattedValue = `${new Intl.NumberFormat(this.localeValue, {\n                      minimumFractionDigits: 1,\n                      maximumFractionDigits: 1\n                    }).format(value)} days`\n                    break\n                  case 'number':\n                  default:\n                    formattedValue = new Intl.NumberFormat(this.localeValue, {\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0\n                    }).format(value)\n                }\n\n                // Append unit label if provided\n                if (this.unitLabelValue && this.unitLabelValue.trim() !== '') {\n                  formattedValue = `${formattedValue} ${this.unitLabelValue}`\n                }\n\n                return datasetLabel ? `${datasetLabel}: ${formattedValue}` : formattedValue\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            grid: {\n              display: false\n            }\n          },\n          y: {\n            grid: {\n              drawOnChartArea: true\n            },\n            ticks: {\n              callback: (value) => {\n                if (this.dataTypeValue === 'percentage') {\n                  return `${Math.round(value)}%`\n                }\n                return value\n              }\n            }\n          }\n        },\n      }\n    })\n\n    // Initialize button styles after chart is created (for multiple series)\n    if (hasMultipleSeries) {\n      setTimeout(() => {\n        this.updateAllButtonStyles()\n      }, 100)\n    }\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  open(event) {\n    if (event.target.closest(\"[data-comp-set-pro-badge]\")) return\n\n    const url = event.currentTarget.dataset.compSetListRowUrlValue\n    if (!url) return\n\n    window.open(url, \"_blank\", \"noopener,noreferrer\")\n  }\n\n  stop(event) {\n    event.stopPropagation()\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    email: String\n  }\n\n  preventSubmit(event) {\n    event.preventDefault()\n  }\n\n  open(event) {\n    event.preventDefault()\n\n    if (!this.element.checkValidity()) {\n      this.element.reportValidity()\n      return\n    }\n\n    this.trackAnalytics()\n    this.openMailto()\n  }\n\n  openMailto() {\n    const name = this.element.querySelector(\"#contact-name\")?.value?.trim() || \"\"\n    const replyTo = this.element.querySelector(\"#contact-email\")?.value?.trim() || \"\"\n    const subject = this.element.querySelector(\"#contact-subject\")?.value?.trim() || \"\"\n    const message = this.element.querySelector(\"#contact-message\")?.value?.trim() || \"\"\n\n    const bodyParts = []\n    if (name) bodyParts.push(`Name: ${name}`)\n    if (replyTo) bodyParts.push(`Email: ${replyTo}`)\n    if (bodyParts.length) bodyParts.push(\"\")\n    bodyParts.push(message)\n\n    const body = bodyParts.join(\"\\n\")\n    const params = []\n    if (subject) params.push(`subject=${encodeURIComponent(subject)}`)\n    if (body) params.push(`body=${encodeURIComponent(body)}`)\n\n    const mailto = params.length\n      ? `mailto:${this.emailValue}?${params.join(\"&\")}`\n      : `mailto:${this.emailValue}`\n\n    const link = document.createElement(\"a\")\n    link.href = mailto\n    link.rel = \"noopener\"\n    document.body.appendChild(link)\n    link.click()\n    link.remove()\n  }\n\n  trackAnalytics() {\n    const eventName = this.element.dataset.analyticsEvent\n    if (!eventName) return\n\n    const baseProperties = this.parseEventProperties(this.element.dataset.analyticsProps)\n    const properties = { ...baseProperties }\n\n    const subject = this.element.querySelector(\"#contact-subject\")?.value\n    const email = this.element.querySelector(\"#contact-email\")?.value\n    const message = this.element.querySelector(\"#contact-message\")?.value\n\n    if (subject) properties.subject = subject\n    if (email) properties.email_address = email\n    if (message) properties.body = message\n\n    this.element.dispatchEvent(new CustomEvent(\"trackEvent\", {\n      bubbles: true,\n      detail: { name: eventName, properties }\n    }))\n  }\n\n  parseEventProperties(propsString) {\n    if (!propsString) return {}\n    try {\n      return JSON.parse(propsString)\n    } catch {\n      return {}\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    labels: Array,\n    occupancyData: Array,\n    bookedNights: Array,\n    availableColor: { type: String, default: \"#F8A5A5\" },\n    bookedColor: { type: String, default: \"#b9d7b8\" },\n    todayAvailableColor: { type: String, default: \"#F8A5A5\" },\n    todayBookedColor: { type: String, default: \"#b9d7b8\" },\n    percentageScale: Boolean\n  }\n\n  connect() {\n    Chart.defaults.color = 'rgb(120, 113, 108)'\n    this.initChart()\n  }\n\n  initChart() {\n    const ctx = this.element.getContext('2d')\n\n    // Convert dates to consistent format for comparison\n    const formattedBookedNights = this.bookedNightsValue.map(date => this.formatDate(date))\n\n    // Get today's date in the same format as the chart data\n    const today = this.formatDate(new Date())\n\n    // Find index of today's date in the labels array\n    const todayIndex = this.labelsValue.findIndex(date => this.formatDate(date) === today)\n\n    // Generate colors array based on whether each night is booked\n    const barColors = this.labelsValue.map(date => {\n      const formattedDate = this.formatDate(date)\n      const isBooked = formattedBookedNights.includes(formattedDate)\n      const isToday = formattedDate === today\n\n      if (isToday) {\n        return isBooked ? this.todayBookedColorValue : this.todayAvailableColorValue\n      }\n      return isBooked ? this.bookedColorValue : this.availableColorValue\n    })\n\n    // Create an array of booked status for tooltip reference\n    const bookedStatus = this.labelsValue.map(date => {\n      const formattedDate = this.formatDate(date)\n      return formattedBookedNights.includes(formattedDate)\n    })\n\n    // Create an array to track which dates are today\n    const isTodayArray = this.labelsValue.map(date => {\n      return this.formatDate(date) === today\n    })\n\n    new Chart(ctx, {\n      type: 'bar',\n      data: {\n        labels: this.labelsValue.map(date => {\n          // Format date for display\n          const dateObj = new Date(date)\n          return dateObj.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })\n        }),\n        datasets: [{\n          data: this.occupancyDataValue,\n          backgroundColor: barColors,\n          barPercentage: 1.1,\n          borderRadius: 3,\n          borderWidth: 0,\n          // Store metadata in dataset for tooltip access\n          bookedStatus: bookedStatus,\n          isTodayArray: isTodayArray\n        }]\n      },\n      options: {\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: false // Hide the legend\n          },\n          tooltip: {\n            callbacks: {\n              title: function(context) {\n                // Access the raw label directly from the chart data\n                const index = context[0].dataIndex;\n                // Get the displayed label which is already formatted as \"Month Day\"\n                const displayedLabel = context[0].chart.data.labels[index];\n\n                // Create a date from the parts (current year and displayed \"Month Day\")\n                const currentYear = new Date().getFullYear();\n                const date = new Date(`${displayedLabel}, ${currentYear}`);\n\n                // Format the date with day name\n                return date.toLocaleDateString('en-US', { weekday: 'long' }) + \", \" + displayedLabel;\n              },\n              label: function(context) {\n                const isBooked = context.dataset.bookedStatus[context.dataIndex];\n                const isToday = context.dataset.isTodayArray[context.dataIndex];\n\n                let label = context.parsed.y + '%';\n\n                if (isToday && isBooked) {\n                  label += ' (Today, Booked)';\n                } else if (isToday) {\n                  label += ' (Today)';\n                } else if (isBooked) {\n                  label += ' (Booked)';\n                }\n\n                return label;\n              }\n            }\n          },\n          annotation: todayIndex >= 0 ? {\n            annotations: {\n              todayLine: {\n                type: 'line',\n                xMin: todayIndex,\n                xMax: todayIndex,\n                yMin: 0,\n                yMax: 100,\n                borderColor: 'rgba(75, 85, 99, 0.7)',\n                borderWidth: 2,\n                borderDash: [5, 3]\n              },\n              todayLabel: {\n                type: 'label',\n                xValue: todayIndex,\n                yValue: 93,\n                backgroundColor: '#4B5563',\n                content: 'Today',\n                color: 'white',\n                font: {\n                  size: 12,\n                  weight: 'bold'\n                },\n                padding: {\n                  top: 4,\n                  bottom: 4,\n                  left: 8,\n                  right: 8\n                },\n                borderRadius: 4,\n                position: 'top'\n              }\n            }\n          } : {}\n        },\n        scales: {\n          x: {\n            grid: {\n              display: false\n            }\n          },\n          y: {\n            beginAtZero: true,\n            grid: {\n              drawOnChartArea: true\n            },\n            ticks: {\n              callback: function(value) {\n                return value + '%';\n              }\n            },\n            max: this.percentageScaleValue ? 100 : undefined\n          }\n        }\n      }\n    })\n  }\n\n  // Helper to normalize date format for comparison\n  formatDate(dateString) {\n    // Handle both Date objects and strings\n    const date = typeof dateString === 'string' ? new Date(dateString) : dateString\n    return date.toISOString().split('T')[0] // Returns YYYY-MM-DD format\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\n// Shows every advanced filter inline when the row fits; otherwise collapses\n// inactive advanced filters into the More menu.\nexport default class extends Controller {\n  static targets = [\"row\", \"collapsibleItem\", \"more\"]\n\n  connect() {\n    this.boundLayout = () => this.scheduleLayout()\n    this.scheduleLayout()\n\n    if (typeof ResizeObserver !== \"undefined\") {\n      this.resizeObserver = new ResizeObserver(this.boundLayout)\n      this.resizeObserver.observe(this.element)\n      if (this.hasRowTarget) this.resizeObserver.observe(this.rowTarget)\n    }\n\n    window.addEventListener(\"resize\", this.boundLayout)\n  }\n\n  disconnect() {\n    if (this.layoutFrame) cancelAnimationFrame(this.layoutFrame)\n    if (this.resizeObserver) this.resizeObserver.disconnect()\n    window.removeEventListener(\"resize\", this.boundLayout)\n  }\n\n  scheduleLayout() {\n    if (this.layoutFrame) cancelAnimationFrame(this.layoutFrame)\n    this.layoutFrame = requestAnimationFrame(() => this.layout())\n  }\n\n  layout() {\n    if (!this.hasRowTarget || !this.hasMoreTarget) return\n\n    // Measure with all collapsible items visible and More hidden.\n    this.collapsibleItemTargets.forEach((el) => el.classList.remove(\"hidden\"))\n    this.moreTarget.classList.add(\"hidden\")\n\n    if (!this.overflows()) return\n\n    // Not enough room: park inactive advanced filters behind More.\n    this.collapsibleItemTargets.forEach((el) => el.classList.add(\"hidden\"))\n    this.moreTarget.classList.remove(\"hidden\")\n  }\n\n  overflows() {\n    const row = this.rowTarget\n    return row.scrollWidth > row.clientWidth + 1\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [ \"stepButton\", \"dayPanel\", \"explanation\" ]\n\n  connect() {\n    this.showStep(0)\n  }\n\n  changeStep(event) {\n    const step = parseInt(event.currentTarget.dataset.stepIndex, 10)\n    this.showStep(step)\n  }\n\n  showStep(activeStep) {\n    // Update active button state\n    this.stepButtonTargets.forEach((button, index) => {\n      if (index === activeStep) {\n        button.classList.add(\"bg-[#1F6F54]\", \"text-white\")\n        button.classList.remove(\"bg-white\", \"text-gray-700\", \"hover:bg-gray-50\", \"border-gray-200\")\n      } else {\n        button.classList.remove(\"bg-[#1F6F54]\", \"text-white\")\n        button.classList.add(\"bg-white\", \"text-gray-700\", \"hover:bg-gray-50\", \"border-gray-200\")\n      }\n    })\n\n    // Show active day calendar panel\n    this.dayPanelTargets.forEach((panel, index) => {\n      if (index === activeStep) {\n        panel.classList.remove(\"hidden\")\n        panel.classList.add(\"animate-fade-in\")\n      } else {\n        panel.classList.add(\"hidden\")\n        panel.classList.remove(\"animate-fade-in\")\n      }\n    })\n\n    // Show active explanation text\n    this.explanationTargets.forEach((exp, index) => {\n      if (index === activeStep) {\n        exp.classList.remove(\"hidden\")\n      } else {\n        exp.classList.add(\"hidden\")\n      }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"menu\"]\n\n  connect() {\n    this.isOpen = false\n    // Store bound function reference for addEventListener/removeEventListener\n    this.boundCloseOnOutsideClick = this.closeOnOutsideClick.bind(this)\n    this.close()\n  }\n\n  toggle(event) {\n    event.stopPropagation()\n    if (this.isOpen) {\n      this.close()\n    } else {\n      this.open()\n    }\n  }\n\n  select(event) {\n    event.stopPropagation()\n    const range = event.currentTarget.dataset.range\n    const months = event.currentTarget.dataset.months\n    const label = event.currentTarget.dataset.label\n\n    // Update the button label\n    const labelElement = this.element.querySelector('.time-range-label')\n    if (labelElement) {\n      labelElement.textContent = label\n    }\n\n    // Update the button data attributes\n    const button = this.element.querySelector('.time-range-selector')\n    if (button) {\n      button.dataset.range = range\n      button.dataset.months = months\n    }\n\n    this.close()\n  }\n\n  open() {\n    this.menuTarget.classList.remove('hidden')\n    this.isOpen = true\n    // Close on outside click\n    setTimeout(() => {\n      document.addEventListener('click', this.boundCloseOnOutsideClick)\n    }, 0)\n  }\n\n  close() {\n    this.menuTarget.classList.add('hidden')\n    this.isOpen = false\n    document.removeEventListener('click', this.boundCloseOnOutsideClick)\n  }\n\n  closeOnOutsideClick(event) {\n    if (!this.element.contains(event.target)) {\n      this.close()\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Opens #hs-modal-email-exists. Turbo replaces #email-exists-trigger with email +\n// sign-in URL for the \"email already registered\" signup flow. For OmniAuth\n// failures, a separate trigger passes openSignupOnClose: closing the modal\n// (X, backdrop, or continue) then opens the signup modal.\nexport default class extends Controller {\n  static values = {\n    email: String,\n    signInUrl: String,\n    useGoogleSignIn: { type: Boolean, default: false },\n    openSignupOnClose: { type: Boolean, default: false },\n  }\n\n  connect() {\n    const emailDisplay = document.getElementById(\"email-exists-email-display\")\n    if (emailDisplay && this.hasEmailValue && this.emailValue) {\n      emailDisplay.textContent = this.emailValue\n    }\n\n    this._configureSignInAction()\n    this._wireDifferentEmailButton()\n\n    if (this.openSignupOnCloseValue) {\n      const modal = document.getElementById(\"hs-modal-email-exists\")\n      if (modal) {\n        this._onModalClose = this._onModalClose.bind(this)\n        modal.addEventListener(\"close.hs.overlay\", this._onModalClose)\n      }\n    }\n\n    // Auth-error flow: inline script in _signup_modal opens after Preline loads.\n    if (!this.openSignupOnCloseValue) {\n      this._openModalWhenReady()\n    }\n  }\n\n  _openModal() {\n    if (typeof HSOverlay === \"undefined\") return false\n\n    const modal = document.getElementById(\"hs-modal-email-exists\")\n    if (!modal) return false\n\n    HSOverlay.open(modal)\n    return true\n  }\n\n  _openModalWhenReady(attempt = 0) {\n    if (this._openModal()) return\n    if (attempt >= 100) return\n\n    setTimeout(() => this._openModalWhenReady(attempt + 1), 50)\n  }\n\n  disconnect() {\n    if (this.openSignupOnCloseValue && this._onModalClose) {\n      const modal = document.getElementById(\"hs-modal-email-exists\")\n      if (modal) {\n        modal.removeEventListener(\"close.hs.overlay\", this._onModalClose)\n      }\n    }\n  }\n\n  _configureSignInAction() {\n    const google = document.getElementById(\"email-exists-signin-google\")\n    const password = document.getElementById(\"email-exists-signin-password\")\n    const signinLink = document.getElementById(\"email-exists-signin-link\")\n\n    if (this.useGoogleSignInValue) {\n      google?.classList.remove(\"hidden\")\n      password?.classList.add(\"hidden\")\n      return\n    }\n\n    google?.classList.add(\"hidden\")\n    password?.classList.remove(\"hidden\")\n\n    if (signinLink && this.hasSignInUrlValue && this.signInUrlValue) {\n      signinLink.setAttribute(\"href\", this.signInUrlValue)\n    }\n  }\n\n  _wireDifferentEmailButton() {\n    const button = document.getElementById(\"email-exists-different-email\")\n    if (!button || button.dataset.emailExistsWired === \"true\") return\n\n    button.dataset.emailExistsWired = \"true\"\n    button.addEventListener(\"click\", (event) => {\n      event.preventDefault()\n      if (typeof HSOverlay === \"undefined\") return\n\n      HSOverlay.close(\"#hs-modal-email-exists\")\n      if (!this.openSignupOnCloseValue) {\n        HSOverlay.open(\"#hs-modal-signup\")\n        window.dispatchEvent(\n          new CustomEvent(\"signup-modal:opened\", {\n            detail: { authSource: \"email_exists_different_email\" },\n          }),\n        )\n      }\n    })\n  }\n\n  _onModalClose() {\n    if (typeof HSOverlay === \"undefined\") return\n\n    HSOverlay.open(\"#hs-modal-signup\")\n    window.dispatchEvent(\n      new CustomEvent(\"signup-modal:opened\", {\n        detail: { authSource: \"email_exists_modal_dismissed\" },\n      }),\n    )\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nlet loadingTimeoutId = null\nlet streamHideDebounceId = null\nlet streamHideFallbackId = null\nlet filtersLoadingVisible = false\nlet documentLoadingListenersAttached = false\n\nfunction showFiltersLoadingOverlay() {\n  filtersLoadingVisible = true\n\n  const existingOverlay = document.getElementById(\"filters-loading-overlay\")\n  if (existingOverlay) {\n    existingOverlay.remove()\n  }\n\n  const loadingOverlay = document.createElement(\"div\")\n  loadingOverlay.id = \"filters-loading-overlay\"\n  loadingOverlay.className = \"fixed inset-0 bg-[#F7F6F3] bg-opacity-75 z-40 flex items-center justify-center\"\n  loadingOverlay.innerHTML = `\n    <div class=\"bg-white rounded-xl shadow-lg p-8 flex flex-col items-center gap-4\">\n      <div class=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600\"></div>\n      <div class=\"text-gray-600 text-sm font-medium\">Updating filters...</div>\n    </div>\n  `\n  document.body.appendChild(loadingOverlay)\n\n  clearFiltersLoadingTimers()\n  loadingTimeoutId = setTimeout(() => {\n    hideFiltersLoadingOverlay()\n  }, 60000)\n}\n\nfunction clearFiltersLoadingTimers() {\n  if (loadingTimeoutId) {\n    clearTimeout(loadingTimeoutId)\n    loadingTimeoutId = null\n  }\n\n  if (streamHideDebounceId) {\n    clearTimeout(streamHideDebounceId)\n    streamHideDebounceId = null\n  }\n\n  if (streamHideFallbackId) {\n    clearTimeout(streamHideFallbackId)\n    streamHideFallbackId = null\n  }\n}\n\nfunction hideFiltersLoadingOverlay() {\n  filtersLoadingVisible = false\n  clearFiltersLoadingTimers()\n\n  const loadingOverlay = document.getElementById(\"filters-loading-overlay\")\n  if (loadingOverlay) {\n    loadingOverlay.remove()\n  }\n}\n\nfunction hideFiltersLoadingOverlayAfterPaint() {\n  requestAnimationFrame(() => {\n    requestAnimationFrame(() => {\n      hideFiltersLoadingOverlay()\n    })\n  })\n}\n\nfunction waitForPendingTurboStreams(callback) {\n  const check = () => {\n    if (document.documentElement.querySelector(\":scope > turbo-stream\")) {\n      requestAnimationFrame(check)\n      return\n    }\n\n    callback()\n  }\n\n  requestAnimationFrame(check)\n}\n\nfunction scheduleHideAfterFilterStreams() {\n  if (!filtersLoadingVisible) return\n\n  clearTimeout(streamHideDebounceId)\n  streamHideDebounceId = setTimeout(() => {\n    waitForPendingTurboStreams(hideFiltersLoadingOverlayAfterPaint)\n  }, 0)\n}\n\nfunction scheduleHideFallback(delayMs = 3000) {\n  if (!filtersLoadingVisible) return\n\n  clearTimeout(streamHideFallbackId)\n  streamHideFallbackId = setTimeout(hideFiltersLoadingOverlayAfterPaint, delayMs)\n}\n\nfunction attachFiltersLoadingListeners() {\n  if (documentLoadingListenersAttached) return\n\n  documentLoadingListenersAttached = true\n\n  // turbo:submit-end fires before turbo-stream responses are applied to the DOM.\n  // Wait for stream renders (or a fallback) so the overlay stays until content updates.\n  document.addEventListener(\"turbo:submit-end\", (event) => {\n    const form = event.detail?.formSubmission?.formElement\n    if (!form || form.dataset.turboFrame !== \"filters-container\") return\n\n    scheduleHideFallback()\n  })\n\n  document.addEventListener(\"turbo:frame-load\", (event) => {\n    if (!filtersLoadingVisible) return\n    if (event.target.id !== \"filters-container\") return\n\n    scheduleHideFallback()\n  })\n\n  document.addEventListener(\"turbo:before-stream-render\", () => {\n    if (!filtersLoadingVisible) return\n\n    clearTimeout(streamHideFallbackId)\n    streamHideFallbackId = null\n    scheduleHideAfterFilterStreams()\n  })\n\n  document.addEventListener(\"turbo:fetch-request-error\", () => {\n    if (filtersLoadingVisible) hideFiltersLoadingOverlay()\n  })\n}\n\nexport default class extends Controller {\n  connect() {\n    attachFiltersLoadingListeners()\n\n    // Dispatch event to trigger Preline initialization\n    this.dispatch(\"filtersLoaded\", { bubbles: true })\n\n    HSDropdown.autoInit()\n\n    // Intercept clicks on filter links to update the section parameter\n    // Listen at document level to catch links outside the container (like clear filters button)\n    this.boundHandleClick = this.handleClick.bind(this)\n    document.addEventListener(\"click\", this.boundHandleClick, true)\n\n    // Intercept Turbo form submissions to update the section (all filter forms)\n    this.boundHandleTurboSubmitStart = this.handleTurboSubmitStart.bind(this)\n    this.element.addEventListener(\"turbo:submit-start\", this.boundHandleTurboSubmitStart)\n  }\n\n  disconnect() {\n    document.removeEventListener(\"click\", this.boundHandleClick, true)\n    this.element.removeEventListener(\"turbo:submit-start\", this.boundHandleTurboSubmitStart)\n  }\n\n  showLoading() {\n    showFiltersLoadingOverlay()\n  }\n\n  hideLoading() {\n    hideFiltersLoadingOverlay()\n  }\n\n  handleClick(event) {\n    // Find the closest filter link (includes filter dropdowns and reset button)\n    const link = event.target.closest('a[href*=\"/insights/\"]')\n    if (!link || !link.href || link.href === \"#\" || link.href === \"# \") return\n\n    // Check if link has data-filter-action attribute (for links outside the container, like clear filters)\n    const isFilterAction = link.dataset.filterAction === \"clear\" || link.dataset.filterAction === \"reset\"\n\n    // Ensure the clicked link is within this controller's element OR has filter-action attribute\n    if (!this.element.contains(link) && !isFilterAction) return\n\n    try {\n      const linkUrl = new URL(link.href, window.location.origin)\n\n      // Check if this is an insights filter link (contains /insights/ in path)\n      if (!linkUrl.pathname.includes(\"/insights/\")) return\n\n      // Get current section from URL pathname\n      const currentSection = this.getCurrentSection()\n      if (!currentSection) return\n\n      // Update the section in the path (not query parameter)\n      const pathParts = linkUrl.pathname.split(\"/\").filter(Boolean)\n      const insightsIndex = pathParts.indexOf(\"insights\")\n      if (insightsIndex !== -1) {\n        // Check if this is a custom polygon path: /insights/custom/:id/:section\n        const isCustomPolygon = pathParts[insightsIndex + 1] === \"custom\"\n\n        if (isCustomPolygon && pathParts.length >= insightsIndex + 4) {\n          // For custom polygons: replace section at index insightsIndex + 3\n          pathParts[insightsIndex + 3] = currentSection\n          linkUrl.pathname = \"/\" + pathParts.join(\"/\")\n        } else if (!isCustomPolygon && pathParts.length > insightsIndex + 4) {\n          // For normal polygons: replace the last part (section)\n          pathParts[pathParts.length - 1] = currentSection\n          linkUrl.pathname = \"/\" + pathParts.join(\"/\")\n        }\n      }\n\n      link.href = linkUrl.toString()\n\n      // Show loading indicator and update URL\n      // This works for both filter dropdown links, reset button, and clear filters button\n      this.showLoading()\n      this.updateBrowserUrl(linkUrl)\n    } catch (e) {\n      // Invalid URL, skip\n      console.warn(\"[filters-container] Invalid URL in filter link:\", e)\n    }\n  }\n\n  handleTurboSubmitStart(event) {\n    // Get the form from the event\n    const form = event.target\n    if (!form || form.tagName !== \"FORM\" || !this.element.contains(form)) return\n\n    // Check if this form targets the filters-container frame (story page)\n    const turboFrame = form.dataset.turboFrame\n    if (turboFrame !== \"filters-container\") return\n\n    // Get current section from URL pathname\n    const currentSection = this.getCurrentSection()\n    if (!currentSection) return\n\n    try {\n      // Build the URL from form action and form data\n      const formAction = form.getAttribute(\"action\")\n      if (!formAction || !formAction.includes(\"/insights/\")) return\n\n      const formUrl = new URL(formAction, window.location.origin)\n\n      // Update the section in the path (not query parameter)\n      const pathParts = formUrl.pathname.split(\"/\").filter(Boolean)\n      const insightsIndex = pathParts.indexOf(\"insights\")\n      if (insightsIndex !== -1) {\n        // Check if this is a custom polygon path: /insights/custom/:id/:section\n        const isCustomPolygon = pathParts[insightsIndex + 1] === \"custom\"\n\n        if (isCustomPolygon && pathParts.length >= insightsIndex + 4) {\n          // For custom polygons: replace section at index insightsIndex + 3\n          pathParts[insightsIndex + 3] = currentSection\n          formUrl.pathname = \"/\" + pathParts.join(\"/\")\n        } else if (!isCustomPolygon && pathParts.length > insightsIndex + 4) {\n          // For normal polygons: replace the last part (section)\n          pathParts[pathParts.length - 1] = currentSection\n          formUrl.pathname = \"/\" + pathParts.join(\"/\")\n        }\n      }\n\n      // Update form action to include section in path\n      form.setAttribute(\"action\", formUrl.pathname + formUrl.search)\n\n      // Add all form data to the URL (to build complete filter parameters)\n      formUrl.search = \"\"\n      this.buildFilterParamsFromForm(form).forEach((value, key) => {\n        formUrl.searchParams.set(key, value)\n      })\n\n      // Show loading and update URL\n      this.showLoading()\n      this.updateBrowserUrl(formUrl, form)\n    } catch (e) {\n      console.warn(\"[filters-container] Error updating form action:\", e)\n    }\n  }\n\n  updateBrowserUrl(sourceUrl, form = null) {\n    const currentUrl = new URL(window.location.href)\n\n    // Known non-filter parameters that should be preserved/excluded\n    const nonFilterParams = new Set([\"section\", \"controller\", \"action\"])\n\n    // Collect all filter parameter keys\n    const allFilterKeys = new Set()\n\n    // Collect from current URL\n    currentUrl.searchParams.forEach((value, key) => {\n      if (!nonFilterParams.has(key)) {\n        allFilterKeys.add(this.normalizeFilterParamKey(key))\n      }\n    })\n\n    // Collect from source URL\n    sourceUrl.searchParams.forEach((value, key) => {\n      if (!nonFilterParams.has(key)) {\n        allFilterKeys.add(this.normalizeFilterParamKey(key))\n      }\n    })\n\n    // For forms, also collect checkbox param names (to handle unchecked ones)\n    if (form) {\n      form.querySelectorAll('input[type=\"checkbox\"][name^=\"has_\"]').forEach(checkbox => {\n        allFilterKeys.add(checkbox.name)\n      })\n      form.querySelectorAll('input[type=\"checkbox\"][name$=\"[]\"]').forEach(checkbox => {\n        allFilterKeys.add(this.normalizeFilterParamKey(checkbox.name))\n      })\n    }\n\n    // Remove all filter parameters from current URL first\n    allFilterKeys.forEach(key => {\n      currentUrl.searchParams.delete(key)\n    })\n\n    // Add parameters from source URL (excluding non-filter params and only if they have a value)\n    sourceUrl.searchParams.forEach((value, key) => {\n      if (!nonFilterParams.has(key) && this.isMeaningfulFilterValue(value)) {\n        currentUrl.searchParams.set(key, value)\n      }\n    })\n\n    // Update the browser URL\n    window.history.pushState({}, \"\", currentUrl.toString())\n  }\n\n  buildFilterParamsFromForm(form) {\n    const params = new Map()\n\n    new FormData(form).forEach((value, key) => {\n      if (!this.isMeaningfulFilterValue(value) || key === \"section\") return\n\n      const normalizedKey = this.normalizeFilterParamKey(key)\n\n      if (key.endsWith(\"[]\")) {\n        const current = params.get(normalizedKey)\n        params.set(normalizedKey, current ? `${current},${value}` : String(value))\n      } else {\n        params.set(normalizedKey, value)\n      }\n    })\n\n    return params\n  }\n\n  normalizeFilterParamKey(key) {\n    return key.endsWith(\"[]\") ? key.slice(0, -2) : key\n  }\n\n  isMeaningfulFilterValue(value) {\n    return value && value !== \"null\" && value !== \"undefined\" && value !== \"\"\n  }\n\n  getCurrentSection() {\n    // Extract section from current URL pathname\n    // Section is now the last part of the path after /insights/.../\n    const pathParts = window.location.pathname.split(\"/\").filter(Boolean)\n    const insightsIndex = pathParts.indexOf(\"insights\")\n\n    if (insightsIndex !== -1) {\n      // Check if this is a custom polygon path: /insights/custom/:id/:section\n      const isCustomPolygon = pathParts[insightsIndex + 1] === \"custom\"\n\n      if (isCustomPolygon && pathParts.length >= insightsIndex + 4) {\n        // For custom polygons: /insights/custom/:id/:section\n        // Section is at index insightsIndex + 3\n        const validSections = [\"overview\", \"listings\", \"occupancy_analysis\", \"pricing_revenue\", \"supply_demand\", \"submarkets\", \"top_listings\", \"related_markets\"]\n        const sectionPart = pathParts[insightsIndex + 3]\n        if (validSections.includes(sectionPart)) {\n          return sectionPart\n        }\n      } else if (!isCustomPolygon && pathParts.length > insightsIndex + 4) {\n        // For normal polygons: /insights/country/region/.../section\n        // Section is the last part of the path\n        const validSections = [\"overview\", \"listings\", \"occupancy_analysis\", \"pricing_revenue\", \"supply_demand\", \"submarkets\", \"top_listings\", \"related_markets\"]\n        const lastPart = pathParts[pathParts.length - 1]\n        if (validSections.includes(lastPart)) {\n          return lastPart\n        }\n      }\n    }\n\n    // Fallback: check query parameter (for backward compatibility)\n    const urlParams = new URLSearchParams(window.location.search)\n    return urlParams.get(\"section\") || \"overview\"\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    cityName: String,\n    pricingTitle: { type: String, default: \"Choose a plan to unlock filters\" },\n    pricingSubtitle: { type: String, default: \"Filter by bedrooms, capacity and more to get accurate market insights\" }\n  }\n\n  connect() {\n    // Listen for when the modal opens to track the view event\n    this.element.addEventListener('open.hs.overlay', this.trackModalViewed.bind(this))\n  }\n\n  disconnect() {\n    this.element.removeEventListener('open.hs.overlay', this.trackModalViewed.bind(this))\n  }\n\n  trackModalViewed() {\n    this.dispatchTrackEvent('Filters Explainer Modal Viewed', {\n      city_name: this.cityNameValue || null\n    })\n  }\n\n  openPricingModal(event) {\n    event.preventDefault()\n\n    // Track Unlock Filters Clicked event\n    this.dispatchTrackEvent('Unlock Filters Clicked', {\n      city_name: this.cityNameValue || null\n    })\n\n    // Track Pricing Modal Viewed From Filters event\n    this.dispatchTrackEvent('Pricing Modal Viewed From Filters', {\n      city_name: this.cityNameValue || null\n    })\n\n    // Close this modal\n    HSOverlay.close(this.element)\n\n    // Set contextual title/subtitle for pricing modal\n    document.dispatchEvent(new CustomEvent('pricing-modal:set-context', {\n      detail: {\n        title: this.pricingTitleValue,\n        subtitle: this.pricingSubtitleValue\n      }\n    }))\n\n    // Open the pricing modal\n    const pricingModal = document.querySelector('#pricing-modal')\n    if (pricingModal) {\n      HSOverlay.open(pricingModal)\n    }\n  }\n\n  dispatchTrackEvent(eventName, properties = {}) {\n    // Dispatch event for amplitude controller to pick up\n    document.body.dispatchEvent(new CustomEvent('trackEvent', {\n      bubbles: true,\n      detail: {\n        name: eventName,\n        properties: properties\n      }\n    }))\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    images: Array\n  }\n\n  connect() {\n    // Initialize fslightbox when the controller connects\n    this.lightbox = new FsLightbox()\n    this.sources = []\n\n    // Progressive validation: add first valid image ASAP, then append others\n    this.progressivelyValidate(this.imagesValue)\n  }\n\n  // Open the gallery starting from a specific index\n  openGallery(event) {\n    event.preventDefault()\n    let index = parseInt(event.currentTarget.dataset.galleryIndex)\n\n    // Try to map the clicked thumbnail's current img src to the validated sources\n    const img = event.currentTarget.querySelector('img')\n    if (img && this.sources && this.sources.length) {\n      const mappedIndex = this.sources.indexOf(img.src)\n      if (mappedIndex >= 0) index = mappedIndex\n    }\n\n    this.lightbox.open(index)\n  }\n\n  // Progressive validation: set first valid, then append others; if none, use placeholder\n  progressivelyValidate(urls) {\n    const NO_PHOTO_URL = 'https://a0.muscache.com/airbnb/static/packages/assets/frontend/pdp-platform-shared/images/preview-no-photo.9af7e28e52b828cedae1c1a221ffc7e9.png'\n    let foundAny = false\n    let pending = urls.length\n\n    const maybeFinalizeIfNone = () => {\n      if (pending === 0 && !foundAny) {\n        this.sources = [NO_PHOTO_URL]\n        this.lightbox.props.sources = this.sources\n        if (window.refreshFsLightbox) window.refreshFsLightbox()\n      }\n    }\n\n    urls.forEach((url) => {\n      this.probe(url).then((ok) => {\n        pending -= 1\n        if (ok) {\n          // Avoid duplicates\n          if (!this.sources.includes(url)) {\n            this.sources.push(url)\n            this.lightbox.props.sources = this.sources\n            if (window.refreshFsLightbox) window.refreshFsLightbox()\n          }\n          foundAny = true\n        }\n      }).finally(maybeFinalizeIfNone)\n    })\n\n    // Safety timeout in case none validate quickly\n    setTimeout(maybeFinalizeIfNone, 1500)\n  }\n\n  // Probe image URL by creating an Image and listening to load/error\n  probe(url) {\n    return new Promise((resolve) => {\n      const img = new Image()\n      img.onload = () => resolve(true)\n      img.onerror = () => resolve(false)\n      img.src = url\n    })\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = []\n\n  initialize() {\n    this.environment = window.gtag ? 'production' : 'development'\n\n    this.element.addEventListener('paddle:checkoutCompleted', (event) => {\n      const value = {\n        value: event.detail.data.totals.total,\n        currency: event.detail.data.currency_code,\n        transaction_id: event.detail.data.transaction_id\n      }\n      this.track('AW-11529458479/mzN4CPXYnosaEK-m1vkq', value)\n    })\n\n    this.element.addEventListener('trackEvent', (event) => {\n      const { name } = event.detail;\n\n      switch (name) {\n        case 'Pricing Modal Opened':\n          this.track('AW-11529458479/0h26CO3LqoQaEK-m1vkq')\n          break\n        case 'Signup Completed':\n          this.track('AW-11529458479/eG1WCOrLqoQaEK-m1vkq')\n          break\n        case 'Billing Type Changed':\n          this.track('AW-11529458479/fYJlCO3FiYwaEK-m1vkq')\n          break\n      }\n    })\n  }\n\n  track(goal, value) {\n    let payload = { 'send_to': goal }\n\n    if (this.environment === 'production') {\n      if (value) {\n        payload = { ...payload, ...value }\n      }\n      window.gtag('event', 'conversion', payload);\n    } else {\n      console.log('[Google Ads] Tracking event:', payload)\n    }\n  }\n\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    clientId: String,\n    callbackUrl: String,\n    promptOnConnectDelay: { type: Number, default: 0 }\n  }\n\n  connect() {\n    // Wait for Google Identity Services to load\n    const onReady = () => {\n      this.initializeOneTap()\n      if (this.promptOnConnectDelayValue > 0) {\n        setTimeout(() => this.openPrompt(), this.promptOnConnectDelayValue)\n      }\n    }\n\n    if (window.google && window.google.accounts) {\n      onReady()\n    } else {\n      window.addEventListener('load', () => {\n        if (window.google && window.google.accounts) {\n          onReady()\n        }\n      })\n    }\n  }\n\n  initializeOneTap() {\n    if (!this.hasClientIdValue) {\n      console.error('Google One Tap: client_id is required')\n      return\n    }\n\n    // Initialize One Tap; prompt will be triggered when signup modal opens\n    if (window.google && window.google.accounts) {\n      window.google.accounts.id.initialize({\n        client_id: this.clientIdValue,\n        callback: this.handleCredentialResponse.bind(this),\n        auto_select: false,\n        cancel_on_tap_outside: true,\n        // Additional configuration for better compatibility\n        use_fedcm_for_prompt: true,\n        // Allow prompt to show even if user dismissed before\n        itp_support: true\n      })\n    }\n  }\n\n  openPrompt(event) {\n    if (event && typeof event.preventDefault === 'function') {\n      event.preventDefault()\n    }\n\n    if (window.google && window.google.accounts && this.hasClientIdValue) {\n      // Small delay to let modal animation start\n      setTimeout(() => {\n        window.google.accounts.id.prompt((notification) => {\n          // Handle notification if needed\n          if (notification.isSkippedMoment()) {\n            const skippedReason = notification.getSkippedReason()\n            console.log('One Tap skipped:', skippedReason)\n          } else if (notification.isDismissedMoment()) {\n            const dismissedReason = notification.getDismissedReason()\n            console.log('One Tap dismissed:', dismissedReason)\n          }\n        })\n      }, 300)\n    }\n  }\n\n  handleCredentialResponse(response) {\n    // Create a form to submit the credential to a custom endpoint\n    // that will set it in the flash and redirect to the callback\n    const form = document.createElement('form')\n    form.method = 'POST'\n    form.action = '/auth/auth0/google_one_tap'\n    form.style.display = 'none'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]')\n\n    if (csrfToken) {\n      const csrfInput = document.createElement('input')\n      csrfInput.type = 'hidden'\n      csrfInput.name = 'authenticity_token'\n      csrfInput.value = csrfToken.content\n      form.appendChild(csrfInput)\n    }\n\n    // Add the credential (id_token)\n    const credentialInput = document.createElement('input')\n    credentialInput.type = 'hidden'\n    credentialInput.name = 'credential'\n    credentialInput.value = response.credential\n    form.appendChild(credentialInput)\n\n    // Add return URL to return to the current page after sign-in\n    const returnUrlInput = document.createElement('input')\n    returnUrlInput.type = 'hidden'\n    returnUrlInput.name = 'return_url'\n    returnUrlInput.value = window.location.href\n    form.appendChild(returnUrlInput)\n\n    // Add Turbo data attribute to prevent Turbo from intercepting\n    form.setAttribute('data-turbo', 'false')\n\n    document.body.appendChild(form)\n    sessionStorage.setItem(\"signup_modal_source\", \"google_one_tap\")\n    form.submit()\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { loadGoogleMaps, resolvedGoogleMapsApiKey } from \"../lib/google_maps\"\nimport { countryCodeFromPlace } from \"../lib/google_places_country\"\n\n/**\n * Google PlaceAutocompleteElement widget.\n * Dispatches google-places:select with { lat, lng, label, country } on this.element (bubbles).\n */\nexport default class extends Controller {\n  static values = {\n    apiKey: String,\n    placeholder: { type: String, default: \"Search for an address\u2026\" },\n    initialQuery: { type: String, default: \"\" },\n    lang: { type: String, default: \"\" }\n  }\n\n  resolvedApiKey() {\n    const fromValue = (this.apiKeyValue || \"\").trim()\n    if (fromValue) return fromValue\n    return resolvedGoogleMapsApiKey()\n  }\n\n  requestLang() {\n    const v = this.langValue && this.langValue.trim()\n    if (v) return v\n    return (document.documentElement.lang || \"en\").split(\"-\")[0] || \"en\"\n  }\n\n  connect() {\n    this.onSelect = this.onSelect.bind(this)\n    this.initWidget()\n  }\n\n  async initWidget() {\n    this.element.classList.add(\"relative\")\n    this.showLoadingPlaceholder()\n\n    const apiKey = this.resolvedApiKey()\n    if (!apiKey) {\n      this.showMissingKeyMessage()\n      return\n    }\n\n    try {\n      const maps = await loadGoogleMaps(apiKey, this.requestLang())\n      const { PlaceAutocompleteElement } = await maps.importLibrary(\"places\")\n\n      this.widget = new PlaceAutocompleteElement({\n        includedPrimaryTypes: [\"street_address\", \"premise\", \"subpremise\", \"route\"],\n        noInputIcon: true\n      })\n      this.widget.id = \"property-address\"\n      this.widget.placeholder = this.placeholderValue\n      this.widget.className = \"block w-full\"\n\n      const q = (this.initialQueryValue || \"\").trim()\n      if (q) this.widget.value = q\n\n      this.widget.addEventListener(\"gmp-select\", this.onSelect)\n      this.element.replaceChildren()\n      this.element.appendChild(this.widget)\n    } catch (e) {\n      console.error(\"Google Places widget error:\", e)\n      this.showMissingKeyMessage(\"Unable to load address search\")\n    }\n  }\n\n  showLoadingPlaceholder() {\n    this.element.replaceChildren()\n    const input = document.createElement(\"input\")\n    input.type = \"text\"\n    input.disabled = true\n    input.placeholder = this.placeholderValue\n    input.setAttribute(\"aria-busy\", \"true\")\n    input.className =\n      \"block w-full rounded-lg border-2 border-[#E4F0EA] bg-white py-3 pl-3 pr-3 text-sm text-slate-400 shadow-sm\"\n    this.element.appendChild(input)\n  }\n\n  showMissingKeyMessage(message = \"Missing Google Maps API key (set GOOGLE_MAPS_API_KEY)\") {\n    const input = document.createElement(\"input\")\n    input.id = \"property-address\"\n    input.type = \"text\"\n    input.disabled = true\n    input.placeholder = message\n    input.className =\n      \"block w-full rounded-lg border border-slate-300 bg-slate-100 py-2.5 pl-3 pr-3 text-sm text-slate-500\"\n    this.element.appendChild(input)\n  }\n\n  async onSelect(event) {\n    const placePrediction = event.placePrediction\n    if (!placePrediction) return\n\n    try {\n      const place = placePrediction.toPlace()\n      await place.fetchFields({ fields: [\"formattedAddress\", \"location\", \"addressComponents\"] })\n\n      const location = place.location\n      if (!location) return\n\n      const lat = location.lat()\n      const lng = location.lng()\n      if (!Number.isFinite(lat) || !Number.isFinite(lng)) return\n\n      const label = place.formattedAddress || this.widget?.value || \"\"\n      const country = countryCodeFromPlace(place)\n\n      this.element.dispatchEvent(\n        new CustomEvent(\"google-places:select\", {\n          bubbles: true,\n          detail: { lat, lng, label, country }\n        })\n      )\n    } catch (e) {\n      console.error(\"Google Places selection error:\", e)\n    }\n  }\n\n  disconnect() {\n    if (this.widget) {\n      this.widget.removeEventListener(\"gmp-select\", this.onSelect)\n      this.widget = null\n    }\n    this.element.replaceChildren()\n  }\n}\n", "/**\n * [Simple linear regression](http://en.wikipedia.org/wiki/Simple_linear_regression)\n * is a simple way to find a fitted line\n * between a set of coordinates. This algorithm finds the slope and y-intercept of a regression line\n * using the least sum of squares.\n *\n * @param {Array<Array<number>>} data an array of two-element of arrays,\n * like `[[0, 1], [2, 3]]`\n * @returns {Object} object containing slope and intersect of regression line\n * @example\n * linearRegression([[0, 0], [1, 1]]); // => { m: 1, b: 0 }\n */\nfunction linearRegression(data) {\n    let m;\n    let b;\n\n    // Store data length in a local variable to reduce\n    // repeated object property lookups\n    const dataLength = data.length;\n\n    //if there's only one point, arbitrarily choose a slope of 0\n    //and a y-intercept of whatever the y of the initial point is\n    if (dataLength === 1) {\n        m = 0;\n        b = data[0][1];\n    } else {\n        // Initialize our sums and scope the `m` and `b`\n        // variables that define the line.\n        let sumX = 0;\n        let sumY = 0;\n        let sumXX = 0;\n        let sumXY = 0;\n\n        // Use local variables to grab point values\n        // with minimal object property lookups\n        let point;\n        let x;\n        let y;\n\n        // Gather the sum of all x values, the sum of all\n        // y values, and the sum of x^2 and (x*y) for each\n        // value.\n        //\n        // In math notation, these would be SS_x, SS_y, SS_xx, and SS_xy\n        for (let i = 0; i < dataLength; i++) {\n            point = data[i];\n            x = point[0];\n            y = point[1];\n\n            sumX += x;\n            sumY += y;\n\n            sumXX += x * x;\n            sumXY += x * y;\n        }\n\n        // `m` is the slope of the regression line\n        m =\n            (dataLength * sumXY - sumX * sumY) /\n            (dataLength * sumXX - sumX * sumX);\n\n        // `b` is the y-intercept of the line.\n        b = sumY / dataLength - (m * sumX) / dataLength;\n    }\n\n    // Return both values as an object.\n    return {\n        m: m,\n        b: b\n    };\n}\n\nexport default linearRegression;\n", "/**\n * Given the output of `linearRegression`: an object\n * with `m` and `b` values indicating slope and intercept,\n * respectively, generate a line function that translates\n * x values into y values.\n *\n * @param {Object} mb object with `m` and `b` members, representing\n * slope and intersect of desired line\n * @returns {Function} method that computes y-value at any given\n * x-value on the line.\n * @example\n * var l = linearRegressionLine(linearRegression([[0, 0], [1, 1]]));\n * l(0) // = 0\n * l(2) // = 2\n * linearRegressionLine({ b: 0, m: 1 })(1); // => 1\n * linearRegressionLine({ b: 1, m: 1 })(1); // => 2\n */\nfunction linearRegressionLine(mb /*: { b: number, m: number }*/) {\n    // Return a function that computes a `y` value for each\n    // x value it is given, based on the values of `b` and `a`\n    // that we just computed.\n    return function (x) {\n        return mb.b + mb.m * x;\n    };\n}\n\nexport default linearRegressionLine;\n", "/**\n * Our default sum is the [Kahan-Babuska algorithm](https://pdfs.semanticscholar.org/1760/7d467cda1d0277ad272deb2113533131dc09.pdf).\n * This method is an improvement over the classical\n * [Kahan summation algorithm](https://en.wikipedia.org/wiki/Kahan_summation_algorithm).\n * It aims at computing the sum of a list of numbers while correcting for\n * floating-point errors. Traditionally, sums are calculated as many\n * successive additions, each one with its own floating-point roundoff. These\n * losses in precision add up as the number of numbers increases. This alternative\n * algorithm is more accurate than the simple way of calculating sums by simple\n * addition.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} sum of all input numbers\n * @example\n * sum([1, 2, 3]); // => 6\n */\nfunction sum(x) {\n    // If the array is empty, we needn't bother computing its sum\n    if (x.length === 0) {\n        return 0;\n    }\n\n    // Initializing the sum as the first number in the array\n    let sum = x[0];\n\n    // Keeping track of the floating-point error correction\n    let correction = 0;\n\n    let transition;\n\n    if (typeof sum !== \"number\") {\n        return Number.NaN;\n    }\n\n    for (let i = 1; i < x.length; i++) {\n        if (typeof x[i] !== \"number\") {\n            return Number.NaN;\n        }\n        transition = sum + x[i];\n\n        // Here we need to update the correction in a different fashion\n        // if the new absolute value is greater than the absolute sum\n        if (Math.abs(sum) >= Math.abs(x[i])) {\n            correction += sum - transition + x[i];\n        } else {\n            correction += x[i] - transition + sum;\n        }\n\n        sum = transition;\n    }\n\n    // Returning the corrected sum\n    return sum + correction;\n}\n\nexport default sum;\n", "import sum from \"./sum.js\";\n\n/**\n * The mean, _also known as average_,\n * is the sum of all values over the number of values.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} mean\n * @example\n * mean([0, 10]); // => 5\n */\nfunction mean(x) {\n    if (x.length === 0) {\n        throw new Error(\"mean requires at least one data point\");\n    }\n\n    return sum(x) / x.length;\n}\n\nexport default mean;\n", "import mean from \"./mean.js\";\n\n/**\n * The sum of deviations to the Nth power.\n * When n=2 it's the sum of squared deviations.\n * When n=3 it's the sum of cubed deviations.\n *\n * @param {Array<number>} x\n * @param {number} n power\n * @returns {number} sum of nth power deviations\n *\n * @example\n * var input = [1, 2, 3];\n * // since the variance of a set is the mean squared\n * // deviations, we can calculate that with sumNthPowerDeviations:\n * sumNthPowerDeviations(input, 2) / input.length;\n */\nfunction sumNthPowerDeviations(x, n) {\n    const meanValue = mean(x);\n    let sum = 0;\n    let tempValue;\n    let i;\n\n    // This is an optimization: when n is 2 (we're computing a number squared),\n    // multiplying the number by itself is significantly faster than using\n    // the Math.pow method.\n    if (n === 2) {\n        for (i = 0; i < x.length; i++) {\n            tempValue = x[i] - meanValue;\n            sum += tempValue * tempValue;\n        }\n    } else {\n        for (i = 0; i < x.length; i++) {\n            sum += Math.pow(x[i] - meanValue, n);\n        }\n    }\n\n    return sum;\n}\n\nexport default sumNthPowerDeviations;\n", "import sumNthPowerDeviations from \"./sum_nth_power_deviations.js\";\n\n/**\n * The [variance](http://en.wikipedia.org/wiki/Variance)\n * is the sum of squared deviations from the mean.\n *\n * This is an implementation of variance, not sample variance:\n * see the `sampleVariance` method if you want a sample measure.\n *\n * @param {Array<number>} x a population of one or more data points\n * @returns {number} variance: a value greater than or equal to zero.\n * zero indicates that all values are identical.\n * @throws {Error} if x's length is 0\n * @example\n * variance([1, 2, 3, 4, 5, 6]); // => 2.9166666666666665\n */\nfunction variance(x) {\n    if (x.length === 0) {\n        throw new Error(\"variance requires at least one data point\");\n    }\n\n    // Find the mean of squared deviations between the\n    // mean value and each value.\n    return sumNthPowerDeviations(x, 2) / x.length;\n}\n\nexport default variance;\n", "import variance from \"./variance.js\";\n\n/**\n * The [standard deviation](http://en.wikipedia.org/wiki/Standard_deviation)\n * is the square root of the variance. This is also known as the population\n * standard deviation. It's useful for measuring the amount\n * of variation or dispersion in a set of values.\n *\n * Standard deviation is only appropriate for full-population knowledge: for\n * samples of a population, {@link sampleStandardDeviation} is\n * more appropriate.\n *\n * @param {Array<number>} x input\n * @returns {number} standard deviation\n * @example\n * variance([2, 4, 4, 4, 5, 5, 7, 9]); // => 4\n * standardDeviation([2, 4, 4, 4, 5, 5, 7, 9]); // => 2\n */\nfunction standardDeviation(x) {\n    if (x.length === 1) {\n        return 0;\n    }\n    const v = variance(x);\n    return Math.sqrt(v);\n}\n\nexport default standardDeviation;\n", "/**\n * The [R Squared](http://en.wikipedia.org/wiki/Coefficient_of_determination)\n * value of data compared with a function `f`\n * is the sum of the squared differences between the prediction\n * and the actual value.\n *\n * @param {Array<Array<number>>} x input data: this should be doubly-nested\n * @param {Function} func function called on `[i][0]` values within the dataset\n * @returns {number} r-squared value\n * @example\n * var samples = [[0, 0], [1, 1]];\n * var regressionLine = linearRegressionLine(linearRegression(samples));\n * rSquared(samples, regressionLine); // = 1 this line is a perfect fit\n */\nfunction rSquared(x, func) {\n    if (x.length < 2) {\n        return 1;\n    }\n\n    // Compute the average y value for the actual\n    // data set in order to compute the\n    // _total sum of squares_\n    let sum = 0;\n    for (let i = 0; i < x.length; i++) {\n        sum += x[i][1];\n    }\n    const average = sum / x.length;\n\n    // Compute the total sum of squares - the\n    // squared difference between each point\n    // and the average of all points.\n    let sumOfSquares = 0;\n    for (let j = 0; j < x.length; j++) {\n        sumOfSquares += Math.pow(average - x[j][1], 2);\n    }\n\n    // Finally estimate the error: the squared\n    // difference between the estimate and the actual data\n    // value at each point.\n    let err = 0;\n    for (let k = 0; k < x.length; k++) {\n        err += Math.pow(x[k][1] - func(x[k][0]), 2);\n    }\n\n    // As the error grows larger, its ratio to the\n    // sum of squares increases and the r squared\n    // value grows lower.\n    return 1 - err / sumOfSquares;\n}\n\nexport default rSquared;\n", "/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)` because the input is sorted.\n *\n * @param {Array<number>} sorted a sample of one or more data points\n * @returns {number} mode\n * @throws {Error} if sorted is empty\n * @example\n * modeSorted([0, 0, 1]); // => 0\n */\nfunction modeSorted(sorted) {\n    // Handle edge cases:\n    // The mode of an empty list is undefined\n    if (sorted.length === 0) {\n        throw new Error(\"mode requires at least one data point\");\n    }\n    if (sorted.length === 1) {\n        return sorted[0];\n    }\n\n    // This assumes it is dealing with an array of size > 1, since size\n    // 0 and 1 are handled immediately. Hence it starts at index 1 in the\n    // array.\n    let last = sorted[0];\n    // store the mode as we find new modes\n    let value = Number.NaN;\n    // store how many times we've seen the mode\n    let maxSeen = 0;\n    // how many times the current candidate for the mode\n    // has been seen\n    let seenThis = 1;\n\n    // end at sorted.length + 1 to fix the case in which the mode is\n    // the highest number that occurs in the sequence. the last iteration\n    // compares sorted[i], which is undefined, to the highest number\n    // in the series\n    for (let i = 1; i < sorted.length + 1; i++) {\n        // we're seeing a new number pass by\n        if (sorted[i] !== last) {\n            // the last number is the new mode since we saw it more\n            // often than the old one\n            if (seenThis > maxSeen) {\n                maxSeen = seenThis;\n                value = last;\n            }\n            seenThis = 1;\n            last = sorted[i];\n            // if this isn't a new number, it's one more occurrence of\n            // the potential mode\n        } else {\n            seenThis++;\n        }\n    }\n    return value;\n}\n\nexport default modeSorted;\n", "/**\n * Sort an array of numbers by their numeric value, ensuring that the\n * array is not changed in place.\n *\n * This is necessary because the default behavior of .sort\n * in JavaScript is to sort arrays as string values\n *\n *     [1, 10, 12, 102, 20].sort()\n *     // output\n *     [1, 10, 102, 12, 20]\n *\n * @param {Array<number>} x input array\n * @return {Array<number>} sorted array\n * @private\n * @example\n * numericSort([3, 2, 1]) // => [1, 2, 3]\n */\nfunction numericSort(x) {\n    return (\n        x\n            // ensure the array is not changed in-place\n            .slice()\n            // comparator function that treats input as numeric\n            .sort(function (a, b) {\n                return a - b;\n            })\n    );\n}\n\nexport default numericSort;\n", "import modeSorted from \"./mode_sorted.js\";\nimport numericSort from \"./numeric_sort.js\";\n\n/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n log(n))` because it needs to sort the array internally\n * before running an `O(n)` search to find the mode.\n *\n * @param {Array<number>} x input\n * @returns {number} mode\n * @example\n * mode([0, 0, 1]); // => 0\n */\nfunction mode(x) {\n    // Sorting the array lets us iterate through it below and be sure\n    // that every time we see a new number it's new and we'll never\n    // see the same number twice\n    return modeSorted(numericSort(x));\n}\n\nexport default mode;\n", "/* globals Map: false */\n\n/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * modeFast uses a Map object to keep track of the mode, instead of the approach\n * used with `mode`, a sorted array. As a result, it is faster\n * than `mode` and supports any data type that can be compared with `==`.\n * It also requires a\n * [JavaScript environment with support for Map](https://kangax.github.io/compat-table/es6/#test-Map),\n * and will throw an error if Map is not available.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * @param {Array<*>} x a sample of one or more data points\n * @returns {?*} mode\n * @throws {ReferenceError} if the JavaScript environment doesn't support Map\n * @throws {Error} if x is empty\n * @example\n * modeFast(['rabbits', 'rabbits', 'squirrels']); // => 'rabbits'\n */\nfunction modeFast(x) {\n    // This index will reflect the incidence of different values, indexing\n    // them like\n    // { value: count }\n    const index = new Map();\n\n    // A running `mode` and the number of times it has been encountered.\n    let mode;\n    let modeCount = 0;\n\n    for (let i = 0; i < x.length; i++) {\n        let newCount = index.get(x[i]);\n        if (newCount === undefined) {\n            newCount = 1;\n        } else {\n            newCount++;\n        }\n        if (newCount > modeCount) {\n            mode = x[i];\n            modeCount = newCount;\n        }\n        index.set(x[i], newCount);\n    }\n\n    if (modeCount === 0) {\n        throw new Error(\"mode requires at last one data point\");\n    }\n\n    return mode;\n}\n\nexport default modeFast;\n", "/**\n * The min is the lowest number in the array.\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} minimum value\n * @example\n * min([1, 5, -10, 100, 2]); // => -10\n */\nfunction min(x) {\n    if (x.length === 0) {\n        throw new Error(\"min requires at least one data point\");\n    }\n\n    let value = x[0];\n    for (let i = 1; i < x.length; i++) {\n        if (x[i] < value) {\n            value = x[i];\n        }\n    }\n    return value;\n}\n\nexport default min;\n", "/**\n * This computes the maximum number in an array.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} maximum value\n * @throws {Error} if the length of x is less than one\n * @example\n * max([1, 2, 3, 4]);\n * // => 4\n */\nfunction max(x) {\n    if (x.length === 0) {\n        throw new Error(\"max requires at least one data point\");\n    }\n\n    let value = x[0];\n    for (let i = 1; i < x.length; i++) {\n        if (x[i] > value) {\n            value = x[i];\n        }\n    }\n    return value;\n}\n\nexport default max;\n", "/**\n * This computes the minimum & maximum number in an array.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {Array<number>} minimum & maximum value\n * @throws {Error} if the length of x is less than one\n * @example\n * extent([1, 2, 3, 4]);\n * // => [1, 4]\n */\nfunction extent(x) {\n    if (x.length === 0) {\n        throw new Error(\"extent requires at least one data point\");\n    }\n\n    let min = x[0];\n    let max = x[0];\n    for (let i = 1; i < x.length; i++) {\n        if (x[i] > max) {\n            max = x[i];\n        }\n        if (x[i] < min) {\n            min = x[i];\n        }\n    }\n    return [min, max];\n}\n\nexport default extent;\n", "/**\n * The minimum is the lowest number in the array. With a sorted array,\n * the first element in the array is always the smallest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {number} minimum value\n * @example\n * minSorted([-100, -10, 1, 2, 5]); // => -100\n */\nfunction minSorted(x) {\n    return x[0];\n}\n\nexport default minSorted;\n", "/**\n * The maximum is the highest number in the array. With a sorted array,\n * the last element in the array is always the largest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {number} maximum value\n * @example\n * maxSorted([-100, -10, 1, 2, 5]); // => 5\n */\nfunction maxSorted(x) {\n    return x[x.length - 1];\n}\n\nexport default maxSorted;\n", "/**\n * The extent is the lowest & highest number in the array. With a sorted array,\n * the first element in the array is always the lowest while the last element is always the largest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {Array<number>} minimum & maximum value\n * @example\n * extentSorted([-100, -10, 1, 2, 5]); // => [-100, 5]\n */\nfunction extentSorted(x) {\n    return [x[0], x[x.length - 1]];\n}\n\nexport default extentSorted;\n", "/**\n * The simple [sum](https://en.wikipedia.org/wiki/Summation) of an array\n * is the result of adding all numbers together, starting from zero.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} sum of all input numbers\n * @example\n * sumSimple([1, 2, 3]); // => 6\n */\nfunction sumSimple(x) {\n    let value = 0;\n    for (let i = 0; i < x.length; i++) {\n        if (typeof x[i] !== \"number\") {\n            return Number.NaN;\n        }\n        value += x[i];\n    }\n    return value;\n}\n\nexport default sumSimple;\n", "/**\n * The [product](https://en.wikipedia.org/wiki/Product_(mathematics)) of an array\n * is the result of multiplying all numbers together, starting using one as the multiplicative identity.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} product of all input numbers\n * @example\n * product([1, 2, 3, 4]); // => 24\n */\nfunction product(x) {\n    let value = 1;\n    for (let i = 0; i < x.length; i++) {\n        value *= x[i];\n    }\n    return value;\n}\n\nexport default product;\n", "/**\n * This is the internal implementation of quantiles: when you know\n * that the order is sorted, you don't need to re-sort it, and the computations\n * are faster.\n *\n * @param {Array<number>} x sample of one or more data points\n * @param {number} p desired quantile: a number between 0 to 1, inclusive\n * @returns {number} quantile value\n * @throws {Error} if p ix outside of the range from 0 to 1\n * @throws {Error} if x is empty\n * @example\n * quantileSorted([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20], 0.5); // => 9\n */\nfunction quantileSorted(x, p) {\n    const idx = x.length * p;\n    if (x.length === 0) {\n        throw new Error(\"quantile requires at least one data point.\");\n    } else if (p < 0 || p > 1) {\n        throw new Error(\"quantiles must be between 0 and 1\");\n    } else if (p === 1) {\n        // If p is 1, directly return the last element\n        return x[x.length - 1];\n    } else if (p === 0) {\n        // If p is 0, directly return the first element\n        return x[0];\n    } else if (idx % 1 !== 0) {\n        // If p is not integer, return the next element in array\n        return x[Math.ceil(idx) - 1];\n    } else if (x.length % 2 === 0) {\n        // If the list has even-length, we'll take the average of this number\n        // and the next value, if there is one\n        return (x[idx - 1] + x[idx]) / 2;\n    } else {\n        // Finally, in the simple case of an integer value\n        // with an odd-length list, return the x value at the index.\n        return x[idx];\n    }\n}\n\nexport default quantileSorted;\n", "/**\n * Rearrange items in `arr` so that all items in `[left, k]` range are the smallest.\n * The `k`-th element will have the `(k - left + 1)`-th smallest value in `[left, right]`.\n *\n * Implements Floyd-Rivest selection algorithm https://en.wikipedia.org/wiki/Floyd-Rivest_algorithm\n *\n * @param {Array<number>} arr input array\n * @param {number} k pivot index\n * @param {number} [left] left index\n * @param {number} [right] right index\n * @returns {void} mutates input array\n * @example\n * var arr = [65, 28, 59, 33, 21, 56, 22, 95, 50, 12, 90, 53, 28, 77, 39];\n * quickselect(arr, 8);\n * // = [39, 28, 28, 33, 21, 12, 22, 50, 53, 56, 59, 65, 90, 77, 95]\n */\nfunction quickselect(arr, k, left, right) {\n    left = left || 0;\n    right = right || arr.length - 1;\n\n    while (right > left) {\n        // 600 and 0.5 are arbitrary constants chosen in the original paper to minimize execution time\n        if (right - left > 600) {\n            const n = right - left + 1;\n            const m = k - left + 1;\n            const z = Math.log(n);\n            const s = 0.5 * Math.exp((2 * z) / 3);\n            let sd = 0.5 * Math.sqrt((z * s * (n - s)) / n);\n            if (m - n / 2 < 0) sd *= -1;\n            const newLeft = Math.max(left, Math.floor(k - (m * s) / n + sd));\n            const newRight = Math.min(\n                right,\n                Math.floor(k + ((n - m) * s) / n + sd)\n            );\n            quickselect(arr, k, newLeft, newRight);\n        }\n\n        const t = arr[k];\n        let i = left;\n        let j = right;\n\n        swap(arr, left, k);\n        if (arr[right] > t) swap(arr, left, right);\n\n        while (i < j) {\n            swap(arr, i, j);\n            i++;\n            j--;\n            while (arr[i] < t) i++;\n            while (arr[j] > t) j--;\n        }\n\n        if (arr[left] === t) swap(arr, left, j);\n        else {\n            j++;\n            swap(arr, j, right);\n        }\n\n        if (j <= k) left = j + 1;\n        if (k <= j) right = j - 1;\n    }\n}\n\nfunction swap(arr, i, j) {\n    const tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n}\n\nexport default quickselect;\n", "import quantileSorted from \"./quantile_sorted.js\";\nimport quickselect from \"./quickselect.js\";\n\n/**\n * The [quantile](https://en.wikipedia.org/wiki/Quantile):\n * this is a population quantile, since we assume to know the entire\n * dataset in this library. This is an implementation of the\n * [Quantiles of a Population](http://en.wikipedia.org/wiki/Quantile#Quantiles_of_a_population)\n * algorithm from wikipedia.\n *\n * Sample is a one-dimensional array of numbers,\n * and p is either a decimal number from 0 to 1 or an array of decimal\n * numbers from 0 to 1.\n * In terms of a k/q quantile, p = k/q - it's just dealing with fractions or dealing\n * with decimal values.\n * When p is an array, the result of the function is also an array containing the appropriate\n * quantiles in input order\n *\n * @param {Array<number>} x sample of one or more numbers\n * @param {Array<number> | number} p the desired quantile, as a number between 0 and 1\n * @returns {number} quantile\n * @example\n * quantile([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20], 0.5); // => 9\n */\nfunction quantile(x, p) {\n    const copy = x.slice();\n\n    if (Array.isArray(p)) {\n        // rearrange elements so that each element corresponding to a requested\n        // quantile is on a place it would be if the array was fully sorted\n        multiQuantileSelect(copy, p);\n        // Initialize the result array\n        const results = [];\n        // For each requested quantile\n        for (let i = 0; i < p.length; i++) {\n            results[i] = quantileSorted(copy, p[i]);\n        }\n        return results;\n    } else {\n        const idx = quantileIndex(copy.length, p);\n        quantileSelect(copy, idx, 0, copy.length - 1);\n        return quantileSorted(copy, p);\n    }\n}\n\nfunction quantileSelect(arr, k, left, right) {\n    if (k % 1 === 0) {\n        quickselect(arr, k, left, right);\n    } else {\n        k = Math.floor(k);\n        quickselect(arr, k, left, right);\n        quickselect(arr, k + 1, k + 1, right);\n    }\n}\n\nfunction multiQuantileSelect(arr, p) {\n    const indices = [0];\n    for (let i = 0; i < p.length; i++) {\n        indices.push(quantileIndex(arr.length, p[i]));\n    }\n    indices.push(arr.length - 1);\n    indices.sort(compare);\n\n    const stack = [0, indices.length - 1];\n\n    while (stack.length) {\n        const r = Math.ceil(stack.pop());\n        const l = Math.floor(stack.pop());\n        if (r - l <= 1) continue;\n\n        const m = Math.floor((l + r) / 2);\n        quantileSelect(\n            arr,\n            indices[m],\n            Math.floor(indices[l]),\n            Math.ceil(indices[r])\n        );\n\n        stack.push(l, m, m, r);\n    }\n}\n\nfunction compare(a, b) {\n    return a - b;\n}\n\nfunction quantileIndex(len, p) {\n    const idx = len * p;\n    if (p === 1) {\n        // If p is 1, directly return the last index\n        return len - 1;\n    } else if (p === 0) {\n        // If p is 0, directly return the first index\n        return 0;\n    } else if (idx % 1 !== 0) {\n        // If index is not integer, return the next index in array\n        return Math.ceil(idx) - 1;\n    } else if (len % 2 === 0) {\n        // If the list has even-length, we'll return the middle of two indices\n        // around quantile to indicate that we need an average value of the two\n        return idx - 0.5;\n    } else {\n        // Finally, in the simple case of an integer index\n        // with an odd-length list, return the index\n        return idx;\n    }\n}\n\nexport default quantile;\n", "/* eslint no-bitwise: 0 */\n\n/**\n * This function returns the quantile in which one would find the given value in\n * the given array. With a sorted array, leveraging binary search, we can find\n * this information in logarithmic time.\n *\n * @param {Array<number>} x input\n * @returns {number} value value\n * @example\n * quantileRankSorted([1, 2, 3, 4], 3); // => 0.75\n * quantileRankSorted([1, 2, 3, 3, 4], 3); // => 0.7\n * quantileRankSorted([1, 2, 3, 4], 6); // => 1\n * quantileRankSorted([1, 2, 3, 3, 5], 4); // => 0.8\n */\nfunction quantileRankSorted(x, value) {\n    // Value is lesser than any value in the array\n    if (value < x[0]) {\n        return 0;\n    }\n\n    // Value is greater than any value in the array\n    if (value > x[x.length - 1]) {\n        return 1;\n    }\n\n    let l = lowerBound(x, value);\n\n    // Value is not in the array\n    if (x[l] !== value) {\n        return l / x.length;\n    }\n\n    l++;\n\n    const u = upperBound(x, value);\n\n    // The value exists only once in the array\n    if (u === l) {\n        return l / x.length;\n    }\n\n    // Here, we are basically computing the mean of the range of indices\n    // containing our searched value. But, instead, of initializing an\n    // array and looping over it, there is a dedicated math formula that\n    // we apply below to get the result.\n    const r = u - l + 1;\n    const sum = (r * (u + l)) / 2;\n    const mean = sum / r;\n\n    return mean / x.length;\n}\n\nfunction lowerBound(x, value) {\n    let mid = 0;\n    let lo = 0;\n    let hi = x.length;\n\n    while (lo < hi) {\n        mid = (lo + hi) >>> 1;\n\n        if (value <= x[mid]) {\n            hi = mid;\n        } else {\n            lo = -~mid;\n        }\n    }\n\n    return lo;\n}\n\nfunction upperBound(x, value) {\n    let mid = 0;\n    let lo = 0;\n    let hi = x.length;\n\n    while (lo < hi) {\n        mid = (lo + hi) >>> 1;\n\n        if (value >= x[mid]) {\n            lo = -~mid;\n        } else {\n            hi = mid;\n        }\n    }\n\n    return lo;\n}\n\nexport default quantileRankSorted;\n", "import numericSort from \"./numeric_sort.js\";\nimport quantileRankSorted from \"./quantile_rank_sorted.js\";\n\n/**\n * This function returns the quantile in which one would find the given value in\n * the given array. It will copy and sort your array before each run, so\n * if you know your array is already sorted, you should use `quantileRankSorted`\n * instead.\n *\n * @param {Array<number>} x input\n * @returns {number} value value\n * @example\n * quantileRank([4, 3, 1, 2], 3); // => 0.75\n * quantileRank([4, 3, 2, 3, 1], 3); // => 0.7\n * quantileRank([2, 4, 1, 3], 6); // => 1\n * quantileRank([5, 3, 1, 2, 3], 4); // => 0.8\n */\nfunction quantileRank(x, value) {\n    // Cloning and sorting the array\n    const sortedCopy = numericSort(x);\n\n    return quantileRankSorted(sortedCopy, value);\n}\n\nexport default quantileRank;\n", "import quantile from \"./quantile.js\";\n\n/**\n * The [Interquartile range](http://en.wikipedia.org/wiki/Interquartile_range) is\n * a measure of statistical dispersion, or how scattered, spread, or\n * concentrated a distribution is. It's computed as the difference between\n * the third quartile and first quartile.\n *\n * @param {Array<number>} x sample of one or more numbers\n * @returns {number} interquartile range: the span between lower and upper quartile,\n * 0.25 and 0.75\n * @example\n * interquartileRange([0, 1, 2, 3]); // => 2\n */\nfunction interquartileRange(x) {\n    // Interquartile range is the span between the upper quartile,\n    // at `0.75`, and lower quartile, `0.25`\n    const q1 = quantile(x, 0.75);\n    const q2 = quantile(x, 0.25);\n\n    if (typeof q1 === \"number\" && typeof q2 === \"number\") {\n        return q1 - q2;\n    }\n}\n\nexport default interquartileRange;\n", "import quantile from \"./quantile.js\";\n\n/**\n * The [median](http://en.wikipedia.org/wiki/Median) is\n * the middle number of a list. This is often a good indicator of 'the middle'\n * when there are outliers that skew the `mean()` value.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The median isn't necessarily one of the elements in the list: the value\n * can be the average of two elements if the list has an even length\n * and the two central values are different.\n *\n * @param {Array<number>} x input\n * @returns {number} median value\n * @example\n * median([10, 2, 5, 100, 2, 1]); // => 3.5\n */\nfunction median(x) {\n    return +quantile(x, 0.5);\n}\n\nexport default median;\n", "import median from \"./median.js\";\n\n/**\n * The [Median Absolute Deviation](http://en.wikipedia.org/wiki/Median_absolute_deviation) is\n * a robust measure of statistical\n * dispersion. It is more resilient to outliers than the standard deviation.\n *\n * @param {Array<number>} x input array\n * @returns {number} median absolute deviation\n * @example\n * medianAbsoluteDeviation([1, 1, 2, 2, 4, 6, 9]); // => 1\n */\nfunction medianAbsoluteDeviation(x) {\n    const medianValue = median(x);\n    const medianAbsoluteDeviations = [];\n\n    // Make a list of absolute deviations from the median\n    for (let i = 0; i < x.length; i++) {\n        medianAbsoluteDeviations.push(Math.abs(x[i] - medianValue));\n    }\n\n    // Find the median value of that list\n    return median(medianAbsoluteDeviations);\n}\n\nexport default medianAbsoluteDeviation;\n", "/**\n * Split an array into chunks of a specified size. This function\n * has the same behavior as [PHP's array_chunk](http://php.net/manual/en/function.array-chunk.php)\n * function, and thus will insert smaller-sized chunks at the end if\n * the input size is not divisible by the chunk size.\n *\n * `x` is expected to be an array, and `chunkSize` a number.\n * The `x` array can contain any kind of data.\n *\n * @param {Array} x a sample\n * @param {number} chunkSize size of each output array. must be a positive integer\n * @returns {Array<Array>} a chunked array\n * @throws {Error} if chunk size is less than 1 or not an integer\n * @example\n * chunk([1, 2, 3, 4, 5, 6], 2);\n * // => [[1, 2], [3, 4], [5, 6]]\n */\nfunction chunk(x, chunkSize) {\n    // a list of result chunks, as arrays in an array\n    const output = [];\n\n    // `chunkSize` must be zero or higher - otherwise the loop below,\n    // in which we call `start += chunkSize`, will loop infinitely.\n    // So, we'll detect and throw in that case to indicate\n    // invalid input.\n    if (chunkSize < 1) {\n        throw new Error(\"chunk size must be a positive number\");\n    }\n\n    if (Math.floor(chunkSize) !== chunkSize) {\n        throw new Error(\"chunk size must be an integer\");\n    }\n\n    // `start` is the index at which `.slice` will start selecting\n    // new array elements\n    for (let start = 0; start < x.length; start += chunkSize) {\n        // for each chunk, slice that part of the array and add it\n        // to the output. The `.slice` function does not change\n        // the original array.\n        output.push(x.slice(start, start + chunkSize));\n    }\n    return output;\n}\n\nexport default chunk;\n", "/**\n * Sampling with replacement is a type of sampling that allows the same\n * item to be picked out of a population more than once.\n *\n * @param {Array<*>} x an array of any kind of value\n * @param {number} n count of how many elements to take\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} n sampled items from the population\n * @example\n * var values = [1, 2, 3, 4];\n * sampleWithReplacement(values, 2); // returns 2 random values, like [2, 4];\n */\nfunction sampleWithReplacement(x, n, randomSource) {\n    if (x.length === 0) {\n        return [];\n    }\n\n    // a custom random number source can be provided if you want to use\n    // a fixed seed or another random number generator, like\n    // [random-js](https://www.npmjs.org/package/random-js)\n    randomSource = randomSource || Math.random;\n\n    const length = x.length;\n    const sample = [];\n\n    for (let i = 0; i < n; i++) {\n        const index = Math.floor(randomSource() * length);\n\n        sample.push(x[index]);\n    }\n\n    return sample;\n}\n\nexport default sampleWithReplacement;\n", "/**\n * A [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)\n * in-place - which means that it **will change the order of the original\n * array by reference**.\n *\n * This is an algorithm that generates a random [permutation](https://en.wikipedia.org/wiki/Permutation)\n * of a set.\n *\n * @param {Array} x sample of one or more numbers\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @returns {Array} x\n * @example\n * var x = [1, 2, 3, 4];\n * shuffleInPlace(x);\n * // x is shuffled to a value like [2, 1, 4, 3]\n */\nfunction shuffleInPlace(x, randomSource) {\n    // a custom random number source can be provided if you want to use\n    // a fixed seed or another random number generator, like\n    // [random-js](https://www.npmjs.org/package/random-js)\n    randomSource = randomSource || Math.random;\n\n    // store the current length of the x to determine\n    // when no elements remain to shuffle.\n    let length = x.length;\n\n    // temporary is used to hold an item when it is being\n    // swapped between indices.\n    let temporary;\n\n    // The index to swap at each stage.\n    let index;\n\n    // While there are still items to shuffle\n    while (length > 0) {\n        // choose a random index within the subset of the array\n        // that is not yet shuffled\n        index = Math.floor(randomSource() * length--);\n\n        // store the value that we'll move temporarily\n        temporary = x[length];\n\n        // swap the value at `x[length]` with `x[index]`\n        x[length] = x[index];\n        x[index] = temporary;\n    }\n\n    return x;\n}\n\nexport default shuffleInPlace;\n", "import shuffleInPlace from \"./shuffle_in_place.js\";\n\n/**\n * A [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)\n * is a fast way to create a random permutation of a finite set. This is\n * a function around `shuffle_in_place` that adds the guarantee that\n * it will not modify its input.\n *\n * @param {Array} x sample of 0 or more numbers\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} shuffled version of input\n * @example\n * var shuffled = shuffle([1, 2, 3, 4]);\n * shuffled; // = [2, 3, 1, 4] or any other random permutation\n */\nfunction shuffle(x, randomSource) {\n    // slice the original array so that it is not modified\n    const sample = x.slice();\n\n    // and then shuffle that shallow-copied array, in place\n    return shuffleInPlace(sample, randomSource);\n}\n\nexport default shuffle;\n", "import shuffle from \"./shuffle.js\";\n\n/**\n * Create a [simple random sample](http://en.wikipedia.org/wiki/Simple_random_sample)\n * from a given array of `n` elements.\n *\n * The sampled values will be in any order, not necessarily the order\n * they appear in the input.\n *\n * @param {Array<any>} x input array. can contain any type\n * @param {number} n count of how many elements to take\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} subset of n elements in original array\n *\n * @example\n * var values = [1, 2, 4, 5, 6, 7, 8, 9];\n * sample(values, 3); // returns 3 random values, like [2, 5, 8];\n */\nfunction sample(x, n, randomSource) {\n    // shuffle the original array using a fisher-yates shuffle\n    const shuffled = shuffle(x, randomSource);\n\n    // and then return a subset of it - the first `n` elements.\n    return shuffled.slice(0, n);\n}\n\nexport default sample;\n", "/**\n * Create a new column x row matrix.\n *\n * @private\n * @param {number} columns\n * @param {number} rows\n * @return {Array<Array<number>>} matrix\n * @example\n * makeMatrix(10, 10);\n */\nfunction makeMatrix(columns, rows) {\n    const matrix = [];\n    for (let i = 0; i < columns; i++) {\n        const column = [];\n        for (let j = 0; j < rows; j++) {\n            column.push(0);\n        }\n        matrix.push(column);\n    }\n    return matrix;\n}\n\nexport default makeMatrix;\n", "/**\n * For a sorted input, counting the number of unique values\n * is possible in constant time and constant memory. This is\n * a simple implementation of the algorithm.\n *\n * Values are compared with `===`, so objects and non-primitive objects\n * are not handled in any special way.\n *\n * @param {Array<*>} x an array of any kind of value\n * @returns {number} count of unique values\n * @example\n * uniqueCountSorted([1, 2, 3]); // => 3\n * uniqueCountSorted([1, 1, 1]); // => 1\n */\nfunction uniqueCountSorted(x) {\n    let uniqueValueCount = 0;\n    let lastSeenValue;\n    for (let i = 0; i < x.length; i++) {\n        if (i === 0 || x[i] !== lastSeenValue) {\n            lastSeenValue = x[i];\n            uniqueValueCount++;\n        }\n    }\n    return uniqueValueCount;\n}\n\nexport default uniqueCountSorted;\n", "import makeMatrix from \"./make_matrix.js\";\nimport numericSort from \"./numeric_sort.js\";\nimport uniqueCountSorted from \"./unique_count_sorted.js\";\n\n/**\n * Generates incrementally computed values based on the sums and sums of\n * squares for the data array\n *\n * @private\n * @param {number} j\n * @param {number} i\n * @param {Array<number>} sums\n * @param {Array<number>} sumsOfSquares\n * @return {number}\n * @example\n * ssq(0, 1, [-1, 0, 2], [1, 1, 5]);\n */\nfunction ssq(j, i, sums, sumsOfSquares) {\n    let sji; // s(j, i)\n    if (j > 0) {\n        const muji = (sums[i] - sums[j - 1]) / (i - j + 1); // mu(j, i)\n        sji =\n            sumsOfSquares[i] - sumsOfSquares[j - 1] - (i - j + 1) * muji * muji;\n    } else {\n        sji = sumsOfSquares[i] - (sums[i] * sums[i]) / (i + 1);\n    }\n    if (sji < 0) {\n        return 0;\n    }\n    return sji;\n}\n\n/**\n * Function that recursively divides and conquers computations\n * for cluster j\n *\n * @private\n * @param {number} iMin Minimum index in cluster to be computed\n * @param {number} iMax Maximum index in cluster to be computed\n * @param {number} cluster Index of the cluster currently being computed\n * @param {Array<Array<number>>} matrix\n * @param {Array<Array<number>>} backtrackMatrix\n * @param {Array<number>} sums\n * @param {Array<number>} sumsOfSquares\n */\nfunction fillMatrixColumn(\n    iMin,\n    iMax,\n    cluster,\n    matrix,\n    backtrackMatrix,\n    sums,\n    sumsOfSquares\n) {\n    if (iMin > iMax) {\n        return;\n    }\n\n    // Start at midpoint between iMin and iMax\n    const i = Math.floor((iMin + iMax) / 2);\n\n    matrix[cluster][i] = matrix[cluster - 1][i - 1];\n    backtrackMatrix[cluster][i] = i;\n\n    let jlow = cluster; // the lower end for j\n\n    if (iMin > cluster) {\n        jlow = Math.max(jlow, backtrackMatrix[cluster][iMin - 1] || 0);\n    }\n    jlow = Math.max(jlow, backtrackMatrix[cluster - 1][i] || 0);\n\n    let jhigh = i - 1; // the upper end for j\n    if (iMax < matrix[0].length - 1) {\n        /* c8 ignore start */\n        jhigh = Math.min(jhigh, backtrackMatrix[cluster][iMax + 1] || 0);\n        /* c8 ignore end */\n    }\n\n    let sji;\n    let sjlowi;\n    let ssqjlow;\n    let ssqj;\n    for (let j = jhigh; j >= jlow; --j) {\n        sji = ssq(j, i, sums, sumsOfSquares);\n\n        if (sji + matrix[cluster - 1][jlow - 1] >= matrix[cluster][i]) {\n            break;\n        }\n\n        // Examine the lower bound of the cluster border\n        sjlowi = ssq(jlow, i, sums, sumsOfSquares);\n\n        ssqjlow = sjlowi + matrix[cluster - 1][jlow - 1];\n\n        if (ssqjlow < matrix[cluster][i]) {\n            // Shrink the lower bound\n            matrix[cluster][i] = ssqjlow;\n            backtrackMatrix[cluster][i] = jlow;\n        }\n        jlow++;\n\n        ssqj = sji + matrix[cluster - 1][j - 1];\n        if (ssqj < matrix[cluster][i]) {\n            matrix[cluster][i] = ssqj;\n            backtrackMatrix[cluster][i] = j;\n        }\n    }\n\n    fillMatrixColumn(\n        iMin,\n        i - 1,\n        cluster,\n        matrix,\n        backtrackMatrix,\n        sums,\n        sumsOfSquares\n    );\n    fillMatrixColumn(\n        i + 1,\n        iMax,\n        cluster,\n        matrix,\n        backtrackMatrix,\n        sums,\n        sumsOfSquares\n    );\n}\n\n/**\n * Initializes the main matrices used in Ckmeans and kicks\n * off the divide and conquer cluster computation strategy\n *\n * @private\n * @param {Array<number>} data sorted array of values\n * @param {Array<Array<number>>} matrix\n * @param {Array<Array<number>>} backtrackMatrix\n */\nfunction fillMatrices(data, matrix, backtrackMatrix) {\n    const nValues = matrix[0].length;\n\n    // Shift values by the median to improve numeric stability\n    const shift = data[Math.floor(nValues / 2)];\n\n    // Cumulative sum and cumulative sum of squares for all values in data array\n    const sums = [];\n    const sumsOfSquares = [];\n\n    // Initialize first column in matrix & backtrackMatrix\n    for (let i = 0, shiftedValue; i < nValues; ++i) {\n        shiftedValue = data[i] - shift;\n        if (i === 0) {\n            sums.push(shiftedValue);\n            sumsOfSquares.push(shiftedValue * shiftedValue);\n        } else {\n            sums.push(sums[i - 1] + shiftedValue);\n            sumsOfSquares.push(\n                sumsOfSquares[i - 1] + shiftedValue * shiftedValue\n            );\n        }\n\n        // Initialize for cluster = 0\n        matrix[0][i] = ssq(0, i, sums, sumsOfSquares);\n        backtrackMatrix[0][i] = 0;\n    }\n\n    // Initialize the rest of the columns\n    let iMin;\n    for (let cluster = 1; cluster < matrix.length; ++cluster) {\n        if (cluster < matrix.length - 1) {\n            iMin = cluster;\n        } else {\n            // No need to compute matrix[K-1][0] ... matrix[K-1][N-2]\n            iMin = nValues - 1;\n        }\n\n        fillMatrixColumn(\n            iMin,\n            nValues - 1,\n            cluster,\n            matrix,\n            backtrackMatrix,\n            sums,\n            sumsOfSquares\n        );\n    }\n}\n\n/**\n * Ckmeans clustering is an improvement on heuristic-based clustering\n * approaches like Jenks. The algorithm was developed in\n * [Haizhou Wang and Mingzhou Song](http://journal.r-project.org/archive/2011-2/RJournal_2011-2_Wang+Song.pdf)\n * as a [dynamic programming](https://en.wikipedia.org/wiki/Dynamic_programming) approach\n * to the problem of clustering numeric data into groups with the least\n * within-group sum-of-squared-deviations.\n *\n * Minimizing the difference within groups - what Wang & Song refer to as\n * `withinss`, or within sum-of-squares, means that groups are optimally\n * homogenous within and the data is split into representative groups.\n * This is very useful for visualization, where you may want to represent\n * a continuous variable in discrete color or style groups. This function\n * can provide groups that emphasize differences between data.\n *\n * Being a dynamic approach, this algorithm is based on two matrices that\n * store incrementally-computed values for squared deviations and backtracking\n * indexes.\n *\n * This implementation is based on Ckmeans 3.4.6, which introduced a new divide\n * and conquer approach that improved runtime from O(kn^2) to O(kn log(n)).\n *\n * Unlike the [original implementation](https://cran.r-project.org/web/packages/Ckmeans.1d.dp/index.html),\n * this implementation does not include any code to automatically determine\n * the optimal number of clusters: this information needs to be explicitly\n * provided.\n *\n * ### References\n * _Ckmeans.1d.dp: Optimal k-means Clustering in One Dimension by Dynamic\n * Programming_ Haizhou Wang and Mingzhou Song ISSN 2073-4859\n *\n * from The R Journal Vol. 3/2, December 2011\n * @param {Array<number>} x input data, as an array of number values\n * @param {number} nClusters number of desired classes. This cannot be\n * greater than the number of values in the data array.\n * @returns {Array<Array<number>>} clustered input\n * @throws {Error} if the number of requested clusters is higher than the size of the data\n * @example\n * ckmeans([-1, 2, -1, 2, 4, 5, 6, -1, 2, -1], 3);\n * // The input, clustered into groups of similar numbers.\n * //= [[-1, -1, -1, -1], [2, 2, 2], [4, 5, 6]]);\n */\nfunction ckmeans(x, nClusters) {\n    if (nClusters > x.length) {\n        throw new Error(\n            \"cannot generate more classes than there are data values\"\n        );\n    }\n\n    const sorted = numericSort(x);\n    // we'll use this as the maximum number of clusters\n    const uniqueCount = uniqueCountSorted(sorted);\n\n    // if all of the input values are identical, there's one cluster\n    // with all of the input in it.\n    if (uniqueCount === 1) {\n        return [sorted];\n    }\n\n    // named 'S' originally\n    const matrix = makeMatrix(nClusters, sorted.length);\n    // named 'J' originally\n    const backtrackMatrix = makeMatrix(nClusters, sorted.length);\n\n    // This is a dynamic programming way to solve the problem of minimizing\n    // within-cluster sum of squares. It's similar to linear regression\n    // in this way, and this calculation incrementally computes the\n    // sum of squares that are later read.\n    fillMatrices(sorted, matrix, backtrackMatrix);\n\n    // The real work of Ckmeans clustering happens in the matrix generation:\n    // the generated matrices encode all possible clustering combinations, and\n    // once they're generated we can solve for the best clustering groups\n    // very quickly.\n    const clusters = [];\n    let clusterRight = backtrackMatrix[0].length - 1;\n\n    // Backtrack the clusters from the dynamic programming matrix. This\n    // starts at the bottom-right corner of the matrix (if the top-left is 0, 0),\n    // and moves the cluster target with the loop.\n    for (let cluster = backtrackMatrix.length - 1; cluster >= 0; cluster--) {\n        const clusterLeft = backtrackMatrix[cluster][clusterRight];\n\n        // fill the cluster from the sorted input by taking a slice of the\n        // array. the backtrack matrix makes this easy - it stores the\n        // indexes where the cluster should start and end.\n        clusters[cluster] = sorted.slice(clusterLeft, clusterRight + 1);\n\n        if (cluster > 0) {\n            clusterRight = clusterLeft - 1;\n        }\n    }\n\n    return clusters;\n}\n\nexport default ckmeans;\n", "/*\n * Pull Breaks Values for Jenks\n *\n * the second part of the jenks recipe: take the calculated matrices\n * and derive an array of n breaks.\n *\n * @private\n */\nfunction jenksBreaks(data, lowerClassLimits, nClasses) {\n    let k = data.length;\n    const kclass = [];\n    let countNum = nClasses;\n\n    // the calculation of classes will never include the upper\n    // bound, so we need to explicitly set it\n    kclass[nClasses] = data[data.length - 1];\n\n    // the lowerClassLimits matrix is used as indices into itself\n    // here: the `k` variable is reused in each iteration.\n    while (countNum > 0) {\n        kclass[countNum - 1] = data[lowerClassLimits[k][countNum] - 1];\n        k = lowerClassLimits[k][countNum] - 1;\n        countNum--;\n    }\n\n    return kclass;\n}\n\nexport default jenksBreaks;\n", "/*\n * Compute Matrices for Jenks\n *\n * Compute the matrices required for Jenks breaks. These matrices\n * can be used for any classing of data with `classes <= nClasses`\n *\n * @private\n */\nfunction jenksMatrices(data, nClasses) {\n    // in the original implementation, these matrices are referred to\n    // as `LC` and `OP`\n    //\n    // * lowerClassLimits (LC): optimal lower class limits\n    // * varianceCombinations (OP): optimal variance combinations for all classes\n    const lowerClassLimits = [];\n    const varianceCombinations = [];\n    // loop counters\n    let i;\n    let j;\n    // the variance, as computed at each step in the calculation\n    let variance = 0;\n\n    // Initialize and fill each matrix with zeroes\n    for (i = 0; i < data.length + 1; i++) {\n        const tmp1 = [];\n        const tmp2 = [];\n        // despite these arrays having the same values, we need\n        // to keep them separate so that changing one does not change\n        // the other\n        for (j = 0; j < nClasses + 1; j++) {\n            tmp1.push(0);\n            tmp2.push(0);\n        }\n        lowerClassLimits.push(tmp1);\n        varianceCombinations.push(tmp2);\n    }\n\n    for (i = 1; i < nClasses + 1; i++) {\n        lowerClassLimits[1][i] = 1;\n        varianceCombinations[1][i] = 0;\n        // in the original implementation, 9999999 is used but\n        // since Javascript has `Infinity`, we use that.\n        for (j = 2; j < data.length + 1; j++) {\n            varianceCombinations[j][i] = Number.POSITIVE_INFINITY;\n        }\n    }\n\n    for (let l = 2; l < data.length + 1; l++) {\n        // `SZ` originally. this is the sum of the values seen thus\n        // far when calculating variance.\n        let sum = 0;\n        // `ZSQ` originally. the sum of squares of values seen\n        // thus far\n        let sumSquares = 0;\n        // `WT` originally. This is the number of\n        let w = 0;\n        // `IV` originally\n        let i4 = 0;\n\n        // in several instances, you could say `Math.pow(x, 2)`\n        // instead of `x * x`, but this is slower in some browsers\n        // introduces an unnecessary concept.\n        for (let m = 1; m < l + 1; m++) {\n            // `III` originally\n            const lowerClassLimit = l - m + 1;\n            const val = data[lowerClassLimit - 1];\n\n            // here we're estimating variance for each potential classing\n            // of the data, for each potential number of classes. `w`\n            // is the number of data points considered so far.\n            w++;\n\n            // increase the current sum and sum-of-squares\n            sum += val;\n            sumSquares += val * val;\n\n            // the variance at this point in the sequence is the difference\n            // between the sum of squares and the total x 2, over the number\n            // of samples.\n            variance = sumSquares - (sum * sum) / w;\n\n            i4 = lowerClassLimit - 1;\n\n            if (i4 !== 0) {\n                for (j = 2; j < nClasses + 1; j++) {\n                    // if adding this element to an existing class\n                    // will increase its variance beyond the limit, break\n                    // the class at this point, setting the `lowerClassLimit`\n                    // at this point.\n                    if (\n                        varianceCombinations[l][j] >=\n                        variance + varianceCombinations[i4][j - 1]\n                    ) {\n                        lowerClassLimits[l][j] = lowerClassLimit;\n                        varianceCombinations[l][j] =\n                            variance + varianceCombinations[i4][j - 1];\n                    }\n                }\n            }\n        }\n\n        lowerClassLimits[l][1] = 1;\n        varianceCombinations[l][1] = variance;\n    }\n\n    // return the two matrices. for just providing breaks, only\n    // `lowerClassLimits` is needed, but variances can be useful to\n    // evaluate goodness of fit.\n    return {\n        lowerClassLimits: lowerClassLimits,\n        varianceCombinations: varianceCombinations\n    };\n}\n\nexport default jenksMatrices;\n", "import jenksBreaks from \"./jenks_breaks.js\";\nimport jenksMatrices from \"./jenks_matrices.js\";\n\n/**\n * The **[jenks natural breaks optimization](http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization)**\n * is an algorithm commonly used in cartography and visualization to decide\n * upon groupings of data values that minimize variance within themselves\n * and maximize variation between themselves.\n *\n * For instance, cartographers often use jenks in order to choose which\n * values are assigned to which colors in a [choropleth](https://en.wikipedia.org/wiki/Choropleth_map)\n * map.\n *\n * @param {Array<number>} data input data, as an array of number values\n * @param {number} nClasses number of desired classes\n * @returns {Array<number>} array of class break positions\n * // split data into 3 break points\n * jenks([1, 2, 4, 5, 7, 9, 10, 20], 3) // = [1, 7, 20, 20]\n */\nfunction jenks(data, nClasses) {\n    if (nClasses > data.length) {\n        return null;\n    }\n\n    // sort data in numerical order, since this is expected\n    // by the matrices function\n    data = data.slice().sort(function (a, b) {\n        return a - b;\n    });\n\n    // get our basic matrices\n    const matrices = jenksMatrices(data, nClasses);\n    // we only need lower class limits here\n    const lowerClassLimits = matrices.lowerClassLimits;\n\n    // extract nClasses out of the computed matrices\n    return jenksBreaks(data, lowerClassLimits, nClasses);\n}\n\nexport default jenks;\n", "import max from \"./max.js\";\nimport min from \"./min.js\";\n\n/**\n * Given an array of x, this will find the extent of the\n * x and return an array of breaks that can be used\n * to categorize the x into a number of classes. The\n * returned array will always be 1 longer than the number of\n * classes because it includes the minimum value.\n *\n * @param {Array<number>} x an array of number values\n * @param {number} nClasses number of desired classes\n * @returns {Array<number>} array of class break positions\n * @example\n * equalIntervalBreaks([1, 2, 3, 4, 5, 6], 4); // => [1, 2.25, 3.5, 4.75, 6]\n */\nfunction equalIntervalBreaks(x, nClasses) {\n    if (x.length < 2) {\n        return x;\n    }\n\n    const theMin = min(x);\n    const theMax = max(x);\n\n    // the first break will always be the minimum value\n    // in the xset\n    const breaks = [theMin];\n\n    // The size of each break is the full range of the x\n    // divided by the number of classes requested\n    const breakSize = (theMax - theMin) / nClasses;\n\n    // In the case of nClasses = 1, this loop won't run\n    // and the returned breaks will be [min, max]\n    for (let i = 1; i < nClasses; i++) {\n        breaks.push(breaks[0] + breakSize * i);\n    }\n\n    // the last break will always be the\n    // maximum.\n    breaks.push(theMax);\n\n    return breaks;\n}\n\nexport default equalIntervalBreaks;\n", "import mean from \"./mean.js\";\n\n/**\n * [Sample covariance](https://en.wikipedia.org/wiki/Sample_mean_and_covariance) of two datasets:\n * how much do the two datasets move together?\n * x and y are two datasets, represented as arrays of numbers.\n *\n * @param {Array<number>} x a sample of two or more data points\n * @param {Array<number>} y a sample of two or more data points\n * @throws {Error} if x and y do not have equal lengths\n * @throws {Error} if x or y have length of one or less\n * @returns {number} sample covariance\n * @example\n * sampleCovariance([1, 2, 3, 4, 5, 6], [6, 5, 4, 3, 2, 1]); // => -3.5\n */\nfunction sampleCovariance(x, y) {\n    // The two datasets must have the same length which must be more than 1\n    if (x.length !== y.length) {\n        throw new Error(\"sampleCovariance requires samples with equal lengths\");\n    }\n\n    if (x.length < 2) {\n        throw new Error(\n            \"sampleCovariance requires at least two data points in each sample\"\n        );\n    }\n\n    // determine the mean of each dataset so that we can judge each\n    // value of the dataset fairly as the difference from the mean. this\n    // way, if one dataset is [1, 2, 3] and [2, 3, 4], their covariance\n    // does not suffer because of the difference in absolute values\n    const xmean = mean(x);\n    const ymean = mean(y);\n    let sum = 0;\n\n    // for each pair of values, the covariance increases when their\n    // difference from the mean is associated - if both are well above\n    // or if both are well below\n    // the mean, the covariance increases significantly.\n    for (let i = 0; i < x.length; i++) {\n        sum += (x[i] - xmean) * (y[i] - ymean);\n    }\n\n    // this is Bessels' Correction: an adjustment made to sample statistics\n    // that allows for the reduced degree of freedom entailed in calculating\n    // values from samples rather than complete populations.\n    const besselsCorrection = x.length - 1;\n\n    // the covariance is weighted by the length of the datasets.\n    return sum / besselsCorrection;\n}\n\nexport default sampleCovariance;\n", "import sumNthPowerDeviations from \"./sum_nth_power_deviations.js\";\n\n/**\n * The [sample variance](https://en.wikipedia.org/wiki/Variance#Sample_variance)\n * is the sum of squared deviations from the mean. The sample variance\n * is distinguished from the variance by the usage of [Bessel's Correction](https://en.wikipedia.org/wiki/Bessel's_correction):\n * instead of dividing the sum of squared deviations by the length of the input,\n * it is divided by the length minus one. This corrects the bias in estimating\n * a value from a set that you don't know if full.\n *\n * References:\n * * [Wolfram MathWorld on Sample Variance](http://mathworld.wolfram.com/SampleVariance.html)\n *\n * @param {Array<number>} x a sample of two or more data points\n * @throws {Error} if the length of x is less than 2\n * @return {number} sample variance\n * @example\n * sampleVariance([1, 2, 3, 4, 5]); // => 2.5\n */\nfunction sampleVariance(x) {\n    if (x.length < 2) {\n        throw new Error(\"sampleVariance requires at least two data points\");\n    }\n\n    const sumSquaredDeviationsValue = sumNthPowerDeviations(x, 2);\n\n    // this is Bessels' Correction: an adjustment made to sample statistics\n    // that allows for the reduced degree of freedom entailed in calculating\n    // values from samples rather than complete populations.\n    const besselsCorrection = x.length - 1;\n\n    // Find the mean value of that list\n    return sumSquaredDeviationsValue / besselsCorrection;\n}\n\nexport default sampleVariance;\n", "import sampleVariance from \"./sample_variance.js\";\n\n/**\n * The [sample standard deviation](http://en.wikipedia.org/wiki/Standard_deviation#Sample_standard_deviation)\n * is the square root of the sample variance.\n *\n * @param {Array<number>} x input array\n * @returns {number} sample standard deviation\n * @example\n * sampleStandardDeviation([2, 4, 4, 4, 5, 5, 7, 9]).toFixed(2);\n * // => '2.14'\n */\nfunction sampleStandardDeviation(x) {\n    const sampleVarianceX = sampleVariance(x);\n    return Math.sqrt(sampleVarianceX);\n}\n\nexport default sampleStandardDeviation;\n", "import sampleCovariance from \"./sample_covariance.js\";\nimport sampleStandardDeviation from \"./sample_standard_deviation.js\";\n\n/**\n * The [correlation](http://en.wikipedia.org/wiki/Correlation_and_dependence) is\n * a measure of how correlated two datasets are, between -1 and 1\n *\n * @param {Array<number>} x first input\n * @param {Array<number>} y second input\n * @returns {number} sample correlation\n * @example\n * sampleCorrelation([1, 2, 3, 4, 5, 6], [2, 2, 3, 4, 5, 60]).toFixed(2);\n * // => '0.69'\n */\nfunction sampleCorrelation(x, y) {\n    const cov = sampleCovariance(x, y);\n    const xstd = sampleStandardDeviation(x);\n    const ystd = sampleStandardDeviation(y);\n\n    return cov / xstd / ystd;\n}\n\nexport default sampleCorrelation;\n", "import sampleCorrelation from \"./sample_correlation.js\";\n\n/**\n * The [rank correlation](https://en.wikipedia.org/wiki/Rank_correlation) is\n * a measure of the strength of monotonic relationship between two arrays\n *\n * @param {Array<number>} x first input\n * @param {Array<number>} y second input\n * @returns {number} sample rank correlation\n */\nfunction sampleRankCorrelation(x, y) {\n    const xIndexes = x\n        .map((value, index) => [value, index])\n        .sort((a, b) => a[0] - b[0])\n        .map((pair) => pair[1]);\n    const yIndexes = y\n        .map((value, index) => [value, index])\n        .sort((a, b) => a[0] - b[0])\n        .map((pair) => pair[1]);\n\n    // At this step, we have an array of indexes\n    // that map from sorted numbers to their original indexes. We reverse\n    // that so that it is an array of the sorted destination index.\n    const xRanks = Array(xIndexes.length);\n    const yRanks = Array(xIndexes.length);\n    for (let i = 0; i < xIndexes.length; i++) {\n        xRanks[xIndexes[i]] = i;\n        yRanks[yIndexes[i]] = i;\n    }\n\n    return sampleCorrelation(xRanks, yRanks);\n}\n\nexport default sampleRankCorrelation;\n", "import mean from \"./mean.js\";\n\n/**\n * [Skewness](http://en.wikipedia.org/wiki/Skewness) is\n * a measure of the extent to which a probability distribution of a\n * real-valued random variable \"leans\" to one side of the mean.\n * The skewness value can be positive or negative, or even undefined.\n *\n * Implementation is based on the adjusted Fisher-Pearson standardized\n * moment coefficient, which is the version found in Excel and several\n * statistical packages including Minitab, SAS and SPSS.\n *\n * @since 4.1.0\n * @param {Array<number>} x a sample of 3 or more data points\n * @returns {number} sample skewness\n * @throws {Error} if x has length less than 3\n * @example\n * sampleSkewness([2, 4, 6, 3, 1]); // => 0.590128656384365\n */\nfunction sampleSkewness(x) {\n    if (x.length < 3) {\n        throw new Error(\"sampleSkewness requires at least three data points\");\n    }\n\n    const meanValue = mean(x);\n    let tempValue;\n    let sumSquaredDeviations = 0;\n    let sumCubedDeviations = 0;\n\n    for (let i = 0; i < x.length; i++) {\n        tempValue = x[i] - meanValue;\n        sumSquaredDeviations += tempValue * tempValue;\n        sumCubedDeviations += tempValue * tempValue * tempValue;\n    }\n\n    // this is Bessels' Correction: an adjustment made to sample statistics\n    // that allows for the reduced degree of freedom entailed in calculating\n    // values from samples rather than complete populations.\n    const besselsCorrection = x.length - 1;\n\n    // Find the mean value of that list\n    const theSampleStandardDeviation = Math.sqrt(\n        sumSquaredDeviations / besselsCorrection\n    );\n\n    const n = x.length;\n    const cubedS = Math.pow(theSampleStandardDeviation, 3);\n\n    return (n * sumCubedDeviations) / ((n - 1) * (n - 2) * cubedS);\n}\n\nexport default sampleSkewness;\n", "import mean from \"./mean.js\";\n\n/**\n * [Kurtosis](http://en.wikipedia.org/wiki/Kurtosis) is\n * a measure of the heaviness of a distribution's tails relative to its\n * variance. The kurtosis value can be positive or negative, or even undefined.\n *\n * Implementation is based on Fisher's excess kurtosis definition and uses\n * unbiased moment estimators. This is the version found in Excel and available\n * in several statistical packages, including SAS and SciPy.\n *\n * @param {Array<number>} x a sample of 4 or more data points\n * @returns {number} sample kurtosis\n * @throws {Error} if x has length less than 4\n * @example\n * sampleKurtosis([1, 2, 2, 3, 5]); // => 1.4555765595463122\n */\nfunction sampleKurtosis(x) {\n    const n = x.length;\n\n    if (n < 4) {\n        throw new Error(\"sampleKurtosis requires at least four data points\");\n    }\n\n    const meanValue = mean(x);\n    let tempValue;\n    let secondCentralMoment = 0;\n    let fourthCentralMoment = 0;\n\n    for (let i = 0; i < n; i++) {\n        tempValue = x[i] - meanValue;\n        secondCentralMoment += tempValue * tempValue;\n        fourthCentralMoment += tempValue * tempValue * tempValue * tempValue;\n    }\n\n    return (\n        ((n - 1) / ((n - 2) * (n - 3))) *\n        ((n * (n + 1) * fourthCentralMoment) /\n            (secondCentralMoment * secondCentralMoment) -\n            3 * (n - 1))\n    );\n}\n\nexport default sampleKurtosis;\n", "/**\n * Implementation of [Heap's Algorithm](https://en.wikipedia.org/wiki/Heap%27s_algorithm)\n * for generating permutations.\n *\n * @param {Array} elements any type of data\n * @returns {Array<Array>} array of permutations\n */\nfunction permutationsHeap(elements) {\n    const indexes = new Array(elements.length);\n    const permutations = [elements.slice()];\n\n    for (let i = 0; i < elements.length; i++) {\n        indexes[i] = 0;\n    }\n\n    for (let i = 0; i < elements.length; ) {\n        if (indexes[i] < i) {\n            // At odd indexes, swap from indexes[i] instead\n            // of from the beginning of the array\n            let swapFrom = 0;\n            if (i % 2 !== 0) {\n                swapFrom = indexes[i];\n            }\n\n            // swap between swapFrom and i, using\n            // a temporary variable as storage.\n            const temp = elements[swapFrom];\n            elements[swapFrom] = elements[i];\n            elements[i] = temp;\n\n            permutations.push(elements.slice());\n            indexes[i]++;\n            i = 0;\n        } else {\n            indexes[i] = 0;\n            i++;\n        }\n    }\n\n    return permutations;\n}\n\nexport default permutationsHeap;\n", "/**\n * Implementation of Combinations\n * Combinations are unique subsets of a collection - in this case, k x from a collection at a time.\n * https://en.wikipedia.org/wiki/Combination\n * @param {Array} x any type of data\n * @param {int} k the number of objects in each group (without replacement)\n * @returns {Array<Array>} array of permutations\n * @example\n * combinations([1, 2, 3], 2); // => [[1,2], [1,3], [2,3]]\n */\n\nfunction combinations(x, k) {\n    let i;\n    let subI;\n    const combinationList = [];\n    let subsetCombinations;\n    let next;\n\n    for (i = 0; i < x.length; i++) {\n        if (k === 1) {\n            combinationList.push([x[i]]);\n        } else {\n            subsetCombinations = combinations(x.slice(i + 1, x.length), k - 1);\n            for (subI = 0; subI < subsetCombinations.length; subI++) {\n                next = subsetCombinations[subI];\n                next.unshift(x[i]);\n                combinationList.push(next);\n            }\n        }\n    }\n    return combinationList;\n}\n\nexport default combinations;\n", "/**\n * Implementation of [Combinations](https://en.wikipedia.org/wiki/Combination) with replacement\n * Combinations are unique subsets of a collection - in this case, k x from a collection at a time.\n * 'With replacement' means that a given element can be chosen multiple times.\n * Unlike permutation, order doesn't matter for combinations.\n *\n * @param {Array} x any type of data\n * @param {int} k the number of objects in each group (without replacement)\n * @returns {Array<Array>} array of permutations\n * @example\n * combinationsReplacement([1, 2], 2); // => [[1, 1], [1, 2], [2, 2]]\n */\nfunction combinationsReplacement(x, k) {\n    const combinationList = [];\n\n    for (let i = 0; i < x.length; i++) {\n        if (k === 1) {\n            // If we're requested to find only one element, we don't need\n            // to recurse: just push `x[i]` onto the list of combinations.\n            combinationList.push([x[i]]);\n        } else {\n            // Otherwise, recursively find combinations, given `k - 1`. Note that\n            // we request `k - 1`, so if you were looking for k=3 combinations, we're\n            // requesting k=2. This -1 gets reversed in the for loop right after this\n            // code, since we concatenate `x[i]` onto the selected combinations,\n            // bringing `k` back up to your requested level.\n            // This recursion may go many levels deep, since it only stops once\n            // k=1.\n            const subsetCombinations = combinationsReplacement(\n                x.slice(i, x.length),\n                k - 1\n            );\n\n            for (let j = 0; j < subsetCombinations.length; j++) {\n                combinationList.push([x[i]].concat(subsetCombinations[j]));\n            }\n        }\n    }\n\n    return combinationList;\n}\n\nexport default combinationsReplacement;\n", "/**\n * When adding a new value to a list, one does not have to necessary\n * recompute the mean of the list in linear time. They can instead use\n * this function to compute the new mean by providing the current mean,\n * the number of elements in the list that produced it and the new\n * value to add.\n *\n * @since 2.5.0\n * @param {number} mean current mean\n * @param {number} n number of items in the list\n * @param {number} newValue the added value\n * @returns {number} the new mean\n *\n * @example\n * addToMean(14, 5, 53); // => 20.5\n */\nfunction addToMean(mean, n, newValue) {\n    return mean + (newValue - mean) / (n + 1);\n}\n\nexport default addToMean;\n", "/**\n * When combining two lists of values for which one already knows the means,\n * one does not have to necessary recompute the mean of the combined lists in\n * linear time. They can instead use this function to compute the combined\n * mean by providing the mean & number of values of the first list and the mean\n * & number of values of the second list.\n *\n * @since 3.0.0\n * @param {number} mean1 mean of the first list\n * @param {number} n1 number of items in the first list\n * @param {number} mean2 mean of the second list\n * @param {number} n2 number of items in the second list\n * @returns {number} the combined mean\n *\n * @example\n * combineMeans(5, 3, 4, 3); // => 4.5\n */\nfunction combineMeans(mean1, n1, mean2, n2) {\n    return (mean1 * n1 + mean2 * n2) / (n1 + n2);\n}\n\nexport default combineMeans;\n", "import combineMeans from \"./combine_means.js\";\n\n/**\n * When combining two lists of values for which one already knows the variances,\n * one does not have to necessary recompute the variance of the combined lists\n * in linear time. They can instead use this function to compute the combined\n * variance by providing the variance, mean & number of values of the first list\n * and the variance, mean & number of values of the second list.\n *\n * @since 3.0.0\n * @param {number} variance1 variance of the first list\n * @param {number} mean1 mean of the first list\n * @param {number} n1 number of items in the first list\n * @param {number} variance2 variance of the second list\n * @param {number} mean2 mean of the second list\n * @param {number} n2 number of items in the second list\n * @returns {number} the combined mean\n *\n * @example\n * combineVariances(14 / 3, 5, 3, 8 / 3, 4, 3); // => 47 / 12\n */\nfunction combineVariances(variance1, mean1, n1, variance2, mean2, n2) {\n    const newMean = combineMeans(mean1, n1, mean2, n2);\n\n    return (\n        (n1 * (variance1 + Math.pow(mean1 - newMean, 2)) +\n            n2 * (variance2 + Math.pow(mean2 - newMean, 2))) /\n        (n1 + n2)\n    );\n}\n\nexport default combineVariances;\n", "/**\n * The [Geometric Mean](https://en.wikipedia.org/wiki/Geometric_mean) is\n * a mean function that is more useful for numbers in different\n * ranges.\n *\n * This is the nth root of the input numbers multiplied by each other.\n *\n * The geometric mean is often useful for\n * **[proportional growth](https://en.wikipedia.org/wiki/Geometric_mean#Proportional_growth)**: given\n * growth rates for multiple years, like _80%, 16.66% and 42.85%_, a simple\n * mean will incorrectly estimate an average growth rate, whereas a geometric\n * mean will correctly estimate a growth rate that, over those years,\n * will yield the same end value.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} geometric mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n * @example\n * var growthRates = [1.80, 1.166666, 1.428571];\n * var averageGrowth = ss.geometricMean(growthRates);\n * var averageGrowthRates = [averageGrowth, averageGrowth, averageGrowth];\n * var startingValue = 10;\n * var startingValueMean = 10;\n * growthRates.forEach(function(rate) {\n *   startingValue *= rate;\n * });\n * averageGrowthRates.forEach(function(rate) {\n *   startingValueMean *= rate;\n * });\n * startingValueMean === startingValue;\n */\nfunction geometricMean(x) {\n    if (x.length === 0) {\n        throw new Error(\"geometricMean requires at least one data point\");\n    }\n\n    // the starting value.\n    let value = 1;\n\n    for (let i = 0; i < x.length; i++) {\n        // the geometric mean is only valid for positive numbers\n        if (x[i] < 0) {\n            throw new Error(\n                \"geometricMean requires only non-negative numbers as input\"\n            );\n        }\n\n        // repeatedly multiply the value by each number\n        value *= x[i];\n    }\n\n    return Math.pow(value, 1 / x.length);\n}\n\nexport default geometricMean;\n", "/**\n * The [log average](https://en.wikipedia.org/wiki/https://en.wikipedia.org/wiki/Geometric_mean#Relationship_with_logarithms)\n * is an equivalent way of computing the geometric mean of an array suitable for large or small products.\n *\n * It's found by calculating the average logarithm of the elements and exponentiating.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} geometric mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n */\nfunction logAverage(x) {\n    if (x.length === 0) {\n        throw new Error(\"logAverage requires at least one data point\");\n    }\n\n    let value = 0;\n    for (let i = 0; i < x.length; i++) {\n        if (x[i] < 0) {\n            throw new Error(\n                \"logAverage requires only non-negative numbers as input\"\n            );\n        }\n        value += Math.log(x[i]);\n    }\n\n    return Math.exp(value / x.length);\n}\n\nexport default logAverage;\n", "/**\n * The [Harmonic Mean](https://en.wikipedia.org/wiki/Harmonic_mean) is\n * a mean function typically used to find the average of rates.\n * This mean is calculated by taking the reciprocal of the arithmetic mean\n * of the reciprocals of the input numbers.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} harmonic mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n * @example\n * harmonicMean([2, 3]).toFixed(2) // => '2.40'\n */\nfunction harmonicMean(x) {\n    if (x.length === 0) {\n        throw new Error(\"harmonicMean requires at least one data point\");\n    }\n\n    let reciprocalSum = 0;\n\n    for (let i = 0; i < x.length; i++) {\n        // the harmonic mean is only valid for positive numbers\n        if (x[i] <= 0) {\n            throw new Error(\n                \"harmonicMean requires only positive numbers as input\"\n            );\n        }\n\n        reciprocalSum += 1 / x[i];\n    }\n\n    // divide n by the reciprocal sum\n    return x.length / reciprocalSum;\n}\n\nexport default harmonicMean;\n", "import sumSimple from \"./sum_simple.js\";\n\n/**\n * The mean, _also known as average_,\n * is the sum of all values over the number of values.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The simple mean uses the successive addition method internally\n * to calculate it's result. Errors in floating-point addition are\n * not accounted for, so if precision is required, the standard {@link mean}\n * method should be used instead.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} mean\n * @example\n * mean([0, 10]); // => 5\n */\nfunction meanSimple(x) {\n    if (x.length === 0) {\n        throw new Error(\"meanSimple requires at least one data point\");\n    }\n\n    return sumSimple(x) / x.length;\n}\n\nexport default meanSimple;\n", "import quantileSorted from \"./quantile_sorted.js\";\n\n/**\n * The [median](http://en.wikipedia.org/wiki/Median) is\n * the middle number of a list. This is often a good indicator of 'the middle'\n * when there are outliers that skew the `mean()` value.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The median isn't necessarily one of the elements in the list: the value\n * can be the average of two elements if the list has an even length\n * and the two central values are different.\n *\n * @param {Array<number>} sorted input\n * @returns {number} median value\n * @example\n * medianSorted([10, 2, 5, 100, 2, 1]); // => 52.5\n */\nfunction medianSorted(sorted) {\n    return quantileSorted(sorted, 0.5);\n}\n\nexport default medianSorted;\n", "/**\n * When removing a value from a list, one does not have to necessary\n * recompute the mean of the list in linear time. They can instead use\n * this function to compute the new mean by providing the current mean,\n * the number of elements in the list that produced it and the value to remove.\n *\n * @since 3.0.0\n * @param {number} mean current mean\n * @param {number} n number of items in the list\n * @param {number} value the value to remove\n * @returns {number} the new mean\n *\n * @example\n * subtractFromMean(20.5, 6, 53); // => 14\n */\nfunction subtractFromMean(mean, n, value) {\n    return (mean * n - value) / (n - 1);\n}\n\nexport default subtractFromMean;\n", "/**\n * The Root Mean Square (RMS) is\n * a mean function used as a measure of the magnitude of a set\n * of numbers, regardless of their sign.\n * This is the square root of the mean of the squares of the\n * input numbers.\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x a sample of one or more data points\n * @returns {number} root mean square\n * @throws {Error} if x is empty\n * @example\n * rootMeanSquare([-1, 1, -1, 1]); // => 1\n */\nfunction rootMeanSquare(x) {\n    if (x.length === 0) {\n        throw new Error(\"rootMeanSquare requires at least one data point\");\n    }\n\n    let sumOfSquares = 0;\n    for (let i = 0; i < x.length; i++) {\n        sumOfSquares += Math.pow(x[i], 2);\n    }\n\n    return Math.sqrt(sumOfSquares / x.length);\n}\n\nexport default rootMeanSquare;\n", "import mean from \"./mean.js\";\nimport sampleStandardDeviation from \"./sample_standard_deviation.js\";\n\n/**\n * The`coefficient of variation`_ is the ratio of the standard deviation to the mean.\n * .._`coefficient of variation`: https://en.wikipedia.org/wiki/Coefficient_of_variation\n *\n *\n * @param {Array} x input\n * @returns {number} coefficient of variation\n * @example\n * coefficientOfVariation([1, 2, 3, 4]).toFixed(3); // => 0.516\n * coefficientOfVariation([1, 2, 3, 4, 5]).toFixed(3); // => 0.527\n * coefficientOfVariation([-1, 0, 1, 2, 3, 4]).toFixed(3); // => 1.247\n */\nfunction coefficientOfVariation(x) {\n    return sampleStandardDeviation(x) / mean(x);\n}\n\nexport default coefficientOfVariation;\n", "import mean from \"./mean.js\";\nimport standardDeviation from \"./standard_deviation.js\";\n\n/**\n * This is to compute [a one-sample t-test](https://en.wikipedia.org/wiki/Student%27s_t-test#One-sample_t-test), comparing the mean\n * of a sample to a known value, x.\n *\n * in this case, we're trying to determine whether the\n * population mean is equal to the value that we know, which is `x`\n * here. Usually the results here are used to look up a\n * [p-value](http://en.wikipedia.org/wiki/P-value), which, for\n * a certain level of significance, will let you determine that the\n * null hypothesis can or cannot be rejected.\n *\n * @param {Array<number>} x sample of one or more numbers\n * @param {number} expectedValue expected value of the population mean\n * @returns {number} value\n * @example\n * tTest([1, 2, 3, 4, 5, 6], 3.385).toFixed(2); // => '0.16'\n */\nfunction tTest(x, expectedValue) {\n    // The mean of the sample\n    const sampleMean = mean(x);\n\n    // The standard deviation of the sample\n    const sd = standardDeviation(x);\n\n    // Square root the length of the sample\n    const rootN = Math.sqrt(x.length);\n\n    // returning the t value\n    return (sampleMean - expectedValue) / (sd / rootN);\n}\n\nexport default tTest;\n", "import mean from \"./mean.js\";\nimport sampleVariance from \"./sample_variance.js\";\n\n/**\n * This is to compute [two sample t-test](http://en.wikipedia.org/wiki/Student's_t-test).\n * Tests whether \"mean(X)-mean(Y) = difference\", (\n * in the most common case, we often have `difference == 0` to test if two samples\n * are likely to be taken from populations with the same mean value) with\n * no prior knowledge on standard deviations of both samples\n * other than the fact that they have the same standard deviation.\n *\n * Usually the results here are used to look up a\n * [p-value](http://en.wikipedia.org/wiki/P-value), which, for\n * a certain level of significance, will let you determine that the\n * null hypothesis can or cannot be rejected.\n *\n * `diff` can be omitted if it equals 0.\n *\n * [This is used to reject](https://en.wikipedia.org/wiki/Exclusion_of_the_null_hypothesis)\n * a null hypothesis that the two populations that have been sampled into\n * `sampleX` and `sampleY` are equal to each other.\n *\n * @param {Array<number>} sampleX a sample as an array of numbers\n * @param {Array<number>} sampleY a sample as an array of numbers\n * @param {number} [difference=0]\n * @returns {number|null} test result\n *\n * @example\n * tTestTwoSample([1, 2, 3, 4], [3, 4, 5, 6], 0); // => -2.1908902300206643\n */\nfunction tTestTwoSample(sampleX, sampleY, difference) {\n    const n = sampleX.length;\n    const m = sampleY.length;\n\n    // If either sample doesn't actually have any values, we can't\n    // compute this at all, so we return `null`.\n    if (!n || !m) {\n        return null;\n    }\n\n    // default difference (mu) is zero\n    if (!difference) {\n        difference = 0;\n    }\n\n    const meanX = mean(sampleX);\n    const meanY = mean(sampleY);\n    const sampleVarianceX = sampleVariance(sampleX);\n    const sampleVarianceY = sampleVariance(sampleY);\n\n    if (\n        typeof meanX === \"number\" &&\n        typeof meanY === \"number\" &&\n        typeof sampleVarianceX === \"number\" &&\n        typeof sampleVarianceY === \"number\"\n    ) {\n        const weightedVariance =\n            ((n - 1) * sampleVarianceX + (m - 1) * sampleVarianceY) /\n            (n + m - 2);\n\n        return (\n            (meanX - meanY - difference) /\n            Math.sqrt(weightedVariance * (1 / n + 1 / m))\n        );\n    }\n}\n\nexport default tTestTwoSample;\n", "/**\n * This function calculates the Wilcoxon rank sum statistic for the first sample\n * with respect to the second. The Wilcoxon rank sum test is a non-parametric\n * alternative to the t-test which is equivalent to the\n * [Mann-Whitney U test](https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test).\n * The statistic is calculated by pooling all the observations together, ranking them,\n * and then summing the ranks associated with one of the samples. If this rank sum is\n * sufficiently large or small we reject the hypothesis that the two samples come\n * from the same distribution in favor of the alternative that one is shifted with\n * respect to the other.\n *\n * @param {Array<number>} sampleX a sample as an array of numbers\n * @param {Array<number>} sampleY a sample as an array of numbers\n * @returns {number} rank sum for sampleX\n *\n * @example\n * wilcoxonRankSum([1, 4, 8], [9, 12, 15]); // => 6\n */\nfunction wilcoxonRankSum(sampleX, sampleY) {\n    if (!sampleX.length || !sampleY.length) {\n        throw new Error(\"Neither sample can be empty\");\n    }\n\n    const pooledSamples = sampleX\n        .map((x) => ({ label: \"x\", value: x }))\n        .concat(sampleY.map((y) => ({ label: \"y\", value: y })))\n        .sort((a, b) => a.value - b.value);\n\n    for (let rank = 0; rank < pooledSamples.length; rank++) {\n        pooledSamples[rank].rank = rank;\n    }\n\n    let tiedRanks = [pooledSamples[0].rank];\n    for (let i = 1; i < pooledSamples.length; i++) {\n        if (pooledSamples[i].value === pooledSamples[i - 1].value) {\n            tiedRanks.push(pooledSamples[i].rank);\n            if (i === pooledSamples.length - 1) {\n                replaceRanksInPlace(pooledSamples, tiedRanks);\n            }\n        } else if (tiedRanks.length > 1) {\n            replaceRanksInPlace(pooledSamples, tiedRanks);\n        } else {\n            tiedRanks = [pooledSamples[i].rank];\n        }\n    }\n\n    function replaceRanksInPlace(pooledSamples, tiedRanks) {\n        const average = (tiedRanks[0] + tiedRanks[tiedRanks.length - 1]) / 2;\n        for (let i = 0; i < tiedRanks.length; i++) {\n            pooledSamples[tiedRanks[i]].rank = average;\n        }\n    }\n\n    let rankSum = 0;\n\n    for (let i = 0; i < pooledSamples.length; i++) {\n        const sample = pooledSamples[i];\n        if (sample.label === \"x\") {\n            rankSum += sample.rank + 1;\n        }\n    }\n\n    return rankSum;\n}\n\nexport default wilcoxonRankSum;\n", "/**\n * [Bayesian Classifier](http://en.wikipedia.org/wiki/Naive_Bayes_classifier)\n *\n * This is a naïve bayesian classifier that takes\n * singly-nested objects.\n *\n * @class\n * @example\n * var bayes = new BayesianClassifier();\n * bayes.train({\n *   species: 'Cat'\n * }, 'animal');\n * var result = bayes.score({\n *   species: 'Cat'\n * })\n * // result\n * // {\n * //   animal: 1\n * // }\n */\nclass BayesianClassifier {\n    /*:: totalCount: number */\n    /*:: data: Object */\n    constructor() {\n        // The number of items that are currently\n        // classified in the model\n        this.totalCount = 0;\n        // Every item classified in the model\n        this.data = {};\n    }\n\n    /**\n     * Train the classifier with a new item, which has a single\n     * dimension of Javascript literal keys and values.\n     *\n     * @param {Object} item an object with singly-deep properties\n     * @param {string} category the category this item belongs to\n     * @return {undefined} adds the item to the classifier\n     */\n    train(item, category) {\n        // If the data object doesn't have any values\n        // for this category, create a new object for it.\n        if (!this.data[category]) {\n            this.data[category] = {};\n        }\n\n        // Iterate through each key in the item.\n        for (const k in item) {\n            const v = item[k];\n            // Initialize the nested object `data[category][k][item[k]]`\n            // with an object of keys that equal 0.\n            if (this.data[category][k] === undefined) {\n                this.data[category][k] = {};\n            }\n            if (this.data[category][k][v] === undefined) {\n                this.data[category][k][v] = 0;\n            }\n\n            // And increment the key for this key/value combination.\n            this.data[category][k][v]++;\n        }\n\n        // Increment the number of items classified\n        this.totalCount++;\n    }\n\n    /**\n     * Generate a score of how well this item matches all\n     * possible categories based on its attributes\n     *\n     * @param {Object} item an item in the same format as with train\n     * @returns {Object} of probabilities that this item belongs to a\n     * given category.\n     */\n    score(item) {\n        // Initialize an empty array of odds per category.\n        const odds = {};\n        let category;\n        // Iterate through each key in the item,\n        // then iterate through each category that has been used\n        // in previous calls to `.train()`\n        for (const k in item) {\n            const v = item[k];\n            for (category in this.data) {\n                // Create an empty object for storing key - value combinations\n                // for this category.\n                odds[category] = {};\n\n                // If this item doesn't even have a property, it counts for nothing,\n                // but if it does have the property that we're looking for from\n                // the item to categorize, it counts based on how popular it is\n                // versus the whole population.\n                if (this.data[category][k]) {\n                    odds[category][k + \"_\" + v] =\n                        (this.data[category][k][v] || 0) / this.totalCount;\n                } else {\n                    odds[category][k + \"_\" + v] = 0;\n                }\n            }\n        }\n\n        // Set up a new object that will contain sums of these odds by category\n        const oddsSums = {};\n\n        for (category in odds) {\n            // Tally all of the odds for each category-combination pair -\n            // the non-existence of a category does not add anything to the\n            // score.\n            oddsSums[category] = 0;\n            for (const combination in odds[category]) {\n                oddsSums[category] += odds[category][combination];\n            }\n        }\n\n        return oddsSums;\n    }\n}\n\nexport default BayesianClassifier;\n", "/**\n * This is a single-layer [Perceptron Classifier](http://en.wikipedia.org/wiki/Perceptron) that takes\n * arrays of numbers and predicts whether they should be classified\n * as either 0 or 1 (negative or positive examples).\n * @class\n * @example\n * // Create the model\n * var p = new PerceptronModel();\n * // Train the model with input with a diagonal boundary.\n * for (var i = 0; i < 5; i++) {\n *     p.train([1, 1], 1);\n *     p.train([0, 1], 0);\n *     p.train([1, 0], 0);\n *     p.train([0, 0], 0);\n * }\n * p.predict([0, 0]); // 0\n * p.predict([0, 1]); // 0\n * p.predict([1, 0]); // 0\n * p.predict([1, 1]); // 1\n */\nclass PerceptronModel {\n    /*:: bias: number */\n    /*:: weights: Array<number> */\n    constructor() {\n        // The weights, or coefficients of the model;\n        // weights are only populated when training with data.\n        this.weights = [];\n        // The bias term, or intercept; it is also a weight but\n        // it's stored separately for convenience as it is always\n        // multiplied by one.\n        this.bias = 0;\n    }\n    /**\n     * **Predict**: Use an array of features with the weight array and bias\n     * to predict whether an example is labeled 0 or 1.\n     *\n     * @param {Array<number>} features an array of features as numbers\n     * @returns {number} 1 if the score is over 0, otherwise 0\n     */\n    predict(features) {\n        // Only predict if previously trained\n        // on the same size feature array(s).\n        if (features.length !== this.weights.length) {\n            return null;\n        }\n\n        // Calculate the sum of features times weights,\n        // with the bias added (implicitly times one).\n        let score = 0;\n        for (let i = 0; i < this.weights.length; i++) {\n            score += this.weights[i] * features[i];\n        }\n        score += this.bias;\n\n        // Classify as 1 if the score is over 0, otherwise 0.\n        if (score > 0) {\n            return 1;\n        } else {\n            return 0;\n        }\n    }\n\n    /**\n     * **Train** the classifier with a new example, which is\n     * a numeric array of features and a 0 or 1 label.\n     *\n     * @param {Array<number>} features an array of features as numbers\n     * @param {number} label either 0 or 1\n     * @returns {PerceptronModel} this\n     */\n    train(features, label) {\n        // Require that only labels of 0 or 1 are considered.\n        if (label !== 0 && label !== 1) {\n            return null;\n        }\n        // The length of the feature array determines\n        // the length of the weight array.\n        // The perceptron will continue learning as long as\n        // it keeps seeing feature arrays of the same length.\n        // When it sees a new data shape, it initializes.\n        if (features.length !== this.weights.length) {\n            this.weights = features;\n            this.bias = 1;\n        }\n        // Make a prediction based on current weights.\n        const prediction = this.predict(features);\n        // Update the weights if the prediction is wrong.\n        if (typeof prediction === \"number\" && prediction !== label) {\n            const gradient = label - prediction;\n            for (let i = 0; i < this.weights.length; i++) {\n                this.weights[i] += gradient * features[i];\n            }\n            this.bias += gradient;\n        }\n        return this;\n    }\n}\n\nexport default PerceptronModel;\n", "/**\n * We use `ε`, epsilon, as a stopping criterion when we want to iterate\n * until we're \"close enough\". Epsilon is a very small number: for\n * simple statistics, that number is **0.0001**\n *\n * This is used in calculations like the binomialDistribution, in which\n * the process of finding a value is [iterative](https://en.wikipedia.org/wiki/Iterative_method):\n * it progresses until it is close enough.\n *\n * Below is an example of using epsilon in [gradient descent](https://en.wikipedia.org/wiki/Gradient_descent),\n * where we're trying to find a local minimum of a function's derivative,\n * given by the `fDerivative` method.\n *\n * @example\n * // From calculation, we expect that the local minimum occurs at x=9/4\n * var x_old = 0;\n * // The algorithm starts at x=6\n * var x_new = 6;\n * var stepSize = 0.01;\n *\n * function fDerivative(x) {\n *   return 4 * Math.pow(x, 3) - 9 * Math.pow(x, 2);\n * }\n *\n * // The loop runs until the difference between the previous\n * // value and the current value is smaller than epsilon - a rough\n * // meaure of 'close enough'\n * while (Math.abs(x_new - x_old) > ss.epsilon) {\n *   x_old = x_new;\n *   x_new = x_old - stepSize * fDerivative(x_old);\n * }\n *\n * console.log('Local minimum occurs at', x_new);\n */\nconst epsilon = 0.0001;\n\nexport default epsilon;\n", "/**\n * A [Factorial](https://en.wikipedia.org/wiki/Factorial), usually written n!, is the product of all positive\n * integers less than or equal to n. Often factorial is implemented\n * recursively, but this iterative approach is significantly faster\n * and simpler.\n *\n * @param {number} n input, must be an integer number 1 or greater\n * @returns {number} factorial: n!\n * @throws {Error} if n is less than 0 or not an integer\n * @example\n * factorial(5); // => 120\n */\nfunction factorial(n) {\n    // factorial is mathematically undefined for negative numbers\n    if (n < 0) {\n        throw new Error(\"factorial requires a non-negative value\");\n    }\n\n    if (Math.floor(n) !== n) {\n        throw new Error(\"factorial requires an integer input\");\n    }\n\n    // typically you'll expand the factorial function going down, like\n    // 5! = 5 * 4 * 3 * 2 * 1. This is going in the opposite direction,\n    // counting from 2 up to the number in question, and since anything\n    // multiplied by 1 is itself, the loop only needs to start at 2.\n    let accumulator = 1;\n    for (let i = 2; i <= n; i++) {\n        // for each number up to and including the number `n`, multiply\n        // the accumulator my that number.\n        accumulator *= i;\n    }\n    return accumulator;\n}\n\nexport default factorial;\n", "import factorial from \"./factorial.js\";\n\n/**\n * Compute the [gamma function](https://en.wikipedia.org/wiki/Gamma_function) of a value using Nemes' approximation.\n * The gamma of n is equivalent to (n-1)!, but unlike the factorial function, gamma is defined for all real n except zero\n * and negative integers (where NaN is returned). Note, the gamma function is also well-defined for complex numbers,\n * though this implementation currently does not handle complex numbers as input values.\n * Nemes' approximation is defined [here](https://arxiv.org/abs/1003.6020) as Theorem 2.2.\n * Negative values use [Euler's reflection formula](https://en.wikipedia.org/wiki/Gamma_function#Properties) for computation.\n *\n * @param {number} n Any real number except for zero and negative integers.\n * @returns {number} The gamma of the input value.\n *\n * @example\n * gamma(11.5); // 11899423.084037038\n * gamma(-11.5); // 2.29575810481609e-8\n * gamma(5); // 24\n */\nfunction gamma(n) {\n    if (Number.isInteger(n)) {\n        if (n <= 0) {\n            // gamma not defined for zero or negative integers\n            return Number.NaN;\n        } else {\n            // use factorial for integer inputs\n            return factorial(n - 1);\n        }\n    }\n\n    // Decrement n, because approximation is defined for n - 1\n    n--;\n\n    if (n < 0) {\n        // Use Euler's reflection formula for negative inputs\n        // see:  https://en.wikipedia.org/wiki/Gamma_function#Properties\n        return Math.PI / (Math.sin(Math.PI * -n) * gamma(-n));\n    } else {\n        // Nemes' expansion approximation\n        const seriesCoefficient =\n            Math.pow(n / Math.E, n) * Math.sqrt(2 * Math.PI * (n + 1 / 6));\n\n        const seriesDenom = n + 1 / 4;\n\n        const seriesExpansion =\n            1 +\n            1 / 144 / Math.pow(seriesDenom, 2) -\n            1 / 12960 / Math.pow(seriesDenom, 3) -\n            257 / 207360 / Math.pow(seriesDenom, 4) -\n            52 / 2612736 / Math.pow(seriesDenom, 5) +\n            5741173 / 9405849600 / Math.pow(seriesDenom, 6) +\n            37529 / 18811699200 / Math.pow(seriesDenom, 7);\n\n        return seriesCoefficient * seriesExpansion;\n    }\n}\n\nexport default gamma;\n", "// Define series coefficients\nconst COEFFICIENTS = [\n    0.99999999999999709182, 57.156235665862923517, -59.597960355475491248,\n    14.136097974741747174, -0.49191381609762019978, 0.33994649984811888699e-4,\n    0.46523628927048575665e-4, -0.98374475304879564677e-4,\n    0.15808870322491248884e-3, -0.21026444172410488319e-3,\n    0.2174396181152126432e-3, -0.16431810653676389022e-3,\n    0.84418223983852743293e-4, -0.2619083840158140867e-4,\n    0.36899182659531622704e-5\n];\n\nconst g = 607 / 128;\nconst LOGSQRT2PI = Math.log(Math.sqrt(2 * Math.PI));\n\n/**\n * Compute the logarithm of the [gamma function](https://en.wikipedia.org/wiki/Gamma_function) of a value using Lanczos' approximation.\n * This function takes as input any real-value n greater than 0.\n * This function is useful for values of n too large for the normal gamma function (n > 165).\n * The code is based on Lanczo's Gamma approximation, defined [here](http://my.fit.edu/~gabdo/gamma.txt).\n *\n * @param {number} n Any real number greater than zero.\n * @returns {number} The logarithm of gamma of the input value.\n *\n * @example\n * gammaln(500); // 2605.1158503617335\n * gammaln(2.4); // 0.21685932244884043\n */\nfunction gammaln(n) {\n    // Return infinity if value not in domain\n    if (n <= 0) {\n        return Number.POSITIVE_INFINITY;\n    }\n\n    // Decrement n, because approximation is defined for n - 1\n    n--;\n\n    // Create series approximation\n    let a = COEFFICIENTS[0];\n\n    for (let i = 1; i < 15; i++) {\n        a += COEFFICIENTS[i] / (n + i);\n    }\n\n    const tmp = g + 0.5 + n;\n\n    // Return natural logarithm of gamma(n)\n    return LOGSQRT2PI + Math.log(a) - tmp + (n + 0.5) * Math.log(tmp);\n}\n\nexport default gammaln;\n", "/**\n * The [Bernoulli distribution](http://en.wikipedia.org/wiki/Bernoulli_distribution)\n * is the probability discrete\n * distribution of a random variable which takes value 1 with success\n * probability `p` and value 0 with failure\n * probability `q` = 1 - `p`. It can be used, for example, to represent the\n * toss of a coin, where \"1\" is defined to mean \"heads\" and \"0\" is defined\n * to mean \"tails\" (or vice versa). It is\n * a special case of a Binomial Distribution\n * where `n` = 1.\n *\n * @param {number} p input value, between 0 and 1 inclusive\n * @returns {number[]} values of bernoulli distribution at this point\n * @throws {Error} if p is outside 0 and 1\n * @example\n * bernoulliDistribution(0.3); // => [0.7, 0.3]\n */\nfunction bernoulliDistribution(p) /*: number[] */ {\n    // Check that `p` is a valid probability (0 ≤ p ≤ 1)\n    if (p < 0 || p > 1) {\n        throw new Error(\n            \"bernoulliDistribution requires probability to be between 0 and 1 inclusive\"\n        );\n    }\n\n    return [1 - p, p];\n}\n\nexport default bernoulliDistribution;\n", "import epsilon from \"./epsilon.js\";\n\n/**\n * The [Binomial Distribution](http://en.wikipedia.org/wiki/Binomial_distribution) is the discrete probability\n * distribution of the number of successes in a sequence of n independent yes/no experiments, each of which yields\n * success with probability `probability`. Such a success/failure experiment is also called a Bernoulli experiment or\n * Bernoulli trial; when trials = 1, the Binomial Distribution is a Bernoulli Distribution.\n *\n * @param {number} trials number of trials to simulate\n * @param {number} probability\n * @returns {number[]} output\n */\nfunction binomialDistribution(trials, probability) /*: ?number[] */ {\n    // Check that `p` is a valid probability (0 ≤ p ≤ 1),\n    // that `n` is an integer, strictly positive.\n    if (probability < 0 || probability > 1 || trials <= 0 || trials % 1 !== 0) {\n        return undefined;\n    }\n\n    // We initialize `x`, the random variable, and `accumulator`, an accumulator\n    // for the cumulative distribution function to 0. `distribution_functions`\n    // is the object we'll return with the `probability_of_x` and the\n    // `cumulativeProbability_of_x`, as well as the calculated mean &\n    // variance. We iterate until the `cumulativeProbability_of_x` is\n    // within `epsilon` of 1.0.\n    let x = 0;\n    let cumulativeProbability = 0;\n    const cells = [];\n    let binomialCoefficient = 1;\n\n    // This algorithm iterates through each potential outcome,\n    // until the `cumulativeProbability` is very close to 1, at\n    // which point we've defined the vast majority of outcomes\n    do {\n        // a [probability mass function](https://en.wikipedia.org/wiki/Probability_mass_function)\n        cells[x] =\n            binomialCoefficient *\n            Math.pow(probability, x) *\n            Math.pow(1 - probability, trials - x);\n        cumulativeProbability += cells[x];\n        x++;\n        binomialCoefficient = (binomialCoefficient * (trials - x + 1)) / x;\n        // when the cumulativeProbability is nearly 1, we've calculated\n        // the useful range of this distribution\n    } while (cumulativeProbability < 1 - epsilon);\n\n    return cells;\n}\n\nexport default binomialDistribution;\n", "import epsilon from \"./epsilon.js\";\n\n/**\n * The [Poisson Distribution](http://en.wikipedia.org/wiki/Poisson_distribution)\n * is a discrete probability distribution that expresses the probability\n * of a given number of events occurring in a fixed interval of time\n * and/or space if these events occur with a known average rate and\n * independently of the time since the last event.\n *\n * The Poisson Distribution is characterized by the strictly positive\n * mean arrival or occurrence rate, `λ`.\n *\n * @param {number} lambda location poisson distribution\n * @returns {number[]} values of poisson distribution at that point\n */\nfunction poissonDistribution(lambda) /*: ?number[] */ {\n    // Check that lambda is strictly positive\n    if (lambda <= 0) {\n        return undefined;\n    }\n\n    // our current place in the distribution\n    let x = 0;\n    // and we keep track of the current cumulative probability, in\n    // order to know when to stop calculating chances.\n    let cumulativeProbability = 0;\n    // the calculated cells to be returned\n    const cells = [];\n    let factorialX = 1;\n\n    // This algorithm iterates through each potential outcome,\n    // until the `cumulativeProbability` is very close to 1, at\n    // which point we've defined the vast majority of outcomes\n    do {\n        // a [probability mass function](https://en.wikipedia.org/wiki/Probability_mass_function)\n        cells[x] = (Math.exp(-lambda) * Math.pow(lambda, x)) / factorialX;\n        cumulativeProbability += cells[x];\n        x++;\n        factorialX *= x;\n        // when the cumulativeProbability is nearly 1, we've calculated\n        // the useful range of this distribution\n    } while (cumulativeProbability < 1 - epsilon);\n\n    return cells;\n}\n\nexport default poissonDistribution;\n", "/**\n * **Percentage Points of the χ2 (Chi-Squared) Distribution**\n *\n * The [χ2 (Chi-Squared) Distribution](http://en.wikipedia.org/wiki/Chi-squared_distribution) is used in the common\n * chi-squared tests for goodness of fit of an observed distribution to a theoretical one, the independence of two\n * criteria of classification of qualitative data, and in confidence interval estimation for a population standard\n * deviation of a normal distribution from a sample standard deviation.\n *\n * Values from Appendix 1, Table III of William W. Hines & Douglas C. Montgomery, \"Probability and Statistics in\n * Engineering and Management Science\", Wiley (1980).\n */\nconst chiSquaredDistributionTable = {\n    1: {\n        0.995: 0,\n        0.99: 0,\n        0.975: 0,\n        0.95: 0,\n        0.9: 0.02,\n        0.5: 0.45,\n        0.1: 2.71,\n        0.05: 3.84,\n        0.025: 5.02,\n        0.01: 6.63,\n        0.005: 7.88\n    },\n    2: {\n        0.995: 0.01,\n        0.99: 0.02,\n        0.975: 0.05,\n        0.95: 0.1,\n        0.9: 0.21,\n        0.5: 1.39,\n        0.1: 4.61,\n        0.05: 5.99,\n        0.025: 7.38,\n        0.01: 9.21,\n        0.005: 10.6\n    },\n    3: {\n        0.995: 0.07,\n        0.99: 0.11,\n        0.975: 0.22,\n        0.95: 0.35,\n        0.9: 0.58,\n        0.5: 2.37,\n        0.1: 6.25,\n        0.05: 7.81,\n        0.025: 9.35,\n        0.01: 11.34,\n        0.005: 12.84\n    },\n    4: {\n        0.995: 0.21,\n        0.99: 0.3,\n        0.975: 0.48,\n        0.95: 0.71,\n        0.9: 1.06,\n        0.5: 3.36,\n        0.1: 7.78,\n        0.05: 9.49,\n        0.025: 11.14,\n        0.01: 13.28,\n        0.005: 14.86\n    },\n    5: {\n        0.995: 0.41,\n        0.99: 0.55,\n        0.975: 0.83,\n        0.95: 1.15,\n        0.9: 1.61,\n        0.5: 4.35,\n        0.1: 9.24,\n        0.05: 11.07,\n        0.025: 12.83,\n        0.01: 15.09,\n        0.005: 16.75\n    },\n    6: {\n        0.995: 0.68,\n        0.99: 0.87,\n        0.975: 1.24,\n        0.95: 1.64,\n        0.9: 2.2,\n        0.5: 5.35,\n        0.1: 10.65,\n        0.05: 12.59,\n        0.025: 14.45,\n        0.01: 16.81,\n        0.005: 18.55\n    },\n    7: {\n        0.995: 0.99,\n        0.99: 1.25,\n        0.975: 1.69,\n        0.95: 2.17,\n        0.9: 2.83,\n        0.5: 6.35,\n        0.1: 12.02,\n        0.05: 14.07,\n        0.025: 16.01,\n        0.01: 18.48,\n        0.005: 20.28\n    },\n    8: {\n        0.995: 1.34,\n        0.99: 1.65,\n        0.975: 2.18,\n        0.95: 2.73,\n        0.9: 3.49,\n        0.5: 7.34,\n        0.1: 13.36,\n        0.05: 15.51,\n        0.025: 17.53,\n        0.01: 20.09,\n        0.005: 21.96\n    },\n    9: {\n        0.995: 1.73,\n        0.99: 2.09,\n        0.975: 2.7,\n        0.95: 3.33,\n        0.9: 4.17,\n        0.5: 8.34,\n        0.1: 14.68,\n        0.05: 16.92,\n        0.025: 19.02,\n        0.01: 21.67,\n        0.005: 23.59\n    },\n    10: {\n        0.995: 2.16,\n        0.99: 2.56,\n        0.975: 3.25,\n        0.95: 3.94,\n        0.9: 4.87,\n        0.5: 9.34,\n        0.1: 15.99,\n        0.05: 18.31,\n        0.025: 20.48,\n        0.01: 23.21,\n        0.005: 25.19\n    },\n    11: {\n        0.995: 2.6,\n        0.99: 3.05,\n        0.975: 3.82,\n        0.95: 4.57,\n        0.9: 5.58,\n        0.5: 10.34,\n        0.1: 17.28,\n        0.05: 19.68,\n        0.025: 21.92,\n        0.01: 24.72,\n        0.005: 26.76\n    },\n    12: {\n        0.995: 3.07,\n        0.99: 3.57,\n        0.975: 4.4,\n        0.95: 5.23,\n        0.9: 6.3,\n        0.5: 11.34,\n        0.1: 18.55,\n        0.05: 21.03,\n        0.025: 23.34,\n        0.01: 26.22,\n        0.005: 28.3\n    },\n    13: {\n        0.995: 3.57,\n        0.99: 4.11,\n        0.975: 5.01,\n        0.95: 5.89,\n        0.9: 7.04,\n        0.5: 12.34,\n        0.1: 19.81,\n        0.05: 22.36,\n        0.025: 24.74,\n        0.01: 27.69,\n        0.005: 29.82\n    },\n    14: {\n        0.995: 4.07,\n        0.99: 4.66,\n        0.975: 5.63,\n        0.95: 6.57,\n        0.9: 7.79,\n        0.5: 13.34,\n        0.1: 21.06,\n        0.05: 23.68,\n        0.025: 26.12,\n        0.01: 29.14,\n        0.005: 31.32\n    },\n    15: {\n        0.995: 4.6,\n        0.99: 5.23,\n        0.975: 6.27,\n        0.95: 7.26,\n        0.9: 8.55,\n        0.5: 14.34,\n        0.1: 22.31,\n        0.05: 25,\n        0.025: 27.49,\n        0.01: 30.58,\n        0.005: 32.8\n    },\n    16: {\n        0.995: 5.14,\n        0.99: 5.81,\n        0.975: 6.91,\n        0.95: 7.96,\n        0.9: 9.31,\n        0.5: 15.34,\n        0.1: 23.54,\n        0.05: 26.3,\n        0.025: 28.85,\n        0.01: 32,\n        0.005: 34.27\n    },\n    17: {\n        0.995: 5.7,\n        0.99: 6.41,\n        0.975: 7.56,\n        0.95: 8.67,\n        0.9: 10.09,\n        0.5: 16.34,\n        0.1: 24.77,\n        0.05: 27.59,\n        0.025: 30.19,\n        0.01: 33.41,\n        0.005: 35.72\n    },\n    18: {\n        0.995: 6.26,\n        0.99: 7.01,\n        0.975: 8.23,\n        0.95: 9.39,\n        0.9: 10.87,\n        0.5: 17.34,\n        0.1: 25.99,\n        0.05: 28.87,\n        0.025: 31.53,\n        0.01: 34.81,\n        0.005: 37.16\n    },\n    19: {\n        0.995: 6.84,\n        0.99: 7.63,\n        0.975: 8.91,\n        0.95: 10.12,\n        0.9: 11.65,\n        0.5: 18.34,\n        0.1: 27.2,\n        0.05: 30.14,\n        0.025: 32.85,\n        0.01: 36.19,\n        0.005: 38.58\n    },\n    20: {\n        0.995: 7.43,\n        0.99: 8.26,\n        0.975: 9.59,\n        0.95: 10.85,\n        0.9: 12.44,\n        0.5: 19.34,\n        0.1: 28.41,\n        0.05: 31.41,\n        0.025: 34.17,\n        0.01: 37.57,\n        0.005: 40\n    },\n    21: {\n        0.995: 8.03,\n        0.99: 8.9,\n        0.975: 10.28,\n        0.95: 11.59,\n        0.9: 13.24,\n        0.5: 20.34,\n        0.1: 29.62,\n        0.05: 32.67,\n        0.025: 35.48,\n        0.01: 38.93,\n        0.005: 41.4\n    },\n    22: {\n        0.995: 8.64,\n        0.99: 9.54,\n        0.975: 10.98,\n        0.95: 12.34,\n        0.9: 14.04,\n        0.5: 21.34,\n        0.1: 30.81,\n        0.05: 33.92,\n        0.025: 36.78,\n        0.01: 40.29,\n        0.005: 42.8\n    },\n    23: {\n        0.995: 9.26,\n        0.99: 10.2,\n        0.975: 11.69,\n        0.95: 13.09,\n        0.9: 14.85,\n        0.5: 22.34,\n        0.1: 32.01,\n        0.05: 35.17,\n        0.025: 38.08,\n        0.01: 41.64,\n        0.005: 44.18\n    },\n    24: {\n        0.995: 9.89,\n        0.99: 10.86,\n        0.975: 12.4,\n        0.95: 13.85,\n        0.9: 15.66,\n        0.5: 23.34,\n        0.1: 33.2,\n        0.05: 36.42,\n        0.025: 39.36,\n        0.01: 42.98,\n        0.005: 45.56\n    },\n    25: {\n        0.995: 10.52,\n        0.99: 11.52,\n        0.975: 13.12,\n        0.95: 14.61,\n        0.9: 16.47,\n        0.5: 24.34,\n        0.1: 34.28,\n        0.05: 37.65,\n        0.025: 40.65,\n        0.01: 44.31,\n        0.005: 46.93\n    },\n    26: {\n        0.995: 11.16,\n        0.99: 12.2,\n        0.975: 13.84,\n        0.95: 15.38,\n        0.9: 17.29,\n        0.5: 25.34,\n        0.1: 35.56,\n        0.05: 38.89,\n        0.025: 41.92,\n        0.01: 45.64,\n        0.005: 48.29\n    },\n    27: {\n        0.995: 11.81,\n        0.99: 12.88,\n        0.975: 14.57,\n        0.95: 16.15,\n        0.9: 18.11,\n        0.5: 26.34,\n        0.1: 36.74,\n        0.05: 40.11,\n        0.025: 43.19,\n        0.01: 46.96,\n        0.005: 49.65\n    },\n    28: {\n        0.995: 12.46,\n        0.99: 13.57,\n        0.975: 15.31,\n        0.95: 16.93,\n        0.9: 18.94,\n        0.5: 27.34,\n        0.1: 37.92,\n        0.05: 41.34,\n        0.025: 44.46,\n        0.01: 48.28,\n        0.005: 50.99\n    },\n    29: {\n        0.995: 13.12,\n        0.99: 14.26,\n        0.975: 16.05,\n        0.95: 17.71,\n        0.9: 19.77,\n        0.5: 28.34,\n        0.1: 39.09,\n        0.05: 42.56,\n        0.025: 45.72,\n        0.01: 49.59,\n        0.005: 52.34\n    },\n    30: {\n        0.995: 13.79,\n        0.99: 14.95,\n        0.975: 16.79,\n        0.95: 18.49,\n        0.9: 20.6,\n        0.5: 29.34,\n        0.1: 40.26,\n        0.05: 43.77,\n        0.025: 46.98,\n        0.01: 50.89,\n        0.005: 53.67\n    },\n    40: {\n        0.995: 20.71,\n        0.99: 22.16,\n        0.975: 24.43,\n        0.95: 26.51,\n        0.9: 29.05,\n        0.5: 39.34,\n        0.1: 51.81,\n        0.05: 55.76,\n        0.025: 59.34,\n        0.01: 63.69,\n        0.005: 66.77\n    },\n    50: {\n        0.995: 27.99,\n        0.99: 29.71,\n        0.975: 32.36,\n        0.95: 34.76,\n        0.9: 37.69,\n        0.5: 49.33,\n        0.1: 63.17,\n        0.05: 67.5,\n        0.025: 71.42,\n        0.01: 76.15,\n        0.005: 79.49\n    },\n    60: {\n        0.995: 35.53,\n        0.99: 37.48,\n        0.975: 40.48,\n        0.95: 43.19,\n        0.9: 46.46,\n        0.5: 59.33,\n        0.1: 74.4,\n        0.05: 79.08,\n        0.025: 83.3,\n        0.01: 88.38,\n        0.005: 91.95\n    },\n    70: {\n        0.995: 43.28,\n        0.99: 45.44,\n        0.975: 48.76,\n        0.95: 51.74,\n        0.9: 55.33,\n        0.5: 69.33,\n        0.1: 85.53,\n        0.05: 90.53,\n        0.025: 95.02,\n        0.01: 100.42,\n        0.005: 104.22\n    },\n    80: {\n        0.995: 51.17,\n        0.99: 53.54,\n        0.975: 57.15,\n        0.95: 60.39,\n        0.9: 64.28,\n        0.5: 79.33,\n        0.1: 96.58,\n        0.05: 101.88,\n        0.025: 106.63,\n        0.01: 112.33,\n        0.005: 116.32\n    },\n    90: {\n        0.995: 59.2,\n        0.99: 61.75,\n        0.975: 65.65,\n        0.95: 69.13,\n        0.9: 73.29,\n        0.5: 89.33,\n        0.1: 107.57,\n        0.05: 113.14,\n        0.025: 118.14,\n        0.01: 124.12,\n        0.005: 128.3\n    },\n    100: {\n        0.995: 67.33,\n        0.99: 70.06,\n        0.975: 74.22,\n        0.95: 77.93,\n        0.9: 82.36,\n        0.5: 99.33,\n        0.1: 118.5,\n        0.05: 124.34,\n        0.025: 129.56,\n        0.01: 135.81,\n        0.005: 140.17\n    }\n};\n\nexport default chiSquaredDistributionTable;\n", "import chiSquaredDistributionTable from \"./chi_squared_distribution_table.js\";\nimport mean from \"./mean.js\";\n\n/**\n * The [χ2 (Chi-Squared) Goodness-of-Fit Test](http://en.wikipedia.org/wiki/Goodness_of_fit#Pearson.27s_chi-squared_test)\n * uses a measure of goodness of fit which is the sum of differences between observed and expected outcome frequencies\n * (that is, counts of observations), each squared and divided by the number of observations expected given the\n * hypothesized distribution. The resulting χ2 statistic, `chiSquared`, can be compared to the chi-squared distribution\n * to determine the goodness of fit. In order to determine the degrees of freedom of the chi-squared distribution, one\n * takes the total number of observed frequencies and subtracts the number of estimated parameters. The test statistic\n * follows, approximately, a chi-square distribution with (k − c) degrees of freedom where `k` is the number of non-empty\n * cells and `c` is the number of estimated parameters for the distribution.\n *\n * @param {Array<number>} data\n * @param {Function} distributionType a function that returns a point in a distribution:\n * for instance, binomial, bernoulli, or poisson\n * @param {number} significance\n * @returns {number} chi squared goodness of fit\n * @example\n * // Data from Poisson goodness-of-fit example 10-19 in William W. Hines & Douglas C. Montgomery,\n * // \"Probability and Statistics in Engineering and Management Science\", Wiley (1980).\n * var data1019 = [\n *     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n *     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n *     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n *     2, 2, 2, 2, 2, 2, 2, 2, 2,\n *     3, 3, 3, 3\n * ];\n * ss.chiSquaredGoodnessOfFit(data1019, ss.poissonDistribution, 0.05); //= false\n */\nfunction chiSquaredGoodnessOfFit(data, distributionType, significance) {\n    // Estimate from the sample data, a weighted mean.\n    const inputMean = mean(data);\n    // Calculated value of the χ2 statistic.\n    let chiSquared = 0;\n    // Number of hypothesized distribution parameters estimated, expected to be supplied in the distribution test.\n    // Lose one degree of freedom for estimating `lambda` from the sample data.\n    const c = 1;\n    // The hypothesized distribution.\n    // Generate the hypothesized distribution.\n    const hypothesizedDistribution = distributionType(inputMean);\n    const observedFrequencies = [];\n    const expectedFrequencies = [];\n\n    // Create an array holding a histogram from the sample data, of\n    // the form `{ value: numberOfOcurrences }`\n    for (let i = 0; i < data.length; i++) {\n        if (observedFrequencies[data[i]] === undefined) {\n            observedFrequencies[data[i]] = 0;\n        }\n        observedFrequencies[data[i]]++;\n    }\n\n    // The histogram we created might be sparse - there might be gaps\n    // between values. So we iterate through the histogram, making\n    // sure that instead of undefined, gaps have 0 values.\n    for (let i = 0; i < observedFrequencies.length; i++) {\n        if (observedFrequencies[i] === undefined) {\n            observedFrequencies[i] = 0;\n        }\n    }\n\n    // Create an array holding a histogram of expected data given the\n    // sample size and hypothesized distribution.\n    for (const k in hypothesizedDistribution) {\n        if (k in observedFrequencies) {\n            expectedFrequencies[+k] = hypothesizedDistribution[k] * data.length;\n        }\n    }\n\n    // Working backward through the expected frequencies, collapse classes\n    // if less than three observations are expected for a class.\n    // This transformation is applied to the observed frequencies as well.\n    for (let k = expectedFrequencies.length - 1; k >= 0; k--) {\n        if (expectedFrequencies[k] < 3) {\n            expectedFrequencies[k - 1] += expectedFrequencies[k];\n            expectedFrequencies.pop();\n\n            observedFrequencies[k - 1] += observedFrequencies[k];\n            observedFrequencies.pop();\n        }\n    }\n\n    // Iterate through the squared differences between observed & expected\n    // frequencies, accumulating the `chiSquared` statistic.\n    for (let k = 0; k < observedFrequencies.length; k++) {\n        chiSquared +=\n            Math.pow(observedFrequencies[k] - expectedFrequencies[k], 2) /\n            expectedFrequencies[k];\n    }\n\n    // Calculate degrees of freedom for this test and look it up in the\n    // `chiSquaredDistributionTable` in order to\n    // accept or reject the goodness-of-fit of the hypothesized distribution.\n    // Degrees of freedom, calculated as (number of class intervals -\n    // number of hypothesized distribution parameters estimated - 1)\n    const degreesOfFreedom = observedFrequencies.length - c - 1;\n    return (\n        chiSquaredDistributionTable[degreesOfFreedom][significance] < chiSquared\n    );\n}\n\nexport default chiSquaredGoodnessOfFit;\n", "import interquartileRange from \"./interquartile_range.js\";\nimport stddev from \"./sample_standard_deviation.js\";\n\nconst SQRT_2PI = Math.sqrt(2 * Math.PI);\n\n/**\n * [Well-known kernels](https://en.wikipedia.org/wiki/Kernel_(statistics)#Kernel_functions_in_common_use)\n * @private\n */\nconst kernels = {\n    /**\n     * The gaussian kernel.\n     * @private\n     */\n    gaussian: function (u) {\n        return Math.exp(-0.5 * u * u) / SQRT_2PI;\n    }\n};\n\n/**\n * Well known bandwidth selection methods\n * @private\n */\nconst bandwidthMethods = {\n    /**\n     * The [\"normal reference distribution\"\n     * rule-of-thumb](https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/bandwidth.nrd.html),\n     * a commonly used version of [Silverman's\n     * rule-of-thumb](https://en.wikipedia.org/wiki/Kernel_density_estimation#A_rule-of-thumb_bandwidth_estimator).\n     * @private\n     */\n    nrd: function (x) {\n        let s = stddev(x);\n        const iqr = interquartileRange(x);\n        if (typeof iqr === \"number\") {\n            s = Math.min(s, iqr / 1.34);\n        }\n        return 1.06 * s * Math.pow(x.length, -0.2);\n    }\n};\n\n/**\n * [Kernel density estimation](https://en.wikipedia.org/wiki/Kernel_density_estimation)\n * is a useful tool for, among other things, estimating the shape of the\n * underlying probability distribution from a sample.\n *\n * @name kernelDensityEstimation\n * @param X sample values\n * @param kernel The kernel function to use. If a function is provided, it should return non-negative values and integrate to 1. Defaults to 'gaussian'.\n * @param bandwidthMethod The \"bandwidth selection\" method to use, or a fixed bandwidth value. Defaults to \"nrd\", the commonly-used [\"normal reference distribution\" rule-of-thumb](https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/bandwidth.nrd.html).\n * @returns {Function} An estimated [probability density function](https://en.wikipedia.org/wiki/Probability_density_function) for the given sample. The returned function runs in `O(X.length)`.\n */\nfunction kernelDensityEstimation(X, kernel, bandwidthMethod) {\n    let kernelFn;\n    if (kernel === undefined) {\n        kernelFn = kernels.gaussian;\n    } else if (typeof kernel === \"string\") {\n        if (!kernels[kernel]) {\n            throw new Error('Unknown kernel \"' + kernel + '\"');\n        }\n        kernelFn = kernels[kernel];\n    } else {\n        kernelFn = kernel;\n    }\n\n    let bandwidth;\n    if (typeof bandwidthMethod === \"undefined\") {\n        bandwidth = bandwidthMethods.nrd(X);\n    } else if (typeof bandwidthMethod === \"string\") {\n        if (!bandwidthMethods[bandwidthMethod]) {\n            throw new Error(\n                'Unknown bandwidth method \"' + bandwidthMethod + '\"'\n            );\n        }\n        bandwidth = bandwidthMethods[bandwidthMethod](X);\n    } else {\n        bandwidth = bandwidthMethod;\n    }\n\n    return function (x) {\n        let i = 0;\n        let sum = 0;\n        for (i = 0; i < X.length; i++) {\n            sum += kernelFn((x - X[i]) / bandwidth);\n        }\n        return sum / bandwidth / X.length;\n    };\n}\n\nexport default kernelDensityEstimation;\n", "/**\n * The [Z-Score, or Standard Score](http://en.wikipedia.org/wiki/Standard_score).\n *\n * The standard score is the number of standard deviations an observation\n * or datum is above or below the mean. Thus, a positive standard score\n * represents a datum above the mean, while a negative standard score\n * represents a datum below the mean. It is a dimensionless quantity\n * obtained by subtracting the population mean from an individual raw\n * score and then dividing the difference by the population standard\n * deviation.\n *\n * The z-score is only defined if one knows the population parameters;\n * if one only has a sample set, then the analogous computation with\n * sample mean and sample standard deviation yields the\n * Student's t-statistic.\n *\n * @param {number} x\n * @param {number} mean\n * @param {number} standardDeviation\n * @return {number} z score\n * @example\n * zScore(78, 80, 5); // => -0.4\n */\nfunction zScore(x, mean, standardDeviation) {\n    return (x - mean) / standardDeviation;\n}\n\nexport default zScore;\n", "const SQRT_2PI = Math.sqrt(2 * Math.PI);\n\nfunction cumulativeDistribution(z) {\n    let sum = z;\n    let tmp = z;\n\n    // 15 iterations are enough for 4-digit precision\n    for (let i = 1; i < 15; i++) {\n        tmp *= (z * z) / (2 * i + 1);\n        sum += tmp;\n    }\n    return (\n        Math.round((0.5 + (sum / SQRT_2PI) * Math.exp((-z * z) / 2)) * 1e4) /\n        1e4\n    );\n}\n\n/**\n * A standard normal table, also called the unit normal table or Z table,\n * is a mathematical table for the values of Φ (phi), which are the values of\n * the [cumulative distribution function](https://en.wikipedia.org/wiki/Normal_distribution#Cumulative_distribution_function)\n * of the normal distribution. It is used to find the probability that a\n * statistic is observed below, above, or between values on the standard\n * normal distribution, and by extension, any normal distribution.\n */\nconst standardNormalTable = [];\n\nfor (let z = 0; z <= 3.09; z += 0.01) {\n    standardNormalTable.push(cumulativeDistribution(z));\n}\n\nexport default standardNormalTable;\n", "import standardNormalTable from \"./standard_normal_table.js\";\n\n/**\n * **[Cumulative Standard Normal Probability](http://en.wikipedia.org/wiki/Standard_normal_table)**\n *\n * Since probability tables cannot be\n * printed for every normal distribution, as there are an infinite variety\n * of normal distributions, it is common practice to convert a normal to a\n * standard normal and then use the standard normal table to find probabilities.\n *\n * You can use `.5 + .5 * errorFunction(x / Math.sqrt(2))` to calculate the probability\n * instead of looking it up in a table.\n *\n * @param {number} z\n * @returns {number} cumulative standard normal probability\n */\nfunction cumulativeStdNormalProbability(z) {\n    // Calculate the position of this value.\n    const absZ = Math.abs(z);\n    // Each row begins with a different\n    // significant digit: 0.5, 0.6, 0.7, and so on. Each value in the table\n    // corresponds to a range of 0.01 in the input values, so the value is\n    // multiplied by 100.\n    const index = Math.min(\n        Math.round(absZ * 100),\n        standardNormalTable.length - 1\n    );\n\n    // The index we calculate must be in the table as a positive value,\n    // but we still pay attention to whether the input is positive\n    // or negative, and flip the output value as a last step.\n    if (z >= 0) {\n        return standardNormalTable[index];\n    } else {\n        // due to floating-point arithmetic, values in the table with\n        // 4 significant figures can nevertheless end up as repeating\n        // fractions when they're computed here.\n        return Math.round((1 - standardNormalTable[index]) * 1e4) / 1e4;\n    }\n}\n\nexport default cumulativeStdNormalProbability;\n", "/**\n * **[Logistic Cumulative Distribution Function](https://en.wikipedia.org/wiki/Logistic_distribution)**\n *\n * @param {number} x\n * @returns {number} cumulative standard logistic probability\n */\nfunction cumulativeStdLogisticProbability(x) {\n    return 1 / (Math.exp(-x) + 1);\n}\n\nexport default cumulativeStdLogisticProbability;\n", "/**\n * **[Gaussian error function](http://en.wikipedia.org/wiki/Error_function)**\n *\n * The `errorFunction(x/(sd * Math.sqrt(2)))` is the probability that a value in a\n * normal distribution with standard deviation sd is within x of the mean.\n *\n * This function returns a numerical approximation to the exact value.\n * It uses Horner's method to evaluate the polynomial of τ (tau).\n *\n * @param {number} x input\n * @return {number} error estimation\n * @example\n * errorFunction(1).toFixed(2); // => '0.84'\n */\nfunction errorFunction(x) {\n    const t = 1 / (1 + 0.5 * Math.abs(x));\n    const tau =\n        t *\n        Math.exp(\n            -x * x +\n                ((((((((0.17087277 * t - 0.82215223) * t + 1.48851587) * t -\n                    1.13520398) *\n                    t +\n                    0.27886807) *\n                    t -\n                    0.18628806) *\n                    t +\n                    0.09678418) *\n                    t +\n                    0.37409196) *\n                    t +\n                    1.00002368) *\n                    t -\n                1.26551223\n        );\n    if (x >= 0) {\n        return 1 - tau;\n    } else {\n        return tau - 1;\n    }\n}\n\nexport default errorFunction;\n", "/**\n * The Inverse [Gaussian error function](http://en.wikipedia.org/wiki/Error_function)\n * returns a numerical approximation to the value that would have caused\n * `errorFunction()` to return x.\n *\n * @param {number} x value of error function\n * @returns {number} estimated inverted value\n */\nfunction inverseErrorFunction(x) {\n    const a = (8 * (Math.PI - 3)) / (3 * Math.PI * (4 - Math.PI));\n\n    const inv = Math.sqrt(\n        Math.sqrt(\n            Math.pow(2 / (Math.PI * a) + Math.log(1 - x * x) / 2, 2) -\n                Math.log(1 - x * x) / a\n        ) -\n            (2 / (Math.PI * a) + Math.log(1 - x * x) / 2)\n    );\n\n    if (x >= 0) {\n        return inv;\n    } else {\n        return -inv;\n    }\n}\n\nexport default inverseErrorFunction;\n", "import epsilon from \"./epsilon.js\";\nimport inverseErrorFunction from \"./inverse_error_function.js\";\n\n/**\n * The [Probit](http://en.wikipedia.org/wiki/Probit)\n * is the inverse of cumulativeStdNormalProbability(),\n * and is also known as the normal quantile function.\n *\n * It returns the number of standard deviations from the mean\n * where the p'th quantile of values can be found in a normal distribution.\n * So, for example, probit(0.5 + 0.6827/2) ≈ 1 because 68.27% of values are\n * normally found within 1 standard deviation above or below the mean.\n *\n * @param {number} p\n * @returns {number} probit\n */\nfunction probit(p) {\n    if (p === 0) {\n        p = epsilon;\n    } else if (p >= 1) {\n        p = 1 - epsilon;\n    }\n    return Math.sqrt(2) * inverseErrorFunction(2 * p - 1);\n}\n\nexport default probit;\n", "/**\n * The [Logit](https://en.wikipedia.org/wiki/Logit)\n * is the inverse of cumulativeStdLogisticProbability,\n * and is also known as the logistic quantile function.\n *\n * @param {number} p\n * @returns {number} logit\n */\nfunction logit(p) {\n    if (p <= 0 || p >= 1) {\n        throw new Error(\"p must be strictly between zero and one\");\n    }\n    return Math.log(p / (1 - p));\n}\n\nexport default logit;\n", "import mean from \"./mean.js\";\nimport shuffleInPlace from \"./shuffle_in_place.js\";\n\n/**\n * Conducts a [permutation test](https://en.wikipedia.org/wiki/Resampling_(statistics)#Permutation_tests)\n * to determine if two data sets are *significantly* different from each other, using\n * the difference of means between the groups as the test statistic.\n * The function allows for the following hypotheses:\n * - two_tail = Null hypothesis: the two distributions are equal.\n * - greater = Null hypothesis: observations from sampleX tend to be smaller than those from sampleY.\n * - less = Null hypothesis: observations from sampleX tend to be greater than those from sampleY.\n * [Learn more about one-tail vs two-tail tests.](https://en.wikipedia.org/wiki/One-_and_two-tailed_tests)\n *\n * @param {Array<number>} sampleX first dataset (e.g. treatment data)\n * @param {Array<number>} sampleY second dataset (e.g. control data)\n * @param {string} alternative alternative hypothesis, either 'two_sided' (default), 'greater', or 'less'\n * @param {number} k number of values in permutation distribution.\n * @param {Function} [randomSource=Math.random] an optional entropy source\n * @returns {number} p-value The probability of observing the difference between groups (as or more extreme than what we did), assuming the null hypothesis.\n *\n * @example\n * var control = [2, 5, 3, 6, 7, 2, 5];\n * var treatment = [20, 5, 13, 12, 7, 2, 2];\n * permutationTest(control, treatment); // ~0.1324\n */\nfunction permutationTest(sampleX, sampleY, alternative, k, randomSource) {\n    // Set default arguments\n    if (k === undefined) {\n        k = 10000;\n    }\n    if (alternative === undefined) {\n        alternative = \"two_side\";\n    }\n    if (\n        alternative !== \"two_side\" &&\n        alternative !== \"greater\" &&\n        alternative !== \"less\"\n    ) {\n        throw new Error(\n            \"`alternative` must be either 'two_side', 'greater', or 'less'.\"\n        );\n    }\n\n    // get means for each sample\n    const meanX = mean(sampleX);\n    const meanY = mean(sampleY);\n\n    // calculate initial test statistic. This will be our point of comparison with\n    // the generated test statistics.\n    const testStatistic = meanX - meanY;\n\n    // create test-statistic distribution\n    const testStatDsn = new Array(k);\n\n    // combine datsets so we can easily shuffle later\n    const allData = sampleX.concat(sampleY);\n    const midIndex = Math.floor(allData.length / 2);\n\n    for (let i = 0; i < k; i++) {\n        // 1. shuffle data assignments\n        shuffleInPlace(allData, randomSource);\n        const permLeft = allData.slice(0, midIndex);\n        const permRight = allData.slice(midIndex, allData.length);\n\n        // 2.re-calculate test statistic\n        const permTestStatistic = mean(permLeft) - mean(permRight);\n\n        // 3. store test statistic to build test statistic distribution\n        testStatDsn[i] = permTestStatistic;\n    }\n\n    // Calculate p-value depending on alternative\n    // For this test, we calculate the percentage of 'extreme' test statistics (subject to our hypothesis)\n    // more info on permutation test p-value calculations: https://onlinecourses.science.psu.edu/stat464/node/35\n    let numExtremeTStats = 0;\n    if (alternative === \"two_side\") {\n        for (let i = 0; i <= k; i++) {\n            if (Math.abs(testStatDsn[i]) >= Math.abs(testStatistic)) {\n                numExtremeTStats += 1;\n            }\n        }\n    } else if (alternative === \"greater\") {\n        for (let i = 0; i <= k; i++) {\n            if (testStatDsn[i] >= testStatistic) {\n                numExtremeTStats += 1;\n            }\n        }\n    } else {\n        // alternative === 'less'\n        for (let i = 0; i <= k; i++) {\n            /* c8 ignore start */\n            if (testStatDsn[i] <= testStatistic) {\n                numExtremeTStats += 1;\n            }\n            /* c8 ignore end */\n        }\n    }\n\n    return numExtremeTStats / k;\n}\n\nexport default permutationTest;\n", "/**\n * [Sign](https://en.wikipedia.org/wiki/Sign_function) is a function\n * that extracts the sign of a real number\n *\n * @param {number} x input value\n * @returns {number} sign value either 1, 0 or -1\n * @throws {TypeError} if the input argument x is not a number\n * @private\n *\n * @example\n * sign(2); // => 1\n */\nfunction sign(x) {\n    if (typeof x === \"number\") {\n        if (x < 0) {\n            return -1;\n        } else if (x === 0) {\n            return 0;\n        } else {\n            return 1;\n        }\n    } else {\n        throw new TypeError(\"not a number\");\n    }\n}\n\nexport default sign;\n", "import sign from \"./sign.js\";\n\n/**\n * [Bisection method](https://en.wikipedia.org/wiki/Bisection_method) is a root-finding\n * method that repeatedly bisects an interval to find the root.\n *\n * This function returns a numerical approximation to the exact value.\n *\n * @param {Function} func input function\n * @param {number} start - start of interval\n * @param {number} end - end of interval\n * @param {number} maxIterations - the maximum number of iterations\n * @param {number} errorTolerance - the error tolerance\n * @returns {number} estimated root value\n * @throws {TypeError} Argument func must be a function\n *\n * @example\n * bisect(Math.cos,0,4,100,0.003); // => 1.572265625\n */\nfunction bisect(func, start, end, maxIterations, errorTolerance) {\n    if (typeof func !== \"function\")\n        throw new TypeError(\"func must be a function\");\n\n    for (let i = 0; i < maxIterations; i++) {\n        const output = (start + end) / 2;\n\n        if (\n            func(output) === 0 ||\n            Math.abs((end - start) / 2) < errorTolerance\n        ) {\n            return output;\n        }\n\n        if (sign(func(output)) === sign(func(start))) {\n            start = output;\n        } else {\n            end = output;\n        }\n    }\n\n    throw new Error(\"maximum number of iterations exceeded\");\n}\n\nexport default bisect;\n", "/**\n * Calculate Euclidean distance between two points.\n * @param {Array<number>} left First N-dimensional point.\n * @param {Array<number>} right Second N-dimensional point.\n * @returns {number} Distance.\n */\nfunction euclideanDistance(left, right) {\n    let sum = 0;\n    for (let i = 0; i < left.length; i++) {\n        const diff = left[i] - right[i];\n        sum += diff * diff;\n    }\n    return Math.sqrt(sum);\n}\n\nexport default euclideanDistance;\n", "import euclideanDistance from \"./euclidean_distance.js\";\nimport makeMatrix from \"./make_matrix.js\";\nimport sample from \"./sample.js\";\n\n/**\n * @typedef {Object} kMeansReturn\n * @property {Array<number>} labels The labels.\n * @property {Array<Array<number>>} centroids The cluster centroids.\n */\n\n/**\n * Perform k-means clustering.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points to be clustered.\n * @param {number} numCluster How many clusters to create.\n * @param {Function} randomSource An optional entropy source that generates uniform values in [0, 1).\n * @return {kMeansReturn} Labels (same length as data) and centroids (same length as numCluster).\n * @throws {Error} If any centroids wind up friendless (i.e., without associated points).\n *\n * @example\n * kMeansCluster([[0.0, 0.5], [1.0, 0.5]], 2); // => {labels: [0, 1], centroids: [[0.0, 0.5], [1.0 0.5]]}\n */\nfunction kMeansCluster(points, numCluster, randomSource = Math.random) {\n    let oldCentroids = null;\n    let newCentroids = sample(points, numCluster, randomSource);\n    let labels = null;\n    let change = Number.MAX_VALUE;\n    while (change !== 0) {\n        labels = labelPoints(points, newCentroids);\n        oldCentroids = newCentroids;\n        newCentroids = calculateCentroids(points, labels, numCluster);\n        change = calculateChange(newCentroids, oldCentroids);\n    }\n    return {\n        labels: labels,\n        centroids: newCentroids\n    };\n}\n\n/**\n * Label each point according to which centroid it is closest to.\n *\n * @private\n * @param {Array<Array<number>>} points Array of XY coordinates.\n * @param {Array<Array<number>>} centroids Current centroids.\n * @return {Array<number>} Group labels.\n */\nfunction labelPoints(points, centroids) {\n    return points.map((p) => {\n        let minDist = Number.MAX_VALUE;\n        let label = -1;\n        for (let i = 0; i < centroids.length; i++) {\n            const dist = euclideanDistance(p, centroids[i]);\n            if (dist < minDist) {\n                minDist = dist;\n                label = i;\n            }\n        }\n        return label;\n    });\n}\n\n/**\n * Calculate centroids for points given labels.\n *\n * @private\n * @param {Array<Array<number>>} points Array of XY coordinates.\n * @param {Array<number>} labels Which groups points belong to.\n * @param {number} numCluster Number of clusters being created.\n * @return {Array<Array<number>>} Centroid for each group.\n * @throws {Error} If any centroids wind up friendless (i.e., without associated points).\n */\nfunction calculateCentroids(points, labels, numCluster) {\n    // Initialize accumulators.\n    const dimension = points[0].length;\n    const centroids = makeMatrix(numCluster, dimension);\n    const counts = Array(numCluster).fill(0);\n\n    // Add points to centroids' accumulators and count points per centroid.\n    const numPoints = points.length;\n    for (let i = 0; i < numPoints; i++) {\n        const point = points[i];\n        const label = labels[i];\n        const current = centroids[label];\n        for (let j = 0; j < dimension; j++) {\n            current[j] += point[j];\n        }\n        counts[label] += 1;\n    }\n\n    // Rescale centroids, checking for any that have no points.\n    for (let i = 0; i < numCluster; i++) {\n        if (counts[i] === 0) {\n            throw new Error(`Centroid ${i} has no friends`);\n        }\n        const centroid = centroids[i];\n        for (let j = 0; j < dimension; j++) {\n            centroid[j] /= counts[i];\n        }\n    }\n\n    return centroids;\n}\n\n/**\n * Calculate the difference between old centroids and new centroids.\n *\n * @private\n * @param {Array<Array<number>>} left One list of centroids.\n * @param {Array<Array<number>>} right Another list of centroids.\n * @return {number} Distance between centroids.\n */\nfunction calculateChange(left, right) {\n    let total = 0;\n    for (let i = 0; i < left.length; i++) {\n        total += euclideanDistance(left[i], right[i]);\n    }\n    return total;\n}\n\nexport default kMeansCluster;\n", "import euclideanDistance from \"./euclidean_distance.js\";\nimport makeMatrix from \"./make_matrix.js\";\nimport max from \"./max.js\";\n\n/**\n * Calculate the [silhouette values](https://en.wikipedia.org/wiki/Silhouette_(clustering))\n * for clustered data.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {Array<number>} The silhouette value for each point.\n *\n * @example\n * silhouette([[0.25], [0.75]], [0, 0]); // => [1.0, 1.0]\n */\nfunction silhouette(points, labels) {\n    if (points.length !== labels.length) {\n        throw new Error(\"must have exactly as many labels as points\");\n    }\n    const groupings = createGroups(labels);\n    const distances = calculateAllDistances(points);\n    const result = [];\n    for (let i = 0; i < points.length; i++) {\n        let s = 0;\n        if (groupings[labels[i]].length > 1) {\n            const a = meanDistanceFromPointToGroup(\n                i,\n                groupings[labels[i]],\n                distances\n            );\n            const b = meanDistanceToNearestGroup(\n                i,\n                labels,\n                groupings,\n                distances\n            );\n            s = (b - a) / Math.max(a, b);\n        }\n        result.push(s);\n    }\n    return result;\n}\n\n/**\n * Create a lookup table mapping group IDs to point IDs.\n *\n * @private\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {Array<Array<number>>} An array of length G, each of whose entries is an array\n * containing the indices of the points in that group.\n */\nfunction createGroups(labels) {\n    const numGroups = 1 + max(labels);\n    const result = Array(numGroups);\n    for (let i = 0; i < labels.length; i++) {\n        const label = labels[i];\n        if (result[label] === undefined) {\n            result[label] = [];\n        }\n        result[label].push(i);\n    }\n    return result;\n}\n\n/**\n * Create a lookup table of all inter-point distances.\n *\n * @private\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @return {Array<Array<number>>} A symmetric square array of inter-point distances\n * (zero on the diagonal).\n */\nfunction calculateAllDistances(points) {\n    const numPoints = points.length;\n    const result = makeMatrix(numPoints, numPoints);\n    for (let i = 0; i < numPoints; i++) {\n        for (let j = 0; j < i; j++) {\n            result[i][j] = euclideanDistance(points[i], points[j]);\n            result[j][i] = result[i][j];\n        }\n    }\n    return result;\n}\n\n/**\n * Calculate the mean distance between this point and all the points in the\n * nearest group (as determined by which point in another group is closest).\n *\n * @private\n * @param {number} which The index of this point.\n * @param {Array<number>} labels Labels of points.\n * @param {Array<Array<number>>} groupings An array whose entries are arrays\n * containing the indices of the points in that group.\n * @param {Array<Array<number>>} distances A symmetric square array of inter-point\n * distances.\n * @return {number} The mean distance from this point to others in the nearest\n * group.\n */\nfunction meanDistanceToNearestGroup(which, labels, groupings, distances) {\n    const label = labels[which];\n    let result = Number.MAX_VALUE;\n    for (let i = 0; i < groupings.length; i++) {\n        if (i !== label) {\n            const d = meanDistanceFromPointToGroup(\n                which,\n                groupings[i],\n                distances\n            );\n            if (d < result) {\n                result = d;\n            }\n        }\n    }\n    return result;\n}\n\n/**\n * Calculate the mean distance between a point and all the points in a group\n * (possibly its own).\n *\n * @private\n * @param {number} which The index of this point.\n * @param {Array<number>} group The indices of all the points in the group in\n * question.\n * @param {Array<Array<number>>} distances A symmetric square array of inter-point\n * distances.\n * @return {number} The mean distance from this point to others in the\n * specified group.\n */\nfunction meanDistanceFromPointToGroup(which, group, distances) {\n    let total = 0;\n    for (let i = 0; i < group.length; i++) {\n        total += distances[which][group[i]];\n    }\n    return total / group.length;\n}\n\nexport default silhouette;\n", "import max from \"./max.js\";\nimport silhouette from \"./silhouette.js\";\n\n/**\n * Calculate the [silhouette metric](https://en.wikipedia.org/wiki/Silhouette_(clustering))\n * for a set of N-dimensional points arranged in groups. The metric is the largest\n * individual silhouette value for the data.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {number} The silhouette metric for the groupings.\n *\n * @example\n * silhouetteMetric([[0.25], [0.75]], [0, 0]); // => 1.0\n */\nfunction silhouetteMetric(points, labels) {\n    const values = silhouette(points, labels);\n    return max(values);\n}\n\nexport default silhouetteMetric;\n", "/**\n * Relative error.\n *\n * This is more difficult to calculate than it first appears [1,2].  The usual\n * formula for the relative error between an actual value A and an expected\n * value E is `|(A-E)/E|`, but:\n *\n * 1. If the expected value is 0, any other value has infinite relative error,\n *    which is counter-intuitive: if the expected voltage is 0, getting 1/10th\n *    of a volt doesn't feel like an infinitely large error.\n *\n * 2. This formula does not satisfy the mathematical definition of a metric [3].\n *    [4] solved this problem by defining the relative error as `|ln(|A/E|)|`,\n *    but that formula only works if all values are positive: for example, it\n *    reports the relative error of -10 and 10 as 0.\n *\n * Our implementation sticks with convention and returns:\n *\n * - 0 if the actual and expected values are both zero\n * - Infinity if the actual value is non-zero and the expected value is zero\n * - `|(A-E)/E|` in all other cases\n *\n * [1] https://math.stackexchange.com/questions/677852/how-to-calculate-relative-error-when-true-value-is-zero\n * [2] https://en.wikipedia.org/wiki/Relative_change_and_difference\n * [3] https://en.wikipedia.org/wiki/Metric_(mathematics)#Definition\n * [4] F.W.J. Olver: \"A New Approach to Error Arithmetic.\" SIAM Journal on\n *     Numerical Analysis, 15(2), 1978, 10.1137/0715024.\n *\n * @param {number} actual The actual value.\n * @param {number} expected The expected value.\n * @return {number} The relative error.\n */\nfunction relativeError(actual, expected) {\n    // These lines are actually covered by tests, but it seems\n    // like c8 has a bug that marks them as not covered.\n    /* c8 ignore start */\n    if (actual === 0 && expected === 0) {\n        return 0;\n    }\n    /* c8 ignore end */\n    return Math.abs((actual - expected) / expected);\n}\n\nexport default relativeError;\n", "import epsilon from \"./epsilon.js\";\nimport relativeError from \"./relative_error.js\";\n\n/**\n * Approximate equality.\n *\n * @param {number} actual The value to be tested.\n * @param {number} expected The reference value.\n * @param {number} tolerance The acceptable relative difference.\n * @return {boolean} Whether numbers are within tolerance.\n */\nfunction approxEqual(actual, expected, tolerance = epsilon) {\n    return relativeError(actual, expected) <= tolerance;\n}\n\nexport default approxEqual;\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { quantile } from 'simple-statistics'\nimport * as L from 'leaflet'\nimport WktLeaflet from 'wicket-leaflet'\nimport Wkt from 'wicket'\nimport { cellToBoundary } from 'h3-js'\n\nexport default class extends Controller {\n  static values = {\n    h3Data: Array,\n    compSetPolygons: String,\n    attribute: String,\n    listingsUrl: { type: String, default: '' },\n    displayPolygons: Boolean,\n    translations: Object,\n    currencySymbol: String,\n    parentName: String,\n    highlightedPolygonId: { type: String, default: '' }\n  }\n\n  static targets = [\"map\", \"listingsContainer\"]\n\n  // Track the current fetch request\n  currentFetch = null\n\n  connect() {\n    this.initializeMap()\n    this.selectedPolygon = null\n    this.polygons = {}\n\n    // Define polygon styles\n    this.polygonStyles = {\n      default: {\n        color: '#6b7280',\n        fill: false,\n        fillOpacity: 0.2,\n        weight: 2,\n        dashArray: null\n      },\n      highlighted: {\n        color: '#dc2626',\n        fill: false,\n        fillOpacity: 0.2,\n        weight: 2,\n        dashArray: '5, 5'\n      }\n    }\n\n    // Set up event listeners for polygon highlighting (only if polygons are displayed)\n    if (this.displayPolygonsValue) {\n      this.displayAllPolygons()\n      this.setupPolygonEventListeners()\n\n      // Highlight polygon if one is specified\n      if (this.highlightedPolygonIdValue) {\n        const element = $(`[data-polygon-id='${this.highlightedPolygonIdValue}']`).first()\n        if (element.length) {\n          this.highlightPolygon({ currentTarget: element.get(0) })\n        }\n      }\n    } else {\n      // Clear any existing row highlights when polygons are not displayed\n      this.clearAllRowHighlights()\n    }\n  }\n\n  setupPolygonEventListeners() {\n    // Use jQuery to handle the events more reliably\n    $(document).on('mouseenter.h3map', '[data-polygon-id]', (e) => {\n      this.highlightPolygon(e)\n    })\n\n    $(document).on('mouseleave.h3map', '[data-polygon-id]', (e) => {\n      this.resetPolygonHighlight(e)\n    })\n  }\n\n  disconnect() {\n    // Clean up event listeners\n    $(document).off('.h3map')\n  }\n\n  displayAllPolygons() {\n    // Find all elements with data-see-submarket and add their polygons to the map\n    $('[data-see-submarket]').each((index, element) => {\n      const $row = $(element).parents('tr')\n      const geometry = $row.attr('data-polygon')\n      const polygonId = $row.attr('data-polygon-id')\n\n      if (geometry && polygonId) {\n        const wkt = new Wkt.Wkt()\n        wkt.read(geometry)\n        const polygon = wkt.toObject({\n          color: '#6b7280',\n          fill: false,\n          fillOpacity: 0.2,\n          weight: 1.5,\n          interactive: false\n        })\n\n        this.polygons[polygonId] = polygon\n        this.polygonLayer.addLayer(polygon)\n      }\n    })\n  }\n\n  highlightPolygon(event) {\n    const $row = $(event.currentTarget)\n    const polygonId = $row.attr('data-polygon-id')\n\n    if (polygonId && this.displayPolygonsValue) {\n      this.setPolygonStyle(polygonId, 'highlighted')\n      this.setRowHighlight(polygonId, true)\n\n      // Center the map on the highlighted polygon\n      const polygon = this.polygons[polygonId]\n      if (polygon) {\n        const bounds = polygon.getBounds()\n        this.map.fitBounds(bounds, { padding: [20, 20] })\n      }\n    }\n  }\n\n  resetPolygonHighlight(event) {\n    const $row = $(event.currentTarget)\n    const polygonId = $row.attr('data-polygon-id')\n\n    if (polygonId && this.displayPolygonsValue) {\n      this.setPolygonStyle(polygonId, 'default')\n      this.setRowHighlight(polygonId, false)\n    }\n  }\n\n  handlePolygonHover(event) {\n    const $row = $(event.currentTarget).parents('tr')\n    this.highlightPolygon({ currentTarget: $row.get(0) })\n  }\n\n  // Helper methods for polygon and row highlighting\n  setPolygonStyle(polygonId, style) {\n    if (polygonId && this.polygons[polygonId]) {\n      const polygon = this.polygons[polygonId]\n      polygon.setStyle(this.polygonStyles[style])\n\n      if (style === 'highlighted') {\n        polygon.bringToFront()\n      } else {\n        // Reset z-index by removing from front\n        if (this.polygonLayer.hasLayer(polygon)) {\n          this.polygonLayer.removeLayer(polygon)\n          this.polygonLayer.addLayer(polygon)\n        }\n      }\n    }\n  }\n\n  setRowHighlight(polygonId, highlighted = true) {\n    const $row = $(`[data-polygon-id='${polygonId}']`).first()\n    if ($row.length) {\n      if (highlighted) {\n        $row.addClass('bg-gray-100')\n      } else {\n        $row.removeClass('bg-gray-100')\n      }\n    }\n  }\n\n  clearAllRowHighlights() {\n    // Remove highlight class from all table rows\n    $('[data-polygon-id]').removeClass('bg-gray-100')\n  }\n\n  scrollToRow(polygonId) {\n    const $row = $(`[data-polygon-id='${polygonId}']`).first()\n    if ($row.length) {\n      const $tableContainer = $row.closest('.overflow-auto, .overflow-y-auto, [data-table-container]')\n      if ($tableContainer.length) {\n        const rowTop = $row.offset().top\n        const containerTop = $tableContainer.offset().top\n        const containerHeight = $tableContainer.height()\n        const rowHeight = $row.outerHeight()\n\n        // Calculate the scroll position to center the row in the container\n        const scrollTop = $tableContainer.scrollTop() + (rowTop - containerTop) - (containerHeight / 2) + (rowHeight / 2)\n\n        $tableContainer.animate({\n          scrollTop: scrollTop\n        }, 300)\n      }\n    }\n  }\n\n  findContainingPolygon(hexagonCenter, hexBoundary = null) {\n    let bestPolygonId = null\n    let maxVerticesInside = 0\n\n    // If we have the hexagon boundary, find polygon with most vertices inside\n    if (hexBoundary) {\n      for (const [polygonId, polygon] of Object.entries(this.polygons)) {\n        // Count how many hexagon vertices are inside the polygon\n        let verticesInside = 0\n        for (const point of hexBoundary) {\n          if (polygon.getBounds().contains(L.latLng(point[0], point[1]))) {\n            verticesInside++\n          }\n        }\n\n        if (verticesInside > maxVerticesInside) {\n          maxVerticesInside = verticesInside\n          bestPolygonId = polygonId\n        }\n      }\n    } else {\n      // Fallback to original method if no hexagon boundary provided\n      for (const [polygonId, polygon] of Object.entries(this.polygons)) {\n        if (polygon.getBounds().contains(hexagonCenter)) {\n          return polygonId\n        }\n      }\n    }\n\n    return bestPolygonId\n  }\n\n  highlightPolygonFromHexagon(hexagonCenter, hexBoundary = null) {\n    const polygonId = this.findContainingPolygon(hexagonCenter, hexBoundary)\n    if (polygonId) {\n      this.setPolygonStyle(polygonId, 'highlighted')\n      this.setRowHighlight(polygonId, true)\n    }\n  }\n\n  resetPolygonHighlightFromHexagon(hexagonCenter, hexBoundary = null) {\n    const polygonId = this.findContainingPolygon(hexagonCenter, hexBoundary)\n    if (polygonId) {\n      this.setPolygonStyle(polygonId, 'default')\n      this.setRowHighlight(polygonId, false)\n    }\n  }\n\n\n\n  handleHexagonSelected(event) {\n    const { h3Index } = event.detail\n    this.fetchListingsDetails(h3Index)\n  }\n\n  async fetchListingsDetails(h3Index) {\n    if (!this.hasListingsUrlValue) return\n\n    try {\n      // If there's a pending request, abort it\n      if (this.currentFetch) {\n        this.currentFetch.abort('New hexagon selected')\n      }\n\n      // Create new AbortController for this request\n      const controller = new AbortController()\n      this.currentFetch = controller\n\n      const queryParams = new URLSearchParams(this.listingsUrlValue)\n      queryParams.set('h3_index', h3Index)\n\n      const response = await fetch(decodeURIComponent(queryParams.toString()), {\n        headers: {\n          'Accept': 'text/html',\n          'X-Requested-With': 'XMLHttpRequest'\n        },\n        signal: controller.signal\n      })\n\n      if (!response.ok) throw new Error('Network response was not ok')\n\n      const html = await response.text()\n      this.listingsContainerTarget.innerHTML = html\n\n      // Clear the currentFetch if request completed successfully\n      this.currentFetch = null\n    } catch (error) {\n      if (error.name === 'AbortError') {\n        console.log('Fetch aborted')\n      } else {\n        console.error('Error fetching listings details:', error)\n        this.listingsContainerTarget.innerHTML = '<div class=\"text-red-500 p-4\">Error loading listings details</div>'\n      }\n    }\n  }\n\n  initializeMap() {\n    const isPreview = !this.listingsUrlValue.length\n\n    const map = this.map = L.map(this.mapTarget, {\n      preferCanvas: true\n    })\n\n    const wkt = new Wkt.Wkt()\n\n    const tiles = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {\n      maxZoom: 19,\n      attribution: '&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>'\n    }).addTo(map)\n\n    // Create a layer group for polygons that should be below hexagons\n    this.polygonLayer = L.layerGroup([])\n    this.hexagonLayer = L.layerGroup([])\n\n\n\n    // Add event handlers for submarket hover\n    $(document).on('mouseenter', '[data-see-submarket]', (e) => {\n      this.handlePolygonHover(e)\n    })\n\n    // Function to calculate percentile\n    function percentile(arr, p) {\n      if (arr.length === 0) return 0\n      return quantile(arr, p / 100)\n    }\n\n    // Define percentiles and color palette\n    const percentiles = [10, 25, 50, 75, 85, 95].reverse()\n    const palette = [\n      '#03071e',\n      '#370617',\n      '#6a040f',\n      '#9d0208',\n      '#d00000',\n      '#dc2f02',\n      '#e85d04',\n      '#f48c06',\n      '#faa307',\n      '#ffba08'\n    ]\n\n    // Create bins based on percentiles\n    const bins = []\n    for (let i = 0; i < percentiles.length; i++) {\n      const end = percentile(this.h3DataValue.map(d => d[this.attributeValue]), percentiles[i])\n      bins.push(end)\n    }\n\n    // Add comp set polygons\n    wkt.read(this.compSetPolygonsValue)\n    const obj = wkt.toObject({\n      color: '#1F6F54',\n      fillColor: '#E4F0EA',\n      fillOpacity: 0,\n      weight: 2\n    })\n\n    if (this.displayPolygonsValue) {\n      obj.addTo(map)\n    }\n\n    // Helper function to get color based on value\n    function getColor(value) {\n      return value > bins[0] ? palette[2] :\n             value > bins[1] ? palette[3] :\n             value > bins[2] ? palette[5] :\n             value > bins[3] ? palette[7] :\n             value > 0 ? palette[9] : 'none'\n    }\n\n    const translations = this.translationsValue\n    const currencySymbol = this.currencySymbolValue\n    const locale = (translations && translations.locale) || (typeof navigator !== 'undefined' && navigator.language) || 'en'\n\n      // Locale-aware pluralization for the word \"airbnb\"\n  function pluralizeAirbnb(count) {\n    const n = Number(count)\n    try {\n      const pluralRules = new Intl.PluralRules(locale)\n      const category = pluralRules.select(n)\n\n      // Allow overriding via translations if provided\n      if (translations) {\n        // Support object form: translations.airbnb = { one: 'airbnb', other: 'airbnbs', ... }\n        if (translations.airbnb && typeof translations.airbnb === 'object') {\n          return translations.airbnb[category] || translations.airbnb.other || 'airbnbs'\n        }\n        // Support flat keys: airbnb_one, airbnb_other, etc.\n        const flatKey = translations[`airbnb_${category}`]\n        if (flatKey) return flatKey\n      }\n\n      // Default: singular for 'one', plural otherwise\n      return category === 'one' ? 'Airbnb' : 'Airbnbs'\n    } catch (e) {\n      // Fallback if Intl.PluralRules not available\n      return n === 1 ? 'Airbnb' : 'Airbnbs'\n    }\n  }\n\n      // Helper function to format value based on attribute\n  function formatValue(value, attribute) {\n    switch (attribute) {\n      case 'total_revenue':\n        return `${translations.revenue}: ${currencySymbol}${value.toLocaleString(locale)}`\n      case 'occupancy':\n        return `${translations.occupancy}: ${value}%`\n      case 'total_net_adr':\n        return `${translations.adr}: ${currencySymbol}${value.toLocaleString(locale)}`\n      case 'total_booking_count':\n        return `${translations.booking_count}: ${value.toLocaleString(locale)}`\n      case 'listing_count':\n        return `${value.toLocaleString(locale)} ${pluralizeAirbnb(value)}`\n      default:\n        return value\n    }\n  }\n\n  function createTooltipHTML(cell, attribute, translations, currencySymbol, controller) {\n    const value = cell[attribute]\n    const formattedValue = formatValue(value, attribute)\n\n    // Find the parent polygon and get submarket name from table row data\n    let neighborhoodName = controller.parentNameValue;\n\n    // Calculate hexagon center from the h3 index\n    const hexBoundary = cellToBoundary(cell.h3Index, false)\n    const hexagonCenter = L.latLng(\n      hexBoundary.reduce((sum, point) => sum + point[0], 0) / hexBoundary.length,\n      hexBoundary.reduce((sum, point) => sum + point[1], 0) / hexBoundary.length\n    )\n    const containingPolygon = controller.findContainingPolygon(hexagonCenter, hexBoundary)\n\n    if (containingPolygon) {\n      // Look up the submarket name from the table row data\n      const $row = $(`[data-polygon-id='${containingPolygon}']`).first()\n      if ($row.length) {\n        const submarketName = $row.find('[data-see-submarket]').text().trim()\n        if (submarketName) {\n          neighborhoodName = submarketName\n        }\n      }\n    }\n\n    return `\n      <div class=\"custom-tooltip\">\n        <div class=\"tooltip-header\">\n          <div class=\"neighborhood-name\">${neighborhoodName}</div>\n        </div>\n        <div class=\"tooltip-content\">\n          <div class=\"metric-value\">${formattedValue}</div>\n        </div>\n      </div>\n    `\n  }\n\n    const allBounds = L.latLngBounds()\n    let lastTooltip = null\n\n    // Add H3 hexagons to the map\n    this.h3DataValue.forEach(cell => {\n      const hexBoundary = cellToBoundary(cell.h3Index, false)\n      // dont show hexagons that are not inside the polygon\n      if (!obj.getBounds().contains(hexBoundary) && !isPreview) {\n        return\n      }\n\n      const polygon = L.polygon(hexBoundary, {\n        color: 'none',\n        stroke: false,\n        fillColor: getColor(cell[this.attributeValue]),\n        fillOpacity: 0.4\n      }).addTo(this.hexagonLayer)\n\n\n      if (isPreview) {\n        // In preview mode, only add hover effects and click to open full map\n        polygon.on('click', () => {\n          // Scroll to the containing polygon row\n          const hexagonCenter = L.latLng(\n            hexBoundary.reduce((sum, point) => sum + point[0], 0) / hexBoundary.length,\n            hexBoundary.reduce((sum, point) => sum + point[1], 0) / hexBoundary.length\n          )\n          const polygonId = this.findContainingPolygon(hexagonCenter, hexBoundary)\n          if (polygonId) {\n            this.scrollToRow(polygonId)\n          }\n\n          // Dispatch event for parent to handle navigation\n          this.dispatch('hexagonClicked', { detail: { h3Index: cell.h3Index } })\n        })\n\n        polygon.on('mouseover', () => {\n          if (lastTooltip) {\n            lastTooltip.unbindTooltip()\n          }\n\n          polygon.setStyle({\n            color: '#000',\n            weight: 1,\n            fillOpacity: 0.6\n          })\n          lastTooltip = polygon.bindTooltip(createTooltipHTML(cell, this.attributeValue, translations, currencySymbol, this), {\n            permanent: false,\n            direction: 'top',\n            className: 'custom-tooltip-container',\n            offset: [0, -15]\n          }).openTooltip()\n\n          // Highlight the containing polygon\n          const hexagonCenter = L.latLng(\n            hexBoundary.reduce((sum, point) => sum + point[0], 0) / hexBoundary.length,\n            hexBoundary.reduce((sum, point) => sum + point[1], 0) / hexBoundary.length\n          )\n          this.highlightPolygonFromHexagon(hexagonCenter, hexBoundary)\n        })\n\n        polygon.on('mouseout', () => {\n          polygon.setStyle({\n            color: 'none',\n            weight: 2,\n            fillOpacity: 0.4\n          })\n\n          // Reset the containing polygon highlight\n          const hexagonCenter = L.latLng(\n            hexBoundary.reduce((sum, point) => sum + point[0], 0) / hexBoundary.length,\n            hexBoundary.reduce((sum, point) => sum + point[1], 0) / hexBoundary.length\n          )\n          this.resetPolygonHighlightFromHexagon(hexagonCenter, hexBoundary)\n        })\n      } else {\n        // Full map mode with selection functionality\n        polygon.on('click', (e) => {\n          // Reset previous selection if exists\n          if (this.selectedPolygon) {\n            this.selectedPolygon.setStyle({\n              color: 'none',\n              weight: 2,\n              fillOpacity: 0.4\n            })\n          }\n\n          // Update selected polygon\n          this.selectedPolygon = polygon\n          polygon.setStyle({\n            color: '#000',\n            weight: 2,\n            fillOpacity: 0.7\n          })\n\n          // Scroll to the containing polygon row\n          const hexagonCenter = L.latLng(\n            hexBoundary.reduce((sum, point) => sum + point[0], 0) / hexBoundary.length,\n            hexBoundary.reduce((sum, point) => sum + point[1], 0) / hexBoundary.length\n          )\n          const polygonId = this.findContainingPolygon(hexagonCenter, hexBoundary)\n          if (polygonId) {\n            this.scrollToRow(polygonId)\n          }\n\n          // Dispatch event with h3Index\n          this.dispatch('hexagonSelected', { detail: { h3Index: cell.h3Index } })\n        })\n\n        polygon.on('mouseover', (e) => {\n          if (lastTooltip) {\n            lastTooltip.unbindTooltip()\n          }\n\n          if (polygon !== this.selectedPolygon) {\n            polygon.setStyle({\n              color: '#000',\n              weight: 1,\n              fillOpacity: 0.6\n            })\n          }\n          lastTooltip = polygon.bindTooltip(createTooltipHTML(cell, this.attributeValue, translations, currencySymbol, this), {\n            permanent: false,\n            direction: 'top',\n            className: 'custom-tooltip-container',\n            offset: [0, -15]\n          }).openTooltip()\n\n          // Highlight the containing polygon\n          const hexagonCenter = L.latLng(\n            hexBoundary.reduce((sum, point) => sum + point[0], 0) / hexBoundary.length,\n            hexBoundary.reduce((sum, point) => sum + point[1], 0) / hexBoundary.length\n          )\n          this.highlightPolygonFromHexagon(hexagonCenter, hexBoundary)\n        })\n\n        polygon.on('mouseout', () => {\n          if (polygon !== this.selectedPolygon) {\n            polygon.setStyle({\n              color: 'none',\n              weight: 2,\n              fillOpacity: 0.4\n            })\n          }\n\n          // Reset the containing polygon highlight\n          const hexagonCenter = L.latLng(\n            hexBoundary.reduce((sum, point) => sum + point[0], 0) / hexBoundary.length,\n            hexBoundary.reduce((sum, point) => sum + point[1], 0) / hexBoundary.length\n          )\n          this.resetPolygonHighlightFromHexagon(hexagonCenter, hexBoundary)\n        })\n      }\n\n      allBounds.extend(hexBoundary)\n    })\n\n    // Fit map bounds\n    if (allBounds.isValid() && !isPreview) {\n      map.fitBounds(allBounds)\n    } else if (isPreview) {\n      this.centerMapOnDensestArea(map, obj)\n    } else {\n      map.fitBounds(obj.getBounds())\n      map.zoomIn(2)\n    }\n\n    this.polygonLayer.addTo(map)\n    this.hexagonLayer.addTo(map)\n  }\n\n  centerMapOnDensestArea(map, obj) {\n    // Find the center point with the highest concentration of hexagons\n    const hexagonCenters = this.h3DataValue.map(cell => {\n      const boundary = cellToBoundary(cell.h3Index, false)\n      return L.latLng(\n        boundary.reduce((sum, point) => sum + point[0], 0) / boundary.length,\n        boundary.reduce((sum, point) => sum + point[1], 0) / boundary.length\n      )\n    })\n\n    // Create a grid to count hexagons in each area\n    const gridSize = 0.02\n    const grid = {}\n\n    hexagonCenters.forEach(center => {\n      const key = `${Math.floor(center.lat / gridSize)},${Math.floor(center.lng / gridSize)}`\n      grid[key] = (grid[key] || 0) + 1\n    })\n\n    // Find the grid cell with the most hexagons\n    let maxCount = 0\n    let densestArea = null\n\n    Object.entries(grid).forEach(([key, count]) => {\n      if (count > maxCount) {\n        maxCount = count\n        densestArea = key\n      }\n    })\n\n    if (densestArea) {\n      const [lat, lng] = densestArea.split(',').map(n => (parseInt(n) + 0.5) * gridSize)\n      map.setView([lat, lng], 13)\n    } else {\n      // Fallback to original behavior if no hexagons found\n      map.fitBounds(obj.getBounds())\n      map.setZoom(13)\n    }\n  }\n}", "// @ts-nocheck\n\nvar libh3 = (\nfunction(libh3) {\n  libh3 = libh3 || {};\n\nvar Module=typeof libh3!==\"undefined\"?libh3:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram=\"./this.program\";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;var scriptDirectory=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!==\"undefined\" && document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf(\"blob:\")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf(\"/\")+1)}else{scriptDirectory=\"\"}read_=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,false);xhr.responseType=\"arraybuffer\";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open(\"GET\",url,true);xhr.responseType=\"arraybuffer\";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};setWindowTitle=function(title){document.title=title}}else{}var out=Module[\"print\"]||console.log.bind(console);var err=Module[\"printErr\"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module[\"arguments\"])arguments_=Module[\"arguments\"];if(Module[\"thisProgram\"])thisProgram=Module[\"thisProgram\"];if(Module[\"quit\"])quit_=Module[\"quit\"];var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;if(end>_emscripten_get_heap_size()){abort()}HEAP32[DYNAMICTOP_PTR>>2]=end;return ret}function getNativeTypeSize(type){switch(type){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(type[type.length-1]===\"*\"){return 4}else if(type[0]===\"i\"){var bits=parseInt(type.substr(1));assert(bits%8===0,\"getNativeTypeSize invalid bits \"+bits+\", type \"+type);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module[\"dynCall_\"+sig].apply(null,[ptr].concat(args))}else{return Module[\"dynCall_\"+sig].call(null,ptr)}}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var getTempRet0=function(){return tempRet0};var GLOBAL_BASE=8;var wasmBinary;if(Module[\"wasmBinary\"])wasmBinary=Module[\"wasmBinary\"];var noExitRuntime;if(Module[\"noExitRuntime\"])noExitRuntime=Module[\"noExitRuntime\"];function setValue(ptr,value,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":HEAP8[ptr>>0]=value;break;case\"i8\":HEAP8[ptr>>0]=value;break;case\"i16\":HEAP16[ptr>>1]=value;break;case\"i32\":HEAP32[ptr>>2]=value;break;case\"i64\":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\"float\":HEAPF32[ptr>>2]=value;break;case\"double\":HEAPF64[ptr>>3]=value;break;default:abort(\"invalid type for setValue: \"+type)}}function getValue(ptr,type,noSafe){type=type||\"i8\";if(type.charAt(type.length-1)===\"*\")type=\"i32\";switch(type){case\"i1\":return HEAP8[ptr>>0];case\"i8\":return HEAP8[ptr>>0];case\"i16\":return HEAP16[ptr>>1];case\"i32\":return HEAP32[ptr>>2];case\"i64\":return HEAP32[ptr>>2];case\"float\":return HEAPF32[ptr>>2];case\"double\":return HEAPF64[ptr>>3];default:abort(\"invalid type for getValue: \"+type)}return null}var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort(\"Assertion failed: \"+text)}}function getCFunc(ident){var func=Module[\"_\"+ident];assert(func,\"Cannot call unknown function \"+ident+\", make sure it is exported\");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={\"string\":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},\"array\":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType===\"string\")return UTF8ToString(ret);if(returnType===\"boolean\")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every(function(type){return type===\"number\"});var numericRet=returnType!==\"string\";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}}var ALLOC_NONE=3;var UTF8Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf8\"):undefined;function UTF8ArrayToString(u8Array,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(u8Array[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var str=\"\";while(idx<endPtr){var u0=u8Array[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|u8Array[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):\"\"}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!==\"undefined\"?new TextDecoder(\"utf-16le\"):undefined;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module[\"HEAP8\"]=HEAP8=new Int8Array(buf);Module[\"HEAP16\"]=HEAP16=new Int16Array(buf);Module[\"HEAP32\"]=HEAP32=new Int32Array(buf);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(buf);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(buf);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(buf);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(buf);Module[\"HEAPF64\"]=HEAPF64=new Float64Array(buf)}var STACK_BASE=24160,DYNAMIC_BASE=5267040,DYNAMICTOP_PTR=24128;var INITIAL_TOTAL_MEMORY=Module[\"TOTAL_MEMORY\"]||33554432;if(Module[\"buffer\"]){buffer=Module[\"buffer\"]}else{buffer=new ArrayBuffer(INITIAL_TOTAL_MEMORY)}INITIAL_TOTAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback==\"function\"){callback();continue}var func=callback.func;if(typeof func===\"number\"){if(callback.arg===undefined){Module[\"dynCall_v\"](func)}else{Module[\"dynCall_vi\"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module[\"monitorRunDependencies\"]){Module[\"monitorRunDependencies\"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\"preloadedImages\"]={};Module[\"preloadedAudios\"]={};var memoryInitializer=null;var dataURIPrefix=\"data:application/octet-stream;base64,\";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}var tempDouble;var tempI64;memoryInitializer=\"data:application/octet-stream;base64,AAAAAAAAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAAAQAAAAQAAAADAAAABgAAAAUAAAACAAAAAAAAAAIAAAADAAAAAQAAAAQAAAAGAAAAAAAAAAUAAAADAAAABgAAAAQAAAAFAAAAAAAAAAEAAAACAAAABAAAAAUAAAAGAAAAAAAAAAIAAAADAAAAAQAAAAUAAAACAAAAAAAAAAEAAAADAAAABgAAAAQAAAAGAAAAAAAAAAUAAAACAAAAAQAAAAQAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAACAAAAAAAAAAEAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAYAAAAAAAAABQAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAAAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAAAAAAAQAAAAMAAAAEAAAABQAAAAYAAAAAAAAAAQAAAAIAAAAEAAAABQAAAAYAAAAAAAAAAQAAAAIAAAADAAAABQAAAAYAAAAAAAAAAQAAAAIAAAADAAAABAAAAAYAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAYAAAAAAAAAAwAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAFAAAABAAAAAAAAAABAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAgAAAAQAAAADAAAACAAAAAEAAAAHAAAABgAAAAkAAAAAAAAAAwAAAAIAAAACAAAA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AAAAAAAAAAAFAAAAAQAAAAAAAAAAAAAAAQAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAADAAAABQAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAEAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAD/////AwAAAAAAAAAFAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAQAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAA/////wMAAAAAAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAA/////wMAAAAAAAAABQAAAAIAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAD/////AwAAAAAAAAAFAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAAAAAD/////AwAAAAAAAAAFAAAAAgAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAFAAAAAAAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAwAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAUAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAFAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAA/////wMAAAAAAAAABQAAAAIAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAUAAAABAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABAAAAAUAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAIAAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAAAAAAUAAAAFAAAAAAAAAAAAAAD/////AQAAAAAAAAADAAAABAAAAAIAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAUAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAEAAAD//////////wEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAACAAAAAAAAAAAAAAABAAAAAgAAAAYAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAAAAAAAAAAAAQAAAAEAAAAFAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAACAAAAAAAAAAAAAAABAAAAAwAAAAcAAAAGAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAABwAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAADgAAAAIAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAMAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAIAAAAAAAAAAAAAAAEAAAAEAAAACAAAAAoAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAACQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAgAAAAAAAAAAAAAAAQAAAAsAAAAPAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAIAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAgAAAAAAAAAAAAAAAQAAAAwAAAAQAAAADAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAADwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAAAAAAAAAAABAAAACgAAABMAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAACQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAIAAAAAAAAAAAAAAAEAAAANAAAAEQAAAA0AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAATAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAACAAAAAAAAAAAAAAABAAAADgAAABIAAAAPAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAADwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEwAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAABEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABIAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAATAAAAAgAAAAAAAAAAAAAAAQAAAP//////////EwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAASAAAAAAAAABgAAAAAAAAAIQAAAAAAAAAeAAAAAAAAACAAAAADAAAAMQAAAAEAAAAwAAAAAwAAADIAAAADAAAACAAAAAAAAAAFAAAABQAAAAoAAAAFAAAAFgAAAAAAAAAQAAAAAAAAABIAAAAAAAAAKQAAAAEAAAAhAAAAAAAAAB4AAAAAAAAABAAAAAAAAAAAAAAABQAAAAIAAAAFAAAADwAAAAEAAAAIAAAAAAAAAAUAAAAFAAAAHwAAAAEAAAAWAAAAAAAAABAAAAAAAAAAAgAAAAAAAAAGAAAAAAAAAA4AAAAAAAAACgAAAAAAAAALAAAAAAAAABEAAAADAAAAGAAAAAEAAAAXAAAAAwAAABkAAAADAAAAAAAAAAAAAAABAAAABQAAAAkAAAAFAAAABQAAAAAAAAACAAAAAAAAAAYAAAAAAAAAEgAAAAEAAAAKAAAAAAAAAAsAAAAAAAAABAAAAAEAAAADAAAABQAAAAcAAAAFAAAACAAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAEAAAAAEAAAAFAAAAAAAAAAIAAAAAAAAABwAAAAAAAAAVAAAAAAAAACYAAAAAAAAACQAAAAAAAAATAAAAAAAAACIAAAADAAAADgAAAAEAAAAUAAAAAwAAACQAAAADAAAAAwAAAAAAAAANAAAABQAAAB0AAAAFAAAAAQAAAAAAAAAHAAAAAAAAABUAAAAAAAAABgAAAAEAAAAJAAAAAAAAABMAAAAAAAAABAAAAAIAAAAMAAAA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Zhu25b633D8c1YgmzowSQNM25BRKWARArGS08/lNxD+LFssHwmMRQLC5aNcxBgJABL9HT0WRF0CjCmJmOGEOQHsuaVzMP/s/TWJCaGGwBUCeu1PAPLzjP9nqN9DZOBNAKE4JcydbCkCGtbd1qjPzP8dgm9U8jhVAtPeKTkVwDkCeCLss5l37P401XMPLmBdAFd29VMVQDUBg0yA55h75Pz6odcYLCRdApBM4rBrkAkDyAVWgQxbRP4XDMnK20hFAymLlF7EmzD8GUgo9XBHlP3lbK7T9COc/k+OhPthhy7+YGEpnrOvCPzBFhLs15u4/epbqB6H4uz9IuuLF5svev6lzLKY31es/CaQ0envF5z8ZY0xlUADXv7zaz7HYEuI/CfbK1sn16T8uAQfWwxLWPzKn/YuFN94/5KdbC1AFu793fyCSnlfvPzK2y4doAMY/NRg5t1/X6b/shq4QJaHDP5yNIAKPOeI/vpn7BSE30r/X4YQrO6nrv78Ziv/Thto/DqJ1Y6+y5z9l51NaxFrlv8QlA65HOLS/86dxiEc96z+Hj0+LFjneP6LzBZ8LTc2/DaJ1Y6+y579l51NaxFrlP8QlA65HOLQ/8qdxiEc967+Jj0+LFjnev6LzBZ8LTc0/1qdbC1AFuz93fyCSnlfvvzK2y4doAMa/NRg5t1/X6T/vhq4QJaHDv5yNIAKPOeK/wJn7BSE30j/W4YQrO6nrP78Ziv/Thtq/CaQ0envF578XY0xlUADXP7zaz7HYEuK/CvbK1sn16b8rAQfWwxLWvzKn/YuFN96/zWLlF7EmzL8GUgo9XBHlv3lbK7T9COe/kOOhPthhyz+cGEpnrOvCvzBFhLs15u6/c5bqB6H4u79IuuLF5sveP6lzLKY31eu/AQAAAP////8HAAAA/////zEAAAD/////VwEAAP////9hCQAA/////6dBAAD/////kcsBAP/////3kAwA/////8H2VwAAAAAAAAAAAAAAAAACAAAA/////w4AAAD/////YgAAAP////+uAgAA/////8ISAAD/////ToMAAP////8ilwMA/////+4hGQD/////gu2vAAAAAAAAAAAAAAAAAAAAAAACAAAA//////////8BAAAAAwAAAP//////////////////////////////////////////////////////////////////////////AQAAAAAAAAACAAAA////////////////AwAAAP//////////////////////////////////////////////////////////////////////////AQAAAAAAAAACAAAA////////////////AwAAAP//////////////////////////////////////////////////////////////////////////AQAAAAAAAAACAAAA////////////////AwAAAP//////////////////////////////////////////////////////////AgAAAP//////////AQAAAAAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD/////////////////////AQAAAP///////////////wIAAAD///////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP///////////////////////////////wIAAAD///////////////8BAAAA/////////////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAABAAAA//////////8CAAAA//////////////////////////////////////////////////////////8DAAAA////////////////AgAAAAAAAAABAAAA//////////////////////////////////////////////////////////////////////////8DAAAA////////////////AgAAAAAAAAABAAAA//////////////////////////////////////////////////////////////////////////8DAAAA////////////////AgAAAAAAAAABAAAA//////////////////////////////////////////////////////////////////////////8DAAAAAQAAAP//////////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAACAAAAAAAAAAIAAAABAAAAAQAAAAIAAAACAAAAAAAAAAUAAAAFAAAAAAAAAAIAAAACAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAEAAAACAAAAAgAAAAIAAAAAAAAABQAAAAYAAAAAAAAAAgAAAAIAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAACAAAAAQAAAAMAAAACAAAAAgAAAAAAAAAFAAAABwAAAAAAAAACAAAAAgAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAIAAAABAAAABAAAAAIAAAACAAAAAAAAAAUAAAAIAAAAAAAAAAIAAAACAAAAAwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAIAAAAAAAAAAgAAAAEAAAAAAAAAAgAAAAIAAAAAAAAABQAAAAkAAAAAAAAAAgAAAAIAAAADAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAIAAAAAAAAAAwAAAA4AAAACAAAAAAAAAAIAAAADAAAAAAAAAAAAAAACAAAAAgAAAAMAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAACAAAAAgAAAAAAAAADAAAACgAAAAIAAAAAAAAAAgAAAAMAAAABAAAAAAAAAAIAAAACAAAAAwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAIAAAACAAAAAAAAAAMAAAALAAAAAgAAAAAAAAACAAAAAwAAAAIAAAAAAAAAAgAAAAIAAAADAAAACAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAAgAAAAIAAAAAAAAAAwAAAAwAAAACAAAAAAAAAAIAAAADAAAAAwAAAAAAAAACAAAAAgAAAAMAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAACAAAAAgAAAAAAAAADAAAADQAAAAIAAAAAAAAAAgAAAAMAAAAEAAAAAAAAAAIAAAACAAAAAwAAAAoAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAIAAAACAAAAAAAAAAMAAAAGAAAAAgAAAAAAAAACAAAAAwAAAA8AAAAAAAAAAgAAAAIAAAADAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAgAAAAIAAAAAAAAAAwAAAAcAAAACAAAAAAAAAAIAAAADAAAAEAAAAAAAAAACAAAAAgAAAAMAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAACAAAAAgAAAAAAAAADAAAACAAAAAIAAAAAAAAAAgAAAAMAAAARAAAAAAAAAAIAAAACAAAAAwAAAA0AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAIAAAACAAAAAAAAAAMAAAAJAAAAAgAAAAAAAAACAAAAAwAAABIAAAAAAAAAAgAAAAIAAAADAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAgAAAAIAAAAAAAAAAwAAAAUAAAACAAAAAAAAAAIAAAADAAAAEwAAAAAAAAACAAAAAgAAAAMAAAAPAAAAAAAAAAAAAAAAAAAAAAAAABAAAAACAAAAAAAAAAIAAAABAAAAEwAAAAIAAAACAAAAAAAAAAUAAAAKAAAAAAAAAAIAAAACAAAAAwAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAIAAAAAAAAAAgAAAAEAAAAPAAAAAgAAAAIAAAAAAAAABQAAAAsAAAAAAAAAAgAAAAIAAAADAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAASAAAAAgAAAAAAAAACAAAAAQAAABAAAAACAAAAAgAAAAAAAAAFAAAADAAAAAAAAAACAAAAAgAAAAMAAAASAAAAAAAAAAAAAAAAAAAAAAAAABMAAAACAAAAAAAAAAIAAAABAAAAEQAAAAIAAAACAAAAAAAAAAUAAAANAAAAAAAAAAIAAAACAAAAAwAAABMAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAIAAAAAAAAAAgAAAAEAAAASAAAAAgAAAAIAAAAAAAAABQAAAA4AAAAAAAAAAgAAAAIAAAADAAAAAgAAAAEAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAEAAAACAAAAAQAAAAAAAAACAAAAAAAAAAUAAAAEAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAFAAAABAAAAAAAAAABAAAABQAAAAQAAAAAAAAABQAAAAAAAAACAAAAAQAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAQAAAAIAAAABAAAAAAAAAAIAAAACAAAAAAAAAAEAAAAAAAAAAAAAAAUAAAAEAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAFAAAABAAAAAAAAAABAAAABQAAAAQAAAAAAAAABQAAAAUAAAAAAAAAAQAAAAAAAAAAAAAAOgehWlKfUEEz1zLi+JsiQa2og3wcMfVAWCbHorc0yEDi+Yn/Y6mbQJ11/mfsnG9At6bnG4UQQkBvMCQWKqUUQJVmwwswmOc/3hVgVBL3uj//qqOEOdGOPw/WDN4gnGE/H3ANkCUgND+AA8btKgAHPwTXBqJVSdo+XfRQAqsKrj4fc+zLYbSPQklEmCZHv2FCUP+uDso1NEKYtPhwphUHQptxnyFXYdpB7CddZAMmrkGAt1AxSTqBQUibBVdTsFNBSuX3MV+AJkFocv82SLf5QAqmgj7AY81A23VDSEnLoEDGEJVSeDFzQDYrqvBk70VA8U157pcRGUBWfEF+ZKbsP7KBdLHZTpFAqKYk69AqekDbeGY41MdjQD8AZzHK501A1vcrrjubNkD5LnquvBYhQCbiRRD71QlAqt72EbOH8z8Eu+jL1YbdP4uaox/xUcY/abedg1XfsD+BsUdzJ4KZP5wE9YFySIM/rW1kAKMpbT+rZFthVRhWPy4PKlXIs0A/qMZLlwDnMEHByqEF0I0ZQQYSFD8lUQNBPpY+dFs07UAH8BZImBPWQN9RY0I0sMBA2T7kLfc6qUByFYvfhBKTQMq+0Mis1XxA0XQbeQXMZUBJJ5aEGXpQQP7/SY0a6ThAaMD92b/UIkAs8s8yqXoMQNIegOvCk/U/aOi7NZJP4D8AAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////////////////wAAAAD/////AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA/////wAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAP////8AAAAABQAAAAAAAAAAAAAAAAAAAAAAAAD/////BQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////////////////wAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAAAAAABAAAAAAAAAAUAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAEAAQAAAQEAAAAAAAEAAAABAAAAAQABAAAAAAAAAAAAAAAAAAAAAAcAAAAHAAAAAQAAAAIAAAAEAAAAAwAAAAAAAAAAAAAABwAAAAMAAAABAAAAAgAAAAUAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAAAAQAAAAMAAAAOAAAABgAAAAsAAAACAAAABwAAAAEAAAAYAAAABQAAAAoAAAABAAAABgAAAAAAAAAmAAAABwAAAAwAAAADAAAACAAAAAIAAAAxAAAACQAAAA4AAAAAAAAABQAAAAQAAAA6AAAACAAAAA0AAAAEAAAACQAAAAMAAAA/AAAACwAAAAYAAAAPAAAACgAAABAAAABIAAAADAAAAAcAAAAQAAAACwAAABEAAABTAAAACgAAAAUAAAATAAAADgAAAA8AAABhAAAADQAAAAgAAAARAAAADAAAABIAAABrAAAADgAAAAkAAAASAAAADQAAABMAAAB1AAAADwAAABMAAAARAAAAEgAAABAAAAAGAAAAAgAAAAMAAAAFAAAABAAAAAAAAAAAAAAAAAAAAAYAAAACAAAAAwAAAAEAAAAFAAAABAAAAAAAAAAAAAAABwAAAAUAAAADAAAABAAAAAEAAAAAAAAAAgAAAAAAAAACAAAAAwAAAAEAAAAFAAAABAAAAAYAAAAAAAAAAAAAAGFsZ29zLmMAaDNOZWlnaGJvclJvdGF0aW9ucwBjb29yZGlqay5jAF91cEFwN0NoZWNrZWQAX3VwQXA3ckNoZWNrZWQAZGlyZWN0ZWRFZGdlLmMAZGlyZWN0ZWRFZGdlVG9Cb3VuZGFyeQBhZGphY2VudEZhY2VEaXJbdG1wRmlqay5mYWNlXVtmaWprLmZhY2VdID09IEtJAGZhY2VpamsuYwBfZmFjZUlqa1BlbnRUb0NlbGxCb3VuZGFyeQBhZGphY2VudEZhY2VEaXJbY2VudGVySUpLLmZhY2VdW2ZhY2UyXSA9PSBLSQBfZmFjZUlqa1RvQ2VsbEJvdW5kYXJ5AGgzSW5kZXguYwBjb21wYWN0Q2VsbHMAbGF0TG5nVG9DZWxsAGNlbGxUb0NoaWxkUG9zAHZhbGlkYXRlQ2hpbGRQb3MAbGF0TG5nLmMAY2VsbEFyZWFSYWRzMgBwb2x5Z29uLT5uZXh0ID09IE5VTEwAbGlua2VkR2VvLmMAYWRkTmV3TGlua2VkUG9seWdvbgBuZXh0ICE9IE5VTEwAbG9vcCAhPSBOVUxMAGFkZE5ld0xpbmtlZExvb3AAcG9seWdvbi0+Zmlyc3QgPT0gTlVMTABhZGRMaW5rZWRMb29wAGNvb3JkICE9IE5VTEwAYWRkTGlua2VkQ29vcmQAbG9vcC0+Zmlyc3QgPT0gTlVMTABpbm5lckxvb3BzICE9IE5VTEwAbm9ybWFsaXplTXVsdGlQb2x5Z29uAGJib3hlcyAhPSBOVUxMAGNhbmRpZGF0ZXMgIT0gTlVMTABmaW5kUG9seWdvbkZvckhvbGUAY2FuZGlkYXRlQkJveGVzICE9IE5VTEwAcmV2RGlyICE9IElOVkFMSURfRElHSVQAbG9jYWxpai5jAGNlbGxUb0xvY2FsSWprAGJhc2VDZWxsICE9IG9yaWdpbkJhc2VDZWxsACEob3JpZ2luT25QZW50ICYmIGluZGV4T25QZW50KQBiYXNlQ2VsbCA9PSBvcmlnaW5CYXNlQ2VsbABiYXNlQ2VsbCAhPSBJTlZBTElEX0JBU0VfQ0VMTABsb2NhbElqa1RvQ2VsbAAhX2lzQmFzZUNlbGxQZW50YWdvbihiYXNlQ2VsbCkAYmFzZUNlbGxSb3RhdGlvbnMgPj0gMABncmlkUGF0aENlbGxzADAAdmVydGV4LmMAY2VsbFRvVmVydGV4AGdyYXBoLT5idWNrZXRzICE9IE5VTEwAdmVydGV4R3JhcGguYwBpbml0VmVydGV4R3JhcGgAbm9kZSAhPSBOVUxMAGFkZFZlcnRleE5vZGU=\";var tempDoublePtr=24144;function demangle(func){return func}function demangleAll(text){var regex=/\\b__Z[\\w\\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+\" [\"+x+\"]\"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return\"(no stack trace available)\"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module[\"extraStackTrace\"])js+=\"\\n\"+Module[\"extraStackTrace\"]();return demangleAll(js)}function ___assert_fail(condition,filename,line,func){abort(\"Assertion failed: \"+UTF8ToString(condition)+\", at: \"+[filename?UTF8ToString(filename):\"unknown filename\",line,func?UTF8ToString(func):\"unknown function\"])}function _emscripten_get_heap_size(){return HEAP8.length}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest)}function ___setErrNo(value){if(Module[\"___errno_location\"])HEAP32[Module[\"___errno_location\"]()>>2]=value;return value}function abortOnCannotGrowMemory(requestedSize){abort(\"OOM\")}function emscripten_realloc_buffer(size){try{var newBuffer=new ArrayBuffer(size);if(newBuffer.byteLength!=size)return;new Int8Array(newBuffer).set(HEAP8);_emscripten_replace_memory(newBuffer);updateGlobalBufferAndViews(newBuffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=_emscripten_get_heap_size();var PAGE_MULTIPLE=16777216;var LIMIT=2147483648-PAGE_MULTIPLE;if(requestedSize>LIMIT){return false}var MIN_TOTAL_MEMORY=16777216;var newSize=Math.max(oldSize,MIN_TOTAL_MEMORY);while(newSize<requestedSize){if(newSize<=536870912){newSize=alignUp(2*newSize,PAGE_MULTIPLE)}else{newSize=Math.min(alignUp((3*newSize+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=emscripten_realloc_buffer(newSize);if(!replacement){return false}return true}var ASSERTIONS=false;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,\"Character code \"+chr+\" (\"+String.fromCharCode(chr)+\")  at offset \"+i+\" not in 0x00-0xFF.\")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join(\"\")}var decodeBase64=typeof atob===\"function\"?atob:function(input){var keyStr=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";var output=\"\";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output};function intArrayFromBase64(s){try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error(\"Converting base64 string to bytes failed.\")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var asmGlobalArg={\"Math\":Math,\"Int8Array\":Int8Array,\"Int32Array\":Int32Array,\"Uint8Array\":Uint8Array,\"Float32Array\":Float32Array,\"Float64Array\":Float64Array};var asmLibraryArg={\"a\":abort,\"b\":setTempRet0,\"c\":getTempRet0,\"d\":___assert_fail,\"e\":___setErrNo,\"f\":_emscripten_get_heap_size,\"g\":_emscripten_memcpy_big,\"h\":_emscripten_resize_heap,\"i\":abortOnCannotGrowMemory,\"j\":demangle,\"k\":demangleAll,\"l\":emscripten_realloc_buffer,\"m\":jsStackTrace,\"n\":stackTrace,\"o\":tempDoublePtr,\"p\":DYNAMICTOP_PTR};// EMSCRIPTEN_START_ASM\nvar asm=(/** @suppress {uselessCode} */ function(global,env,buffer) {\n\"almost asm\";var a=new global.Int8Array(buffer),b=new global.Int32Array(buffer),c=new global.Uint8Array(buffer),d=new global.Float32Array(buffer),e=new global.Float64Array(buffer),f=env.o|0,g=env.p|0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=global.Math.floor,q=global.Math.abs,r=global.Math.sqrt,s=global.Math.pow,t=global.Math.cos,u=global.Math.sin,v=global.Math.tan,w=global.Math.acos,x=global.Math.asin,y=global.Math.atan,z=global.Math.atan2,A=global.Math.ceil,B=global.Math.imul,C=global.Math.min,D=global.Math.max,E=global.Math.clz32,F=env.a,G=env.b,H=env.c,I=env.d,J=env.e,K=env.f,L=env.g,M=env.h,N=env.i,O=env.j,P=env.k,Q=env.l,R=env.m,S=env.n,T=24160,U=5267040,V=0.0;function W(newBuffer){a=new Int8Array(newBuffer);c=new Uint8Array(newBuffer);b=new Int32Array(newBuffer);d=new Float32Array(newBuffer);e=new Float64Array(newBuffer);buffer=newBuffer;return true}\n// EMSCRIPTEN_START_FUNCS\nfunction X(a){a=a|0;var b=0;b=T;T=T+a|0;T=T+15&-16;return b|0}function Y(){return T|0}function Z(a){a=a|0;T=a}function _(a,b){a=a|0;b=b|0;T=a;U=b}function $(a,c){a=a|0;c=c|0;var d=0,e=0,f=0;if((a|0)<0){c=2;return c|0}if((a|0)>13780509){c=ic(15,c)|0;return c|0}else{d=((a|0)<0)<<31>>31;f=rd(a|0,d|0,3,0)|0;e=H()|0;d=ld(a|0,d|0,1,0)|0;d=rd(f|0,e|0,d|0,H()|0)|0;d=ld(d|0,H()|0,1,0)|0;a=H()|0;b[c>>2]=d;b[c+4>>2]=a;c=0;return c|0}return 0}function aa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ba(a,b,c,d,0)|0}function ba(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;j=T;T=T+16|0;h=j;if(!(ca(a,c,d,e,f)|0)){e=0;T=j;return e|0}do if((d|0)>=0){if((d|0)>13780509){g=ic(15,h)|0;if(g|0)break;i=h;h=b[i>>2]|0;i=b[i+4>>2]|0}else{g=((d|0)<0)<<31>>31;k=rd(d|0,g|0,3,0)|0;i=H()|0;g=ld(d|0,g|0,1,0)|0;g=rd(k|0,i|0,g|0,H()|0)|0;g=ld(g|0,H()|0,1,0)|0;i=H()|0;b[h>>2]=g;b[h+4>>2]=i;h=g}Bd(e|0,0,h<<3|0)|0;if(f|0){Bd(f|0,0,h<<2|0)|0;g=da(a,c,d,e,f,h,i,0)|0;break}g=kd(h,4)|0;if(!g)g=13;else{k=da(a,c,d,e,g,h,i,0)|0;jd(g);g=k}}else g=2;while(0);k=g;T=j;return k|0}function ca(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=T;T=T+16|0;o=q;p=q+8|0;n=o;b[n>>2]=a;b[n+4>>2]=c;if((d|0)<0){p=2;T=q;return p|0}g=e;b[g>>2]=a;b[g+4>>2]=c;g=(f|0)!=0;if(g)b[f>>2]=0;if(xb(a,c)|0){p=9;T=q;return p|0}b[p>>2]=0;a:do if((d|0)>=1)if(g){l=1;k=0;m=0;n=1;g=a;while(1){if(!(k|m)){g=ea(g,c,4,p,o)|0;if(g|0)break a;c=o;g=b[c>>2]|0;c=b[c+4>>2]|0;if(xb(g,c)|0){g=9;break a}}g=ea(g,c,b[22384+(m<<2)>>2]|0,p,o)|0;if(g|0)break a;c=o;g=b[c>>2]|0;c=b[c+4>>2]|0;a=e+(l<<3)|0;b[a>>2]=g;b[a+4>>2]=c;b[f+(l<<2)>>2]=n;a=k+1|0;h=(a|0)==(n|0);i=m+1|0;j=(i|0)==6;if(xb(g,c)|0){g=9;break a}n=n+(j&h&1)|0;if((n|0)>(d|0)){g=0;break}else{l=l+1|0;k=h?0:a;m=h?(j?0:i):m}}}else{l=1;k=0;m=0;n=1;g=a;while(1){if(!(k|m)){g=ea(g,c,4,p,o)|0;if(g|0)break a;c=o;g=b[c>>2]|0;c=b[c+4>>2]|0;if(xb(g,c)|0){g=9;break a}}g=ea(g,c,b[22384+(m<<2)>>2]|0,p,o)|0;if(g|0)break a;c=o;g=b[c>>2]|0;c=b[c+4>>2]|0;a=e+(l<<3)|0;b[a>>2]=g;b[a+4>>2]=c;a=k+1|0;h=(a|0)==(n|0);i=m+1|0;j=(i|0)==6;if(xb(g,c)|0){g=9;break a}n=n+(j&h&1)|0;if((n|0)>(d|0)){g=0;break}else{l=l+1|0;k=h?0:a;m=h?(j?0:i):m}}}else g=0;while(0);p=g;T=q;return p|0}function da(a,c,d,e,f,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=T;T=T+16|0;o=q+8|0;p=q;j=td(a|0,c|0,g|0,h|0)|0;l=H()|0;m=e+(j<<3)|0;r=m;s=b[r>>2]|0;r=b[r+4>>2]|0;k=(s|0)==(a|0)&(r|0)==(c|0);if(!((s|0)==0&(r|0)==0|k))do{j=ld(j|0,l|0,1,0)|0;j=sd(j|0,H()|0,g|0,h|0)|0;l=H()|0;m=e+(j<<3)|0;s=m;r=b[s>>2]|0;s=b[s+4>>2]|0;k=(r|0)==(a|0)&(s|0)==(c|0)}while(!((r|0)==0&(s|0)==0|k));j=f+(j<<2)|0;if(k?(b[j>>2]|0)<=(i|0):0){s=0;T=q;return s|0}s=m;b[s>>2]=a;b[s+4>>2]=c;b[j>>2]=i;if((i|0)>=(d|0)){s=0;T=q;return s|0}k=i+1|0;b[o>>2]=0;j=ea(a,c,2,o,p)|0;switch(j|0){case 9:{n=9;break}case 0:{j=p;j=da(b[j>>2]|0,b[j+4>>2]|0,d,e,f,g,h,k)|0;if(!j)n=9;break}default:{}}a:do if((n|0)==9){b[o>>2]=0;j=ea(a,c,3,o,p)|0;switch(j|0){case 9:break;case 0:{j=p;j=da(b[j>>2]|0,b[j+4>>2]|0,d,e,f,g,h,k)|0;if(j|0)break a;break}default:break a}b[o>>2]=0;j=ea(a,c,1,o,p)|0;switch(j|0){case 9:break;case 0:{j=p;j=da(b[j>>2]|0,b[j+4>>2]|0,d,e,f,g,h,k)|0;if(j|0)break a;break}default:break a}b[o>>2]=0;j=ea(a,c,5,o,p)|0;switch(j|0){case 9:break;case 0:{j=p;j=da(b[j>>2]|0,b[j+4>>2]|0,d,e,f,g,h,k)|0;if(j|0)break a;break}default:break a}b[o>>2]=0;j=ea(a,c,4,o,p)|0;switch(j|0){case 9:break;case 0:{j=p;j=da(b[j>>2]|0,b[j+4>>2]|0,d,e,f,g,h,k)|0;if(j|0)break a;break}default:break a}b[o>>2]=0;j=ea(a,c,6,o,p)|0;switch(j|0){case 9:break;case 0:{j=p;j=da(b[j>>2]|0,b[j+4>>2]|0,d,e,f,g,h,k)|0;if(j|0)break a;break}default:break a}s=0;T=q;return s|0}while(0);s=j;T=q;return s|0}function ea(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(d>>>0>6){f=1;return f|0}m=(b[e>>2]|0)%6|0;b[e>>2]=m;if((m|0)>0){g=0;do{d=Sa(d)|0;g=g+1|0}while((g|0)<(b[e>>2]|0))}m=vd(a|0,c|0,45)|0;H()|0;l=m&127;if(l>>>0>121){f=5;return f|0}j=Fb(a,c)|0;g=vd(a|0,c|0,52)|0;H()|0;g=g&15;a:do if(!g)k=8;else{while(1){h=(15-g|0)*3|0;i=vd(a|0,c|0,h|0)|0;H()|0;i=i&7;if((i|0)==7){c=5;break}p=(Lb(g)|0)==0;g=g+-1|0;n=wd(7,0,h|0)|0;c=c&~(H()|0);o=wd(b[(p?432:16)+(i*28|0)+(d<<2)>>2]|0,0,h|0)|0;h=H()|0;d=b[(p?640:224)+(i*28|0)+(d<<2)>>2]|0;a=o|a&~n;c=h|c;if(!d){d=0;break a}if(!g){k=8;break a}}return c|0}while(0);if((k|0)==8){p=b[848+(l*28|0)+(d<<2)>>2]|0;o=wd(p|0,0,45)|0;a=o|a;c=H()|0|c&-1040385;d=b[4272+(l*28|0)+(d<<2)>>2]|0;if((p&127|0)==127){p=wd(b[848+(l*28|0)+20>>2]|0,0,45)|0;c=H()|0|c&-1040385;d=b[4272+(l*28|0)+20>>2]|0;a=Hb(p|a,c)|0;c=H()|0;b[e>>2]=(b[e>>2]|0)+1}}i=vd(a|0,c|0,45)|0;H()|0;i=i&127;b:do if(!(ma(i)|0)){if((d|0)>0){g=0;do{a=Hb(a,c)|0;c=H()|0;g=g+1|0}while((g|0)!=(d|0))}}else{c:do if((Fb(a,c)|0)==1){if((l|0)!=(i|0))if(sa(i,b[7696+(l*28|0)>>2]|0)|0){a=Jb(a,c)|0;h=1;c=H()|0;break}else I(23313,22416,436,22424);switch(j|0){case 3:{a=Hb(a,c)|0;c=H()|0;b[e>>2]=(b[e>>2]|0)+1;h=0;break c}case 5:{a=Jb(a,c)|0;c=H()|0;b[e>>2]=(b[e>>2]|0)+5;h=0;break c}case 0:{p=9;return p|0}default:{p=1;return p|0}}}else h=0;while(0);if((d|0)>0){g=0;do{a=Gb(a,c)|0;c=H()|0;g=g+1|0}while((g|0)!=(d|0))}if((l|0)!=(i|0)){if(!(na(i)|0)){if((h|0)!=0|(Fb(a,c)|0)!=5)break;b[e>>2]=(b[e>>2]|0)+1;break}switch(m&127){case 8:case 118:break b;default:{}}if((Fb(a,c)|0)!=3)b[e>>2]=(b[e>>2]|0)+1}}while(0);b[e>>2]=((b[e>>2]|0)+d|0)%6|0;p=f;b[p>>2]=a;b[p+4>>2]=c;p=0;return p|0}function fa(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;i=T;T=T+16|0;g=i;h=i+8|0;f=(xb(a,c)|0)==0;f=f?1:2;while(1){b[h>>2]=0;k=(ea(a,c,f,h,g)|0)==0;j=g;if(k&((b[j>>2]|0)==(d|0)?(b[j+4>>2]|0)==(e|0):0)){a=4;break}f=f+1|0;if(f>>>0>=7){f=7;a=4;break}}if((a|0)==4){T=i;return f|0}return 0}function ga(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=T;T=T+16|0;n=p;o=p+8|0;m=n;b[m>>2]=a;b[m+4>>2]=c;if(!d){o=e;b[o>>2]=a;b[o+4>>2]=c;o=0;T=p;return o|0}b[o>>2]=0;a:do if(!(xb(a,c)|0)){g=(d|0)>0;if(g){f=0;m=a;do{a=ea(m,c,4,o,n)|0;if(a|0)break a;c=n;m=b[c>>2]|0;c=b[c+4>>2]|0;f=f+1|0;if(xb(m,c)|0){a=9;break a}}while((f|0)<(d|0));l=e;b[l>>2]=m;b[l+4>>2]=c;l=d+-1|0;if(g){k=0;a=1;do{f=22384+(k<<2)|0;if((k|0)==5){h=b[f>>2]|0;g=0;f=a;while(1){a=n;a=ea(b[a>>2]|0,b[a+4>>2]|0,h,o,n)|0;if(a|0)break a;if((g|0)!=(l|0)){j=n;i=b[j>>2]|0;j=b[j+4>>2]|0;a=e+(f<<3)|0;b[a>>2]=i;b[a+4>>2]=j;if(!(xb(i,j)|0))a=f+1|0;else{a=9;break a}}else a=f;g=g+1|0;if((g|0)>=(d|0))break;else f=a}}else{h=n;j=b[f>>2]|0;i=0;f=a;g=b[h>>2]|0;h=b[h+4>>2]|0;while(1){a=ea(g,h,j,o,n)|0;if(a|0)break a;h=n;g=b[h>>2]|0;h=b[h+4>>2]|0;a=e+(f<<3)|0;b[a>>2]=g;b[a+4>>2]=h;a=f+1|0;if(xb(g,h)|0){a=9;break a}i=i+1|0;if((i|0)>=(d|0))break;else f=a}}k=k+1|0}while(k>>>0<6);a=n;h=m;f=b[a>>2]|0;g=c;a=b[a+4>>2]|0}else{h=m;f=m;g=c;a=c}}else{h=e;b[h>>2]=a;b[h+4>>2]=c;h=a;f=a;g=c;a=c}a=(h|0)==(f|0)&(g|0)==(a|0)?0:9}else a=9;while(0);o=a;T=p;return o|0}function ha(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;i=T;T=T+48|0;f=i+16|0;g=i+8|0;h=i;if(d|0){h=15;T=i;return h|0}k=a;j=b[k+4>>2]|0;d=g;b[d>>2]=b[k>>2];b[d+4>>2]=j;Ec(g,f);c=za(f,c,h)|0;if(!c){d=b[g>>2]|0;g=b[a+8>>2]|0;if((g|0)>0){f=b[a+12>>2]|0;c=0;do{d=(b[f+(c<<3)>>2]|0)+d|0;c=c+1|0}while((c|0)<(g|0))}c=h;f=b[c>>2]|0;c=b[c+4>>2]|0;g=((d|0)<0)<<31>>31;if((c|0)<(g|0)|(c|0)==(g|0)&f>>>0<d>>>0){c=h;b[c>>2]=d;b[c+4>>2]=g;c=g}else d=f;j=ld(d|0,c|0,12,0)|0;k=H()|0;c=h;b[c>>2]=j;b[c+4>>2]=k;c=e;b[c>>2]=j;b[c+4>>2]=k;c=0}k=c;T=i;return k|0}function ia(a,c,d,f,g,h,i){a=a|0;c=c|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0.0,K=0.0,L=0.0,M=0.0;I=T;T=T+64|0;D=I+48|0;E=I+32|0;F=I+24|0;x=I+8|0;y=I;k=b[a>>2]|0;if((k|0)<=0){G=0;T=I;return G|0}z=a+4|0;A=D+8|0;B=E+8|0;C=x+8|0;j=0;v=0;while(1){l=b[z>>2]|0;u=l+(v<<4)|0;b[D>>2]=b[u>>2];b[D+4>>2]=b[u+4>>2];b[D+8>>2]=b[u+8>>2];b[D+12>>2]=b[u+12>>2];if((v|0)==(k+-1|0)){b[E>>2]=b[l>>2];b[E+4>>2]=b[l+4>>2];b[E+8>>2]=b[l+8>>2];b[E+12>>2]=b[l+12>>2]}else{u=l+(v+1<<4)|0;b[E>>2]=b[u>>2];b[E+4>>2]=b[u+4>>2];b[E+8>>2]=b[u+8>>2];b[E+12>>2]=b[u+12>>2]}k=Aa(D,E,f,F)|0;a:do if(!k){l=F;k=b[l>>2]|0;l=b[l+4>>2]|0;if((l|0)>0|(l|0)==0&k>>>0>0){t=0;u=0;b:while(1){M=+e[D>>3];s=md(k|0,l|0,t|0,u|0)|0;L=+(s>>>0)+4294967296.0*+(H()|0);J=+(k>>>0)+4294967296.0*+(l|0);K=+(t>>>0)+4294967296.0*+(u|0);e[x>>3]=M*L/J+ +e[E>>3]*K/J;e[C>>3]=+e[A>>3]*L/J+ +e[B>>3]*K/J;k=Mb(x,f,y)|0;if(k|0){j=k;break}s=y;r=b[s>>2]|0;s=b[s+4>>2]|0;o=td(r|0,s|0,c|0,d|0)|0;m=H()|0;k=i+(o<<3)|0;n=k;l=b[n>>2]|0;n=b[n+4>>2]|0;c:do if((l|0)==0&(n|0)==0){w=k;G=16}else{p=0;q=0;while(1){if((p|0)>(d|0)|(p|0)==(d|0)&q>>>0>c>>>0){j=1;break b}if((l|0)==(r|0)&(n|0)==(s|0))break c;k=ld(o|0,m|0,1,0)|0;o=sd(k|0,H()|0,c|0,d|0)|0;m=H()|0;q=ld(q|0,p|0,1,0)|0;p=H()|0;k=i+(o<<3)|0;n=k;l=b[n>>2]|0;n=b[n+4>>2]|0;if((l|0)==0&(n|0)==0){w=k;G=16;break}}}while(0);if((G|0)==16?(G=0,!((r|0)==0&(s|0)==0)):0){q=w;b[q>>2]=r;b[q+4>>2]=s;q=h+(b[g>>2]<<3)|0;b[q>>2]=r;b[q+4>>2]=s;q=g;q=ld(b[q>>2]|0,b[q+4>>2]|0,1,0)|0;r=H()|0;s=g;b[s>>2]=q;b[s+4>>2]=r}t=ld(t|0,u|0,1,0)|0;u=H()|0;l=F;k=b[l>>2]|0;l=b[l+4>>2]|0;if(!((l|0)>(u|0)|(l|0)==(u|0)&k>>>0>t>>>0)){l=1;break a}}l=0}else l=1}else{l=0;j=k}while(0);v=v+1|0;if(!l){G=21;break}k=b[a>>2]|0;if((v|0)>=(k|0)){j=0;G=21;break}}if((G|0)==21){T=I;return j|0}return 0}function ja(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0;K=T;T=T+112|0;F=K+80|0;j=K+72|0;G=K;I=K+56|0;if(d|0){J=15;T=K;return J|0}k=a+8|0;J=id((b[k>>2]<<5)+32|0)|0;if(!J){J=13;T=K;return J|0}Fc(a,J);D=a;E=b[D+4>>2]|0;d=j;b[d>>2]=b[D>>2];b[d+4>>2]=E;Ec(j,F);d=za(F,c,G)|0;if(!d){d=b[j>>2]|0;g=b[k>>2]|0;if((g|0)>0){h=b[a+12>>2]|0;f=0;do{d=(b[h+(f<<3)>>2]|0)+d|0;f=f+1|0}while((f|0)!=(g|0));f=d}else f=d;d=G;g=b[d>>2]|0;d=b[d+4>>2]|0;h=((f|0)<0)<<31>>31;if((d|0)<(h|0)|(d|0)==(h|0)&g>>>0<f>>>0){d=G;b[d>>2]=f;b[d+4>>2]=h;d=h}else f=g;D=ld(f|0,d|0,12,0)|0;E=H()|0;d=G;b[d>>2]=D;b[d+4>>2]=E;d=0}else{D=0;E=0}if(d|0){jd(J);J=d;T=K;return J|0}f=kd(D,8)|0;if(!f){jd(J);J=13;T=K;return J|0}i=kd(D,8)|0;if(!i){jd(J);jd(f);J=13;T=K;return J|0}B=F;b[B>>2]=0;b[B+4>>2]=0;B=a;C=b[B+4>>2]|0;d=j;b[d>>2]=b[B>>2];b[d+4>>2]=C;d=ia(j,D,E,c,F,f,i)|0;a:do if(!d){b:do if((b[k>>2]|0)>0){h=a+12|0;g=0;while(1){d=ia((b[h>>2]|0)+(g<<3)|0,D,E,c,F,f,i)|0;g=g+1|0;if(d|0)break;if((g|0)>=(b[k>>2]|0))break b}jd(f);jd(i);jd(J);break a}while(0);if((E|0)>0|(E|0)==0&D>>>0>0)Bd(i|0,0,D<<3|0)|0;C=F;B=b[C+4>>2]|0;c:do if((B|0)>0|(B|0)==0&(b[C>>2]|0)>>>0>0){y=f;z=i;A=f;B=i;C=f;d=f;v=f;w=i;x=i;f=i;d:while(1){r=0;s=0;t=0;u=0;g=0;h=0;while(1){i=G;j=i+56|0;do{b[i>>2]=0;i=i+4|0}while((i|0)<(j|0));c=y+(r<<3)|0;k=b[c>>2]|0;c=b[c+4>>2]|0;if(ca(k,c,1,G,0)|0){i=G;j=i+56|0;do{b[i>>2]=0;i=i+4|0}while((i|0)<(j|0));i=kd(7,4)|0;if(i|0){da(k,c,1,G,i,7,0,0)|0;jd(i)}}q=0;while(1){p=G+(q<<3)|0;o=b[p>>2]|0;p=b[p+4>>2]|0;e:do if(!((o|0)==0&(p|0)==0)){l=td(o|0,p|0,D|0,E|0)|0;k=H()|0;i=e+(l<<3)|0;c=i;j=b[c>>2]|0;c=b[c+4>>2]|0;if(!((j|0)==0&(c|0)==0)){m=0;n=0;do{if((m|0)>(E|0)|(m|0)==(E|0)&n>>>0>D>>>0)break d;if((j|0)==(o|0)&(c|0)==(p|0)){i=g;j=h;break e}i=ld(l|0,k|0,1,0)|0;l=sd(i|0,H()|0,D|0,E|0)|0;k=H()|0;n=ld(n|0,m|0,1,0)|0;m=H()|0;i=e+(l<<3)|0;c=i;j=b[c>>2]|0;c=b[c+4>>2]|0}while(!((j|0)==0&(c|0)==0))}if(!((o|0)==0&(p|0)==0)){Pb(o,p,I)|0;if(Gc(a,J,I)|0){n=ld(g|0,h|0,1,0)|0;h=H()|0;m=i;b[m>>2]=o;b[m+4>>2]=p;g=z+(g<<3)|0;b[g>>2]=o;b[g+4>>2]=p;g=n}i=g;j=h}else{i=g;j=h}}else{i=g;j=h}while(0);q=q+1|0;if(q>>>0>=7)break;else{g=i;h=j}}r=ld(r|0,s|0,1,0)|0;s=H()|0;t=ld(t|0,u|0,1,0)|0;u=H()|0;h=F;g=b[h>>2]|0;h=b[h+4>>2]|0;if(!((u|0)<(h|0)|(u|0)==(h|0)&t>>>0<g>>>0))break;else{g=i;h=j}}if((h|0)>0|(h|0)==0&g>>>0>0){g=0;h=0;do{u=y+(g<<3)|0;b[u>>2]=0;b[u+4>>2]=0;g=ld(g|0,h|0,1,0)|0;h=H()|0;u=F;t=b[u+4>>2]|0}while((h|0)<(t|0)|((h|0)==(t|0)?g>>>0<(b[u>>2]|0)>>>0:0))}u=F;b[u>>2]=i;b[u+4>>2]=j;if((j|0)>0|(j|0)==0&i>>>0>0){q=f;r=x;s=C;t=w;u=z;f=v;x=d;w=A;v=q;d=r;C=B;B=s;A=t;z=y;y=u}else break c}jd(A);jd(B);jd(J);d=1;break a}else d=i;while(0);jd(J);jd(f);jd(d);d=0}else{jd(f);jd(i);jd(J)}while(0);J=d;T=K;return J|0}function ka(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;l=T;T=T+176|0;j=l;if((c|0)<1){_c(d,0,0);k=0;T=l;return k|0}i=a;i=vd(b[i>>2]|0,b[i+4>>2]|0,52)|0;H()|0;_c(d,(c|0)>6?c:6,i&15);i=0;while(1){e=a+(i<<3)|0;e=Qb(b[e>>2]|0,b[e+4>>2]|0,j)|0;if(e|0)break;e=b[j>>2]|0;if((e|0)>0){h=0;do{g=j+8+(h<<4)|0;h=h+1|0;e=j+8+(((h|0)%(e|0)|0)<<4)|0;f=dd(d,e,g)|0;if(!f)cd(d,g,e)|0;else bd(d,f)|0;e=b[j>>2]|0}while((h|0)<(e|0))}i=i+1|0;if((i|0)>=(c|0)){e=0;k=13;break}}if((k|0)==13){T=l;return e|0}$c(d);k=e;T=l;return k|0}function la(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;g=T;T=T+32|0;e=g;f=g+16|0;a=ka(a,c,f)|0;if(a|0){d=a;T=g;return d|0}b[d>>2]=0;b[d+4>>2]=0;b[d+8>>2]=0;a=ad(f)|0;if(a|0)do{c=qc(d)|0;do{rc(c,a)|0;h=a+16|0;b[e>>2]=b[h>>2];b[e+4>>2]=b[h+4>>2];b[e+8>>2]=b[h+8>>2];b[e+12>>2]=b[h+12>>2];bd(f,a)|0;a=ed(f,e)|0}while((a|0)!=0);a=ad(f)|0}while((a|0)!=0);$c(f);a=tc(d)|0;if(!a){h=0;T=g;return h|0}sc(d);h=a;T=g;return h|0}function ma(a){a=a|0;if(a>>>0>121){a=0;return a|0}a=b[7696+(a*28|0)+16>>2]|0;return a|0}function na(a){a=a|0;return (a|0)==4|(a|0)==117|0}function oa(a){a=a|0;return b[11120+((b[a>>2]|0)*216|0)+((b[a+4>>2]|0)*72|0)+((b[a+8>>2]|0)*24|0)+(b[a+12>>2]<<3)>>2]|0}function pa(a){a=a|0;return b[11120+((b[a>>2]|0)*216|0)+((b[a+4>>2]|0)*72|0)+((b[a+8>>2]|0)*24|0)+(b[a+12>>2]<<3)+4>>2]|0}function qa(a,c){a=a|0;c=c|0;a=7696+(a*28|0)|0;b[c>>2]=b[a>>2];b[c+4>>2]=b[a+4>>2];b[c+8>>2]=b[a+8>>2];b[c+12>>2]=b[a+12>>2];return}function ra(a,c){a=a|0;c=c|0;var d=0,e=0;if(c>>>0>20){c=-1;return c|0}do if((b[11120+(c*216|0)>>2]|0)!=(a|0))if((b[11120+(c*216|0)+8>>2]|0)!=(a|0))if((b[11120+(c*216|0)+16>>2]|0)!=(a|0))if((b[11120+(c*216|0)+24>>2]|0)!=(a|0))if((b[11120+(c*216|0)+32>>2]|0)!=(a|0))if((b[11120+(c*216|0)+40>>2]|0)!=(a|0))if((b[11120+(c*216|0)+48>>2]|0)!=(a|0))if((b[11120+(c*216|0)+56>>2]|0)!=(a|0))if((b[11120+(c*216|0)+64>>2]|0)!=(a|0))if((b[11120+(c*216|0)+72>>2]|0)!=(a|0))if((b[11120+(c*216|0)+80>>2]|0)!=(a|0))if((b[11120+(c*216|0)+88>>2]|0)!=(a|0))if((b[11120+(c*216|0)+96>>2]|0)!=(a|0))if((b[11120+(c*216|0)+104>>2]|0)!=(a|0))if((b[11120+(c*216|0)+112>>2]|0)!=(a|0))if((b[11120+(c*216|0)+120>>2]|0)!=(a|0))if((b[11120+(c*216|0)+128>>2]|0)!=(a|0))if((b[11120+(c*216|0)+136>>2]|0)==(a|0)){a=2;d=1;e=2}else{if((b[11120+(c*216|0)+144>>2]|0)==(a|0)){a=0;d=2;e=0;break}if((b[11120+(c*216|0)+152>>2]|0)==(a|0)){a=0;d=2;e=1;break}if((b[11120+(c*216|0)+160>>2]|0)==(a|0)){a=0;d=2;e=2;break}if((b[11120+(c*216|0)+168>>2]|0)==(a|0)){a=1;d=2;e=0;break}if((b[11120+(c*216|0)+176>>2]|0)==(a|0)){a=1;d=2;e=1;break}if((b[11120+(c*216|0)+184>>2]|0)==(a|0)){a=1;d=2;e=2;break}if((b[11120+(c*216|0)+192>>2]|0)==(a|0)){a=2;d=2;e=0;break}if((b[11120+(c*216|0)+200>>2]|0)==(a|0)){a=2;d=2;e=1;break}if((b[11120+(c*216|0)+208>>2]|0)==(a|0)){a=2;d=2;e=2;break}else a=-1;return a|0}else{a=2;d=1;e=1}else{a=2;d=1;e=0}else{a=1;d=1;e=2}else{a=1;d=1;e=1}else{a=1;d=1;e=0}else{a=0;d=1;e=2}else{a=0;d=1;e=1}else{a=0;d=1;e=0}else{a=2;d=0;e=2}else{a=2;d=0;e=1}else{a=2;d=0;e=0}else{a=1;d=0;e=2}else{a=1;d=0;e=1}else{a=1;d=0;e=0}else{a=0;d=0;e=2}else{a=0;d=0;e=1}else{a=0;d=0;e=0}while(0);c=b[11120+(c*216|0)+(d*72|0)+(a*24|0)+(e<<3)+4>>2]|0;return c|0}function sa(a,c){a=a|0;c=c|0;if((b[7696+(a*28|0)+20>>2]|0)==(c|0)){c=1;return c|0}c=(b[7696+(a*28|0)+24>>2]|0)==(c|0);return c|0}function ta(a,c){a=a|0;c=c|0;return b[848+(a*28|0)+(c<<2)>>2]|0}function ua(a,c){a=a|0;c=c|0;if((b[848+(a*28|0)>>2]|0)==(c|0)){c=0;return c|0}if((b[848+(a*28|0)+4>>2]|0)==(c|0)){c=1;return c|0}if((b[848+(a*28|0)+8>>2]|0)==(c|0)){c=2;return c|0}if((b[848+(a*28|0)+12>>2]|0)==(c|0)){c=3;return c|0}if((b[848+(a*28|0)+16>>2]|0)==(c|0)){c=4;return c|0}if((b[848+(a*28|0)+20>>2]|0)==(c|0)){c=5;return c|0}else return ((b[848+(a*28|0)+24>>2]|0)==(c|0)?6:7)|0;return 0}function va(){return 122}function wa(a){a=a|0;var c=0,d=0,e=0;c=0;do{wd(c|0,0,45)|0;e=H()|0|134225919;d=a+(c<<3)|0;b[d>>2]=-1;b[d+4>>2]=e;c=c+1|0}while((c|0)!=122);return 0}function xa(a){a=a|0;return +e[a+16>>3]<+e[a+24>>3]|0}function ya(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,f=0.0;c=+e[b>>3];if(!(c>=+e[a+8>>3])){b=0;return b|0}if(!(c<=+e[a>>3])){b=0;return b|0}d=+e[a+16>>3];c=+e[a+24>>3];f=+e[b+8>>3];b=f>=c;a=f<=d&1;if(d<c){if(b)a=1}else if(!b)a=0;b=(a|0)!=0;return b|0}function za(a,c,d){a=a|0;c=c|0;d=d|0;var g=0.0,h=0.0,i=0.0,j=0.0,k=0,l=0,m=0,n=0,o=0,r=0,s=0,t=0,u=0.0,v=0.0;t=T;T=T+288|0;n=t+264|0;o=t+96|0;m=t;k=m;l=k+96|0;do{b[k>>2]=0;k=k+4|0}while((k|0)<(l|0));c=Ub(c,m)|0;if(c|0){s=c;T=t;return s|0}l=m;m=b[l>>2]|0;l=b[l+4>>2]|0;Pb(m,l,n)|0;Qb(m,l,o)|0;j=+ac(n,o+8|0);e[n>>3]=+e[a>>3];l=n+8|0;e[l>>3]=+e[a+16>>3];e[o>>3]=+e[a+8>>3];m=o+8|0;e[m>>3]=+e[a+24>>3];h=+ac(n,o);v=+e[l>>3]-+e[m>>3];i=+q(+v);u=+e[n>>3]-+e[o>>3];g=+q(+u);if(!(v==0.0|u==0.0)?(v=+xd(+i,+g),v=+A(+(h*h/+yd(+(v/+yd(+i,+g)),3.0)/(j*(j*2.59807621135)*.8))),e[f>>3]=v,r=~~v>>>0,s=+q(v)>=1.0?(v>0.0?~~+C(+p(v/4294967296.0),4294967295.0)>>>0:~~+A((v-+(~~v>>>0))/4294967296.0)>>>0):0,!(0==0?(b[f+4>>2]&2146435072|0)==2146435072:0)):0){o=(r|0)==0&(s|0)==0;c=d;b[c>>2]=o?1:r;b[c+4>>2]=o?0:s;c=0}else c=1;s=c;T=t;return s|0}function Aa(a,c,d,g){a=a|0;c=c|0;d=d|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0.0;m=T;T=T+288|0;j=m+264|0;k=m+96|0;l=m;h=l;i=h+96|0;do{b[h>>2]=0;h=h+4|0}while((h|0)<(i|0));d=Ub(d,l)|0;if(d|0){g=d;T=m;return g|0}d=l;h=b[d>>2]|0;d=b[d+4>>2]|0;Pb(h,d,j)|0;Qb(h,d,k)|0;n=+ac(j,k+8|0);n=+A(+(+ac(a,c)/(n*2.0)));e[f>>3]=n;d=~~n>>>0;h=+q(n)>=1.0?(n>0.0?~~+C(+p(n/4294967296.0),4294967295.0)>>>0:~~+A((n-+(~~n>>>0))/4294967296.0)>>>0):0;if(0==0?(b[f+4>>2]&2146435072|0)==2146435072:0){g=1;T=m;return g|0}l=(d|0)==0&(h|0)==0;b[g>>2]=l?1:d;b[g+4>>2]=l?0:h;g=0;T=m;return g|0}function Ba(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;b[a>>2]=c;b[a+4>>2]=d;b[a+8>>2]=e;return}function Ca(a,c){a=a|0;c=c|0;var d=0,f=0,g=0,h=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0.0;n=c+8|0;b[n>>2]=0;k=+e[a>>3];i=+q(+k);l=+e[a+8>>3];j=+q(+l)/.8660254037844386;i=i+j*.5;d=~~i;a=~~j;i=i-+(d|0);j=j-+(a|0);do if(i<.5)if(i<.3333333333333333){b[c>>2]=d;if(j<(i+1.0)*.5){b[c+4>>2]=a;break}else{a=a+1|0;b[c+4>>2]=a;break}}else{o=1.0-i;a=(!(j<o)&1)+a|0;b[c+4>>2]=a;if(o<=j&j<i*2.0){d=d+1|0;b[c>>2]=d;break}else{b[c>>2]=d;break}}else{if(!(i<.6666666666666666)){d=d+1|0;b[c>>2]=d;if(j<i*.5){b[c+4>>2]=a;break}else{a=a+1|0;b[c+4>>2]=a;break}}if(j<1.0-i){b[c+4>>2]=a;if(i*2.0+-1.0<j){b[c>>2]=d;break}}else{a=a+1|0;b[c+4>>2]=a}d=d+1|0;b[c>>2]=d}while(0);do if(k<0.0)if(!(a&1)){m=(a|0)/2|0;m=md(d|0,((d|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;d=~~(+(d|0)-(+(m>>>0)+4294967296.0*+(H()|0))*2.0);b[c>>2]=d;break}else{m=(a+1|0)/2|0;m=md(d|0,((d|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;d=~~(+(d|0)-((+(m>>>0)+4294967296.0*+(H()|0))*2.0+1.0));b[c>>2]=d;break}while(0);m=c+4|0;if(l<0.0){d=d-((a<<1|1|0)/2|0)|0;b[c>>2]=d;a=0-a|0;b[m>>2]=a}f=a-d|0;if((d|0)<0){g=0-d|0;b[m>>2]=f;b[n>>2]=g;b[c>>2]=0;a=f;d=0}else g=0;if((a|0)<0){d=d-a|0;b[c>>2]=d;g=g-a|0;b[n>>2]=g;b[m>>2]=0;a=0}h=d-g|0;f=a-g|0;if((g|0)<0){b[c>>2]=h;b[m>>2]=f;b[n>>2]=0;a=f;d=h;g=0}f=(a|0)<(d|0)?a:d;f=(g|0)<(f|0)?g:f;if((f|0)<=0)return;b[c>>2]=d-f;b[m>>2]=a-f;b[n>>2]=g-f;return}function Da(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0;c=b[a>>2]|0;h=a+4|0;d=b[h>>2]|0;if((c|0)<0){d=d-c|0;b[h>>2]=d;g=a+8|0;b[g>>2]=(b[g>>2]|0)-c;b[a>>2]=0;c=0}if((d|0)<0){c=c-d|0;b[a>>2]=c;g=a+8|0;f=(b[g>>2]|0)-d|0;b[g>>2]=f;b[h>>2]=0;d=0}else{f=a+8|0;g=f;f=b[f>>2]|0}if((f|0)<0){c=c-f|0;b[a>>2]=c;d=d-f|0;b[h>>2]=d;b[g>>2]=0;f=0}e=(d|0)<(c|0)?d:c;e=(f|0)<(e|0)?f:e;if((e|0)<=0)return;b[a>>2]=c-e;b[h>>2]=d-e;b[g>>2]=f-e;return}function Ea(a,c){a=a|0;c=c|0;var d=0.0,f=0;f=b[a+8>>2]|0;d=+((b[a+4>>2]|0)-f|0);e[c>>3]=+((b[a>>2]|0)-f|0)-d*.5;e[c+8>>3]=d*.8660254037844386;return}function Fa(a,c,d){a=a|0;c=c|0;d=d|0;b[d>>2]=(b[c>>2]|0)+(b[a>>2]|0);b[d+4>>2]=(b[c+4>>2]|0)+(b[a+4>>2]|0);b[d+8>>2]=(b[c+8>>2]|0)+(b[a+8>>2]|0);return}function Ga(a,c,d){a=a|0;c=c|0;d=d|0;b[d>>2]=(b[a>>2]|0)-(b[c>>2]|0);b[d+4>>2]=(b[a+4>>2]|0)-(b[c+4>>2]|0);b[d+8>>2]=(b[a+8>>2]|0)-(b[c+8>>2]|0);return}function Ha(a,c){a=a|0;c=c|0;var d=0,e=0;d=B(b[a>>2]|0,c)|0;b[a>>2]=d;d=a+4|0;e=B(b[d>>2]|0,c)|0;b[d>>2]=e;a=a+8|0;c=B(b[a>>2]|0,c)|0;b[a>>2]=c;return}function Ia(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;h=b[a>>2]|0;i=(h|0)<0;e=(b[a+4>>2]|0)-(i?h:0)|0;g=(e|0)<0;f=(g?0-e|0:0)+((b[a+8>>2]|0)-(i?h:0))|0;d=(f|0)<0;a=d?0:f;c=(g?0:e)-(d?f:0)|0;f=(i?0:h)-(g?e:0)-(d?f:0)|0;d=(c|0)<(f|0)?c:f;d=(a|0)<(d|0)?a:d;e=(d|0)>0;a=a-(e?d:0)|0;c=c-(e?d:0)|0;a:do switch(f-(e?d:0)|0){case 0:switch(c|0){case 0:{i=(a|0)==0?0:(a|0)==1?1:7;return i|0}case 1:{i=(a|0)==0?2:(a|0)==1?3:7;return i|0}default:break a}case 1:switch(c|0){case 0:{i=(a|0)==0?4:(a|0)==1?5:7;return i|0}case 1:{if(!a)a=6;else break a;return a|0}default:break a}default:{}}while(0);i=7;return i|0}function Ja(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;h=a+8|0;f=b[h>>2]|0;g=(b[a>>2]|0)-f|0;i=a+4|0;f=(b[i>>2]|0)-f|0;do if(g>>>0>715827881|f>>>0>715827881){d=(g|0)>0;if(d){if((2147483647-g|0)<(g|0)){i=1;return i|0}if((2147483647-(g<<1)|0)<(g|0)){i=1;return i|0}}else{if((-2147483648-g|0)>(g|0)){i=1;return i|0}if((-2147483648-(g<<1)|0)>(g|0)){i=1;return i|0}}c=g*3|0;if((f|0)>0){if((2147483647-f|0)<(f|0)){i=1;return i|0}}else if((-2147483648-f|0)>(f|0)){i=1;return i|0}e=f<<1;if((g|0)>-1){if((c|-2147483648|0)>=(f|0)){i=1;return i|0}}else if((c^-2147483648|0)<(f|0)){i=1;return i|0}if(d){if((2147483647-g|0)<(e|0))c=1;else{d=e;break}return c|0}else{if((-2147483648-g|0)>(e|0))c=1;else{d=e;break}return c|0}}else{d=f<<1;c=g*3|0}while(0);e=hd(+(c-f|0)/7.0)|0;b[a>>2]=e;f=hd(+(d+g|0)/7.0)|0;b[i>>2]=f;b[h>>2]=0;d=(f|0)<(e|0);c=d?e:f;d=d?f:e;do if((d|0)<0){if((c|0)>0){if((c|-2147483648|0)<(d|0)&((d|0)!=-2147483648&(2147483647-c|0)>=(d|0)))break;I(23313,22444,355,22455)}if((d|0)==-2147483648|(-2147483648-c|0)>(d|0))I(23313,22444,355,22455);if((c|0)>-1){if((c|-2147483648|0)<(d|0))break;I(23313,22444,355,22455)}else{if((c^-2147483648|0)>=(d|0))break;I(23313,22444,355,22455)}}while(0);c=f-e|0;if((e|0)<0){d=0-e|0;b[i>>2]=c;b[h>>2]=d;b[a>>2]=0;e=0}else{c=f;d=0}if((c|0)<0){e=e-c|0;b[a>>2]=e;d=d-c|0;b[h>>2]=d;b[i>>2]=0;c=0}g=e-d|0;f=c-d|0;if((d|0)<0){b[a>>2]=g;b[i>>2]=f;b[h>>2]=0;c=f;f=g;d=0}else f=e;e=(c|0)<(f|0)?c:f;e=(d|0)<(e|0)?d:e;if((e|0)<=0){i=0;return i|0}b[a>>2]=f-e;b[i>>2]=c-e;b[h>>2]=d-e;i=0;return i|0}function Ka(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;h=a+8|0;f=b[h>>2]|0;g=(b[a>>2]|0)-f|0;i=a+4|0;f=(b[i>>2]|0)-f|0;do if(g>>>0>715827881|f>>>0>715827881){d=(g|0)>0;if(d){if((2147483647-g|0)<(g|0)){i=1;return i|0}}else if((-2147483648-g|0)>(g|0)){i=1;return i|0}c=g<<1;if((f|0)>0){if((2147483647-f|0)<(f|0)){i=1;return i|0}if((2147483647-(f<<1)|0)<(f|0)){i=1;return i|0}}else{if((-2147483648-f|0)>(f|0)){i=1;return i|0}if((-2147483648-(f<<1)|0)>(f|0)){i=1;return i|0}}e=f*3|0;if(d){if((2147483647-c|0)<(f|0)){i=1;return i|0}}else if((-2147483648-c|0)>(f|0)){i=1;return i|0}if((f|0)>-1){if((e|-2147483648|0)<(g|0)){d=e;break}else c=1;return c|0}else{if((e^-2147483648|0)<(g|0))c=1;else{d=e;break}return c|0}}else{d=f*3|0;c=g<<1}while(0);e=hd(+(c+f|0)/7.0)|0;b[a>>2]=e;f=hd(+(d-g|0)/7.0)|0;b[i>>2]=f;b[h>>2]=0;d=(f|0)<(e|0);c=d?e:f;d=d?f:e;do if((d|0)<0){if((c|0)>0){if((c|-2147483648|0)<(d|0)&((d|0)!=-2147483648&(2147483647-c|0)>=(d|0)))break;I(23313,22444,404,22469)}if((d|0)==-2147483648|(-2147483648-c|0)>(d|0))I(23313,22444,404,22469);if((c|0)>-1){if((c|-2147483648|0)<(d|0))break;I(23313,22444,404,22469)}else{if((c^-2147483648|0)>=(d|0))break;I(23313,22444,404,22469)}}while(0);c=f-e|0;if((e|0)<0){d=0-e|0;b[i>>2]=c;b[h>>2]=d;b[a>>2]=0;e=0}else{c=f;d=0}if((c|0)<0){e=e-c|0;b[a>>2]=e;d=d-c|0;b[h>>2]=d;b[i>>2]=0;c=0}g=e-d|0;f=c-d|0;if((d|0)<0){b[a>>2]=g;b[i>>2]=f;b[h>>2]=0;c=f;f=g;d=0}else f=e;e=(c|0)<(f|0)?c:f;e=(d|0)<(e|0)?d:e;if((e|0)<=0){i=0;return i|0}b[a>>2]=f-e;b[i>>2]=c-e;b[h>>2]=d-e;i=0;return i|0}function La(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;h=a+8|0;d=b[h>>2]|0;c=(b[a>>2]|0)-d|0;i=a+4|0;d=(b[i>>2]|0)-d|0;e=hd(+((c*3|0)-d|0)/7.0)|0;b[a>>2]=e;c=hd(+((d<<1)+c|0)/7.0)|0;b[i>>2]=c;b[h>>2]=0;d=c-e|0;if((e|0)<0){g=0-e|0;b[i>>2]=d;b[h>>2]=g;b[a>>2]=0;c=d;e=0;d=g}else d=0;if((c|0)<0){e=e-c|0;b[a>>2]=e;d=d-c|0;b[h>>2]=d;b[i>>2]=0;c=0}g=e-d|0;f=c-d|0;if((d|0)<0){b[a>>2]=g;b[i>>2]=f;b[h>>2]=0;c=f;f=g;d=0}else f=e;e=(c|0)<(f|0)?c:f;e=(d|0)<(e|0)?d:e;if((e|0)<=0)return;b[a>>2]=f-e;b[i>>2]=c-e;b[h>>2]=d-e;return}function Ma(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;h=a+8|0;d=b[h>>2]|0;c=(b[a>>2]|0)-d|0;i=a+4|0;d=(b[i>>2]|0)-d|0;e=hd(+((c<<1)+d|0)/7.0)|0;b[a>>2]=e;c=hd(+((d*3|0)-c|0)/7.0)|0;b[i>>2]=c;b[h>>2]=0;d=c-e|0;if((e|0)<0){g=0-e|0;b[i>>2]=d;b[h>>2]=g;b[a>>2]=0;c=d;e=0;d=g}else d=0;if((c|0)<0){e=e-c|0;b[a>>2]=e;d=d-c|0;b[h>>2]=d;b[i>>2]=0;c=0}g=e-d|0;f=c-d|0;if((d|0)<0){b[a>>2]=g;b[i>>2]=f;b[h>>2]=0;c=f;f=g;d=0}else f=e;e=(c|0)<(f|0)?c:f;e=(d|0)<(e|0)?d:e;if((e|0)<=0)return;b[a>>2]=f-e;b[i>>2]=c-e;b[h>>2]=d-e;return}function Na(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=b[a>>2]|0;h=a+4|0;d=b[h>>2]|0;i=a+8|0;e=b[i>>2]|0;f=d+(c*3|0)|0;b[a>>2]=f;d=e+(d*3|0)|0;b[h>>2]=d;c=(e*3|0)+c|0;b[i>>2]=c;e=d-f|0;if((f|0)<0){c=c-f|0;b[h>>2]=e;b[i>>2]=c;b[a>>2]=0;d=e;e=0}else e=f;if((d|0)<0){e=e-d|0;b[a>>2]=e;c=c-d|0;b[i>>2]=c;b[h>>2]=0;d=0}g=e-c|0;f=d-c|0;if((c|0)<0){b[a>>2]=g;b[h>>2]=f;b[i>>2]=0;e=g;c=0}else f=d;d=(f|0)<(e|0)?f:e;d=(c|0)<(d|0)?c:d;if((d|0)<=0)return;b[a>>2]=e-d;b[h>>2]=f-d;b[i>>2]=c-d;return}function Oa(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=b[a>>2]|0;h=a+4|0;c=b[h>>2]|0;i=a+8|0;d=b[i>>2]|0;e=(c*3|0)+f|0;f=d+(f*3|0)|0;b[a>>2]=f;b[h>>2]=e;c=(d*3|0)+c|0;b[i>>2]=c;d=e-f|0;if((f|0)<0){c=c-f|0;b[h>>2]=d;b[i>>2]=c;b[a>>2]=0;f=0}else d=e;if((d|0)<0){f=f-d|0;b[a>>2]=f;c=c-d|0;b[i>>2]=c;b[h>>2]=0;d=0}g=f-c|0;e=d-c|0;if((c|0)<0){b[a>>2]=g;b[h>>2]=e;b[i>>2]=0;f=g;c=0}else e=d;d=(e|0)<(f|0)?e:f;d=(c|0)<(d|0)?c:d;if((d|0)<=0)return;b[a>>2]=f-d;b[h>>2]=e-d;b[i>>2]=c-d;return}function Pa(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;if((c+-1|0)>>>0>=6)return;f=(b[15440+(c*12|0)>>2]|0)+(b[a>>2]|0)|0;b[a>>2]=f;i=a+4|0;e=(b[15440+(c*12|0)+4>>2]|0)+(b[i>>2]|0)|0;b[i>>2]=e;h=a+8|0;c=(b[15440+(c*12|0)+8>>2]|0)+(b[h>>2]|0)|0;b[h>>2]=c;d=e-f|0;if((f|0)<0){c=c-f|0;b[i>>2]=d;b[h>>2]=c;b[a>>2]=0;e=0}else{d=e;e=f}if((d|0)<0){e=e-d|0;b[a>>2]=e;c=c-d|0;b[h>>2]=c;b[i>>2]=0;d=0}g=e-c|0;f=d-c|0;if((c|0)<0){b[a>>2]=g;b[i>>2]=f;b[h>>2]=0;e=g;c=0}else f=d;d=(f|0)<(e|0)?f:e;d=(c|0)<(d|0)?c:d;if((d|0)<=0)return;b[a>>2]=e-d;b[i>>2]=f-d;b[h>>2]=c-d;return}function Qa(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=b[a>>2]|0;h=a+4|0;c=b[h>>2]|0;i=a+8|0;d=b[i>>2]|0;e=c+f|0;f=d+f|0;b[a>>2]=f;b[h>>2]=e;c=d+c|0;b[i>>2]=c;d=e-f|0;if((f|0)<0){c=c-f|0;b[h>>2]=d;b[i>>2]=c;b[a>>2]=0;e=0}else{d=e;e=f}if((d|0)<0){e=e-d|0;b[a>>2]=e;c=c-d|0;b[i>>2]=c;b[h>>2]=0;d=0}g=e-c|0;f=d-c|0;if((c|0)<0){b[a>>2]=g;b[h>>2]=f;b[i>>2]=0;e=g;c=0}else f=d;d=(f|0)<(e|0)?f:e;d=(c|0)<(d|0)?c:d;if((d|0)<=0)return;b[a>>2]=e-d;b[h>>2]=f-d;b[i>>2]=c-d;return}function Ra(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=b[a>>2]|0;h=a+4|0;e=b[h>>2]|0;i=a+8|0;d=b[i>>2]|0;f=e+c|0;b[a>>2]=f;e=d+e|0;b[h>>2]=e;c=d+c|0;b[i>>2]=c;d=e-f|0;if((f|0)<0){c=c-f|0;b[h>>2]=d;b[i>>2]=c;b[a>>2]=0;e=0}else{d=e;e=f}if((d|0)<0){e=e-d|0;b[a>>2]=e;c=c-d|0;b[i>>2]=c;b[h>>2]=0;d=0}g=e-c|0;f=d-c|0;if((c|0)<0){b[a>>2]=g;b[h>>2]=f;b[i>>2]=0;e=g;c=0}else f=d;d=(f|0)<(e|0)?f:e;d=(c|0)<(d|0)?c:d;if((d|0)<=0)return;b[a>>2]=e-d;b[h>>2]=f-d;b[i>>2]=c-d;return}function Sa(a){a=a|0;switch(a|0){case 1:{a=5;break}case 5:{a=4;break}case 4:{a=6;break}case 6:{a=2;break}case 2:{a=3;break}case 3:{a=1;break}default:{}}return a|0}function Ta(a){a=a|0;switch(a|0){case 1:{a=3;break}case 3:{a=2;break}case 2:{a=6;break}case 6:{a=4;break}case 4:{a=5;break}case 5:{a=1;break}default:{}}return a|0}function Ua(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=b[a>>2]|0;h=a+4|0;d=b[h>>2]|0;i=a+8|0;e=b[i>>2]|0;f=d+(c<<1)|0;b[a>>2]=f;d=e+(d<<1)|0;b[h>>2]=d;c=(e<<1)+c|0;b[i>>2]=c;e=d-f|0;if((f|0)<0){c=c-f|0;b[h>>2]=e;b[i>>2]=c;b[a>>2]=0;d=e;e=0}else e=f;if((d|0)<0){e=e-d|0;b[a>>2]=e;c=c-d|0;b[i>>2]=c;b[h>>2]=0;d=0}g=e-c|0;f=d-c|0;if((c|0)<0){b[a>>2]=g;b[h>>2]=f;b[i>>2]=0;e=g;c=0}else f=d;d=(f|0)<(e|0)?f:e;d=(c|0)<(d|0)?c:d;if((d|0)<=0)return;b[a>>2]=e-d;b[h>>2]=f-d;b[i>>2]=c-d;return}function Va(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=b[a>>2]|0;h=a+4|0;c=b[h>>2]|0;i=a+8|0;d=b[i>>2]|0;e=(c<<1)+f|0;f=d+(f<<1)|0;b[a>>2]=f;b[h>>2]=e;c=(d<<1)+c|0;b[i>>2]=c;d=e-f|0;if((f|0)<0){c=c-f|0;b[h>>2]=d;b[i>>2]=c;b[a>>2]=0;f=0}else d=e;if((d|0)<0){f=f-d|0;b[a>>2]=f;c=c-d|0;b[i>>2]=c;b[h>>2]=0;d=0}g=f-c|0;e=d-c|0;if((c|0)<0){b[a>>2]=g;b[h>>2]=e;b[i>>2]=0;f=g;c=0}else e=d;d=(e|0)<(f|0)?e:f;d=(c|0)<(d|0)?c:d;if((d|0)<=0)return;b[a>>2]=f-d;b[h>>2]=e-d;b[i>>2]=c-d;return}function Wa(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=(b[a>>2]|0)-(b[c>>2]|0)|0;i=(h|0)<0;e=(b[a+4>>2]|0)-(b[c+4>>2]|0)-(i?h:0)|0;g=(e|0)<0;f=(i?0-h|0:0)+(b[a+8>>2]|0)-(b[c+8>>2]|0)+(g?0-e|0:0)|0;a=(f|0)<0;c=a?0:f;d=(g?0:e)-(a?f:0)|0;f=(i?0:h)-(g?e:0)-(a?f:0)|0;a=(d|0)<(f|0)?d:f;a=(c|0)<(a|0)?c:a;e=(a|0)>0;c=c-(e?a:0)|0;d=d-(e?a:0)|0;a=f-(e?a:0)|0;a=(a|0)>-1?a:0-a|0;d=(d|0)>-1?d:0-d|0;c=(c|0)>-1?c:0-c|0;c=(d|0)>(c|0)?d:c;return ((a|0)>(c|0)?a:c)|0}function Xa(a,c){a=a|0;c=c|0;var d=0;d=b[a+8>>2]|0;b[c>>2]=(b[a>>2]|0)-d;b[c+4>>2]=(b[a+4>>2]|0)-d;return}function Ya(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=b[a>>2]|0;b[c>>2]=e;f=b[a+4>>2]|0;h=c+4|0;b[h>>2]=f;i=c+8|0;b[i>>2]=0;d=(f|0)<(e|0);a=d?e:f;d=d?f:e;do if((d|0)<0){if((a|0)>0){if((a|-2147483648|0)<(d|0)&((d|0)!=-2147483648&(2147483647-a|0)>=(d|0)))break;else a=1;return a|0}if((d|0)==-2147483648|(-2147483648-a|0)>(d|0)){c=1;return c|0}if((a|0)>-1){if((a|-2147483648|0)<(d|0))break;else a=1;return a|0}else{if((a^-2147483648|0)<(d|0))a=1;else break;return a|0}}while(0);a=f-e|0;if((e|0)<0){d=0-e|0;b[h>>2]=a;b[i>>2]=d;b[c>>2]=0;e=0}else{a=f;d=0}if((a|0)<0){e=e-a|0;b[c>>2]=e;d=d-a|0;b[i>>2]=d;b[h>>2]=0;a=0}g=e-d|0;f=a-d|0;if((d|0)<0){b[c>>2]=g;b[h>>2]=f;b[i>>2]=0;a=f;f=g;d=0}else f=e;e=(a|0)<(f|0)?a:f;e=(d|0)<(e|0)?d:e;if((e|0)<=0){c=0;return c|0}b[c>>2]=f-e;b[h>>2]=a-e;b[i>>2]=d-e;c=0;return c|0}function Za(a){a=a|0;var c=0,d=0,e=0,f=0;c=a+8|0;f=b[c>>2]|0;d=f-(b[a>>2]|0)|0;b[a>>2]=d;e=a+4|0;a=(b[e>>2]|0)-f|0;b[e>>2]=a;b[c>>2]=0-(a+d);return}function _a(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=b[a>>2]|0;c=0-d|0;b[a>>2]=c;h=a+8|0;b[h>>2]=0;i=a+4|0;e=b[i>>2]|0;f=e+d|0;if((d|0)>0){b[i>>2]=f;b[h>>2]=d;b[a>>2]=0;c=0;e=f}else d=0;if((e|0)<0){g=c-e|0;b[a>>2]=g;d=d-e|0;b[h>>2]=d;b[i>>2]=0;f=g-d|0;c=0-d|0;if((d|0)<0){b[a>>2]=f;b[i>>2]=c;b[h>>2]=0;e=c;d=0}else{e=0;f=g}}else f=c;c=(e|0)<(f|0)?e:f;c=(d|0)<(c|0)?d:c;if((c|0)<=0)return;b[a>>2]=f-c;b[i>>2]=e-c;b[h>>2]=d-c;return}function $a(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=T;T=T+64|0;l=m;i=m+56|0;if(!(0==0&(c&2013265920|0)==134217728&(0==0&(e&2013265920|0)==134217728))){f=5;T=m;return f|0}if((a|0)==(d|0)&(c|0)==(e|0)){b[f>>2]=0;f=0;T=m;return f|0}h=vd(a|0,c|0,52)|0;H()|0;h=h&15;k=vd(d|0,e|0,52)|0;H()|0;if((h|0)!=(k&15|0)){f=12;T=m;return f|0}g=h+-1|0;if(h>>>0>1){vb(a,c,g,l)|0;vb(d,e,g,i)|0;k=l;j=b[k>>2]|0;k=b[k+4>>2]|0;a:do if((j|0)==(b[i>>2]|0)?(k|0)==(b[i+4>>2]|0):0){h=(h^15)*3|0;g=vd(a|0,c|0,h|0)|0;H()|0;g=g&7;h=vd(d|0,e|0,h|0)|0;H()|0;h=h&7;do if(!((g|0)==0|(h|0)==0))if((g|0)==7)g=5;else{if((g|0)==1|(h|0)==1?xb(j,k)|0:0){g=5;break}if((b[15536+(g<<2)>>2]|0)!=(h|0)?(b[15568+(g<<2)>>2]|0)!=(h|0):0)break a;b[f>>2]=1;g=0}else{b[f>>2]=1;g=0}while(0);f=g;T=m;return f|0}while(0)}g=l;h=g+56|0;do{b[g>>2]=0;g=g+4|0}while((g|0)<(h|0));aa(a,c,1,l)|0;c=l;if(((((!((b[c>>2]|0)==(d|0)?(b[c+4>>2]|0)==(e|0):0)?(c=l+8|0,!((b[c>>2]|0)==(d|0)?(b[c+4>>2]|0)==(e|0):0)):0)?(c=l+16|0,!((b[c>>2]|0)==(d|0)?(b[c+4>>2]|0)==(e|0):0)):0)?(c=l+24|0,!((b[c>>2]|0)==(d|0)?(b[c+4>>2]|0)==(e|0):0)):0)?(c=l+32|0,!((b[c>>2]|0)==(d|0)?(b[c+4>>2]|0)==(e|0):0)):0)?(c=l+40|0,!((b[c>>2]|0)==(d|0)?(b[c+4>>2]|0)==(e|0):0)):0){g=l+48|0;g=((b[g>>2]|0)==(d|0)?(b[g+4>>2]|0)==(e|0):0)&1}else g=1;b[f>>2]=g;f=0;T=m;return f|0}function ab(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;d=fa(a,c,d,e)|0;if((d|0)==7){f=11;return f|0}e=wd(d|0,0,56)|0;c=c&-2130706433|(H()|0)|268435456;b[f>>2]=a|e;b[f+4>>2]=c;f=0;return f|0}function bb(a,c,d){a=a|0;c=c|0;d=d|0;if(!(0==0&(c&2013265920|0)==268435456)){d=6;return d|0}b[d>>2]=a;b[d+4>>2]=c&-2130706433|134217728;d=0;return d|0}function cb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0;f=T;T=T+16|0;e=f;b[e>>2]=0;if(!(0==0&(c&2013265920|0)==268435456)){e=6;T=f;return e|0}g=vd(a|0,c|0,56)|0;H()|0;e=ea(a,c&-2130706433|134217728,g&7,e,d)|0;T=f;return e|0}function db(a,b){a=a|0;b=b|0;var c=0;c=vd(a|0,b|0,56)|0;H()|0;switch(c&7){case 0:case 7:{c=0;return c|0}default:{}}c=b&-2130706433|134217728;if(!(0==0&(b&2013265920|0)==268435456)){c=0;return c|0}if(0==0&(b&117440512|0)==16777216&(xb(a,c)|0)!=0){c=0;return c|0}c=ub(a,c)|0;return c|0}function eb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=T;T=T+16|0;e=f;if(!(0==0&(c&2013265920|0)==268435456)){e=6;T=f;return e|0}g=c&-2130706433|134217728;h=d;b[h>>2]=a;b[h+4>>2]=g;b[e>>2]=0;c=vd(a|0,c|0,56)|0;H()|0;e=ea(a,g,c&7,e,d+8|0)|0;T=f;return e|0}function fb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;f=(xb(a,c)|0)==0;c=c&-2130706433;e=d;b[e>>2]=f?a:0;b[e+4>>2]=f?c|285212672:0;e=d+8|0;b[e>>2]=a;b[e+4>>2]=c|301989888;e=d+16|0;b[e>>2]=a;b[e+4>>2]=c|318767104;e=d+24|0;b[e>>2]=a;b[e+4>>2]=c|335544320;e=d+32|0;b[e>>2]=a;b[e+4>>2]=c|352321536;d=d+40|0;b[d>>2]=a;b[d+4>>2]=c|369098752;return 0}function gb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;h=T;T=T+16|0;f=h;g=c&-2130706433|134217728;if(!(0==0&(c&2013265920|0)==268435456)){g=6;T=h;return g|0}e=vd(a|0,c|0,56)|0;H()|0;e=Uc(a,g,e&7)|0;if((e|0)==-1){b[d>>2]=0;g=6;T=h;return g|0}if(Ob(a,g,f)|0)I(23313,22484,282,22499);c=vd(a|0,c|0,52)|0;H()|0;c=c&15;if(!(xb(a,g)|0))qb(f,c,e,2,d);else mb(f,c,e,2,d);g=0;T=h;return g|0}function hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T;T=T+16|0;e=d;ib(a,b,c,e);Ca(e,c+4|0);T=d;return}function ib(a,c,d,f){a=a|0;c=c|0;d=d|0;f=f|0;var g=0.0,h=0.0,i=0.0,j=0,k=0;j=T;T=T+16|0;k=j;jb(a,d,k);h=+w(+(1.0-+e[k>>3]*.5));if(h<1.0e-16){b[f>>2]=0;b[f+4>>2]=0;b[f+8>>2]=0;b[f+12>>2]=0;T=j;return}k=b[d>>2]|0;g=+e[15920+(k*24|0)>>3];g=+Zb(g-+Zb(+cc(15600+(k<<4)|0,a)));if(!(Lb(c)|0))i=g;else i=+Zb(g+-.3334731722518321);g=+v(+h)/.381966011250105;if((c|0)>0){a=0;do{g=g*2.6457513110645907;a=a+1|0}while((a|0)!=(c|0))}h=+t(+i)*g;e[f>>3]=h;i=+u(+i)*g;e[f+8>>3]=i;T=j;return}function jb(a,c,d){a=a|0;c=c|0;d=d|0;var f=0.0,g=0,h=0;h=T;T=T+32|0;g=h;Tc(a,g);b[c>>2]=0;e[d>>3]=5.0;f=+Sc(16400,g);if(f<+e[d>>3]){b[c>>2]=0;e[d>>3]=f}f=+Sc(16424,g);if(f<+e[d>>3]){b[c>>2]=1;e[d>>3]=f}f=+Sc(16448,g);if(f<+e[d>>3]){b[c>>2]=2;e[d>>3]=f}f=+Sc(16472,g);if(f<+e[d>>3]){b[c>>2]=3;e[d>>3]=f}f=+Sc(16496,g);if(f<+e[d>>3]){b[c>>2]=4;e[d>>3]=f}f=+Sc(16520,g);if(f<+e[d>>3]){b[c>>2]=5;e[d>>3]=f}f=+Sc(16544,g);if(f<+e[d>>3]){b[c>>2]=6;e[d>>3]=f}f=+Sc(16568,g);if(f<+e[d>>3]){b[c>>2]=7;e[d>>3]=f}f=+Sc(16592,g);if(f<+e[d>>3]){b[c>>2]=8;e[d>>3]=f}f=+Sc(16616,g);if(f<+e[d>>3]){b[c>>2]=9;e[d>>3]=f}f=+Sc(16640,g);if(f<+e[d>>3]){b[c>>2]=10;e[d>>3]=f}f=+Sc(16664,g);if(f<+e[d>>3]){b[c>>2]=11;e[d>>3]=f}f=+Sc(16688,g);if(f<+e[d>>3]){b[c>>2]=12;e[d>>3]=f}f=+Sc(16712,g);if(f<+e[d>>3]){b[c>>2]=13;e[d>>3]=f}f=+Sc(16736,g);if(f<+e[d>>3]){b[c>>2]=14;e[d>>3]=f}f=+Sc(16760,g);if(f<+e[d>>3]){b[c>>2]=15;e[d>>3]=f}f=+Sc(16784,g);if(f<+e[d>>3]){b[c>>2]=16;e[d>>3]=f}f=+Sc(16808,g);if(f<+e[d>>3]){b[c>>2]=17;e[d>>3]=f}f=+Sc(16832,g);if(f<+e[d>>3]){b[c>>2]=18;e[d>>3]=f}f=+Sc(16856,g);if(!(f<+e[d>>3])){T=h;return}b[c>>2]=19;e[d>>3]=f;T=h;return}function kb(a,c,d,f,g){a=a|0;c=c|0;d=d|0;f=f|0;g=g|0;var h=0.0,i=0.0;h=+Pc(a);if(h<1.0e-16){c=15600+(c<<4)|0;b[g>>2]=b[c>>2];b[g+4>>2]=b[c+4>>2];b[g+8>>2]=b[c+8>>2];b[g+12>>2]=b[c+12>>2];return}i=+z(+(+e[a+8>>3]),+(+e[a>>3]));if((d|0)>0){a=0;do{h=h/2.6457513110645907;a=a+1|0}while((a|0)!=(d|0))}if(!f){h=+y(+(h*.381966011250105));if(Lb(d)|0)i=+Zb(i+.3334731722518321)}else{h=h/3.0;d=(Lb(d)|0)==0;h=+y(+((d?h:h/2.6457513110645907)*.381966011250105))}dc(15600+(c<<4)|0,+Zb(+e[15920+(c*24|0)>>3]-i),h,g);return}function lb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;e=T;T=T+16|0;f=e;Ea(a+4|0,f);kb(f,b[a>>2]|0,c,0,d);T=e;return}function mb(a,c,d,f,g){a=a|0;c=c|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,J=0.0;G=T;T=T+272|0;h=G+256|0;u=G+240|0;D=G;E=G+224|0;F=G+208|0;v=G+176|0;w=G+160|0;x=G+192|0;y=G+144|0;z=G+128|0;A=G+112|0;B=G+96|0;C=G+80|0;b[h>>2]=c;b[u>>2]=b[a>>2];b[u+4>>2]=b[a+4>>2];b[u+8>>2]=b[a+8>>2];b[u+12>>2]=b[a+12>>2];nb(u,h,D);b[g>>2]=0;u=f+d+((f|0)==5&1)|0;if((u|0)<=(d|0)){T=G;return}k=b[h>>2]|0;l=E+4|0;m=v+4|0;n=d+5|0;o=16880+(k<<2)|0;p=16960+(k<<2)|0;q=z+8|0;r=A+8|0;s=B+8|0;t=F+4|0;j=d;a:while(1){i=D+(((j|0)%5|0)<<4)|0;b[F>>2]=b[i>>2];b[F+4>>2]=b[i+4>>2];b[F+8>>2]=b[i+8>>2];b[F+12>>2]=b[i+12>>2];do{}while((ob(F,k,0,1)|0)==2);if((j|0)>(d|0)&(Lb(c)|0)!=0){b[v>>2]=b[F>>2];b[v+4>>2]=b[F+4>>2];b[v+8>>2]=b[F+8>>2];b[v+12>>2]=b[F+12>>2];Ea(l,w);f=b[v>>2]|0;h=b[17040+(f*80|0)+(b[E>>2]<<2)>>2]|0;b[v>>2]=b[18640+(f*80|0)+(h*20|0)>>2];i=b[18640+(f*80|0)+(h*20|0)+16>>2]|0;if((i|0)>0){a=0;do{Qa(m);a=a+1|0}while((a|0)<(i|0))}i=18640+(f*80|0)+(h*20|0)+4|0;b[x>>2]=b[i>>2];b[x+4>>2]=b[i+4>>2];b[x+8>>2]=b[i+8>>2];Ha(x,(b[o>>2]|0)*3|0);Fa(m,x,m);Da(m);Ea(m,y);H=+(b[p>>2]|0);e[z>>3]=H*3.0;e[q>>3]=0.0;J=H*-1.5;e[A>>3]=J;e[r>>3]=H*2.598076211353316;e[B>>3]=J;e[s>>3]=H*-2.598076211353316;switch(b[17040+((b[v>>2]|0)*80|0)+(b[F>>2]<<2)>>2]|0){case 1:{a=A;f=z;break}case 3:{a=B;f=A;break}case 2:{a=z;f=B;break}default:{a=12;break a}}Qc(w,y,f,a,C);kb(C,b[v>>2]|0,k,1,g+8+(b[g>>2]<<4)|0);b[g>>2]=(b[g>>2]|0)+1}if((j|0)<(n|0)){Ea(t,v);kb(v,b[F>>2]|0,k,1,g+8+(b[g>>2]<<4)|0);b[g>>2]=(b[g>>2]|0)+1};b[E>>2]=b[F>>2];b[E+4>>2]=b[F+4>>2];b[E+8>>2]=b[F+8>>2];b[E+12>>2]=b[F+12>>2];j=j+1|0;if((j|0)>=(u|0)){a=3;break}}if((a|0)==3){T=G;return}else if((a|0)==12)I(22522,22569,571,22579)}function nb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=T;T=T+128|0;e=j+64|0;f=j;g=e;h=20240;i=g+60|0;do{b[g>>2]=b[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));g=f;h=20304;i=g+60|0;do{b[g>>2]=b[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));i=(Lb(b[c>>2]|0)|0)==0;e=i?e:f;f=a+4|0;Ua(f);Va(f);if(Lb(b[c>>2]|0)|0){Oa(f);b[c>>2]=(b[c>>2]|0)+1}b[d>>2]=b[a>>2];c=d+4|0;Fa(f,e,c);Da(c);b[d+16>>2]=b[a>>2];c=d+20|0;Fa(f,e+12|0,c);Da(c);b[d+32>>2]=b[a>>2];c=d+36|0;Fa(f,e+24|0,c);Da(c);b[d+48>>2]=b[a>>2];c=d+52|0;Fa(f,e+36|0,c);Da(c);b[d+64>>2]=b[a>>2];d=d+68|0;Fa(f,e+48|0,d);Da(d);T=j;return}function ob(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=T;T=T+32|0;n=p+12|0;i=p;o=a+4|0;m=b[16960+(c<<2)>>2]|0;l=(e|0)!=0;m=l?m*3|0:m;f=b[o>>2]|0;k=a+8|0;h=b[k>>2]|0;if(l){g=a+12|0;e=b[g>>2]|0;f=h+f+e|0;if((f|0)==(m|0)){o=1;T=p;return o|0}else j=g}else{j=a+12|0;e=b[j>>2]|0;f=h+f+e|0}if((f|0)<=(m|0)){o=0;T=p;return o|0}do if((e|0)>0){e=b[a>>2]|0;if((h|0)>0){g=18640+(e*80|0)+60|0;e=a;break}e=18640+(e*80|0)+40|0;if(!d){g=e;e=a}else{Ba(n,m,0,0);Ga(o,n,i);Ra(i);Fa(i,n,o);g=e;e=a}}else{g=18640+((b[a>>2]|0)*80|0)+20|0;e=a}while(0);b[e>>2]=b[g>>2];f=g+16|0;if((b[f>>2]|0)>0){e=0;do{Qa(o);e=e+1|0}while((e|0)<(b[f>>2]|0))}a=g+4|0;b[n>>2]=b[a>>2];b[n+4>>2]=b[a+4>>2];b[n+8>>2]=b[a+8>>2];c=b[16880+(c<<2)>>2]|0;Ha(n,l?c*3|0:c);Fa(o,n,o);Da(o);if(l)e=((b[k>>2]|0)+(b[o>>2]|0)+(b[j>>2]|0)|0)==(m|0)?1:2;else e=2;o=e;T=p;return o|0}function pb(a,b){a=a|0;b=b|0;var c=0;do c=ob(a,b,0,1)|0;while((c|0)==2);return c|0}function qb(a,c,d,f,g){a=a|0;c=c|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0;B=T;T=T+240|0;h=B+224|0;x=B+208|0;y=B;z=B+192|0;A=B+176|0;s=B+160|0;t=B+144|0;u=B+128|0;v=B+112|0;w=B+96|0;b[h>>2]=c;b[x>>2]=b[a>>2];b[x+4>>2]=b[a+4>>2];b[x+8>>2]=b[a+8>>2];b[x+12>>2]=b[a+12>>2];rb(x,h,y);b[g>>2]=0;r=f+d+((f|0)==6&1)|0;if((r|0)<=(d|0)){T=B;return}k=b[h>>2]|0;l=d+6|0;m=16960+(k<<2)|0;n=t+8|0;o=u+8|0;p=v+8|0;q=z+4|0;i=0;j=d;f=-1;a:while(1){h=(j|0)%6|0;a=y+(h<<4)|0;b[z>>2]=b[a>>2];b[z+4>>2]=b[a+4>>2];b[z+8>>2]=b[a+8>>2];b[z+12>>2]=b[a+12>>2];a=i;i=ob(z,k,0,1)|0;if((j|0)>(d|0)&(Lb(c)|0)!=0?((a|0)!=1?(b[z>>2]|0)!=(f|0):0):0){Ea(y+(((h+5|0)%6|0)<<4)+4|0,A);Ea(y+(h<<4)+4|0,s);C=+(b[m>>2]|0);e[t>>3]=C*3.0;e[n>>3]=0.0;D=C*-1.5;e[u>>3]=D;e[o>>3]=C*2.598076211353316;e[v>>3]=D;e[p>>3]=C*-2.598076211353316;h=b[x>>2]|0;switch(b[17040+(h*80|0)+(((f|0)==(h|0)?b[z>>2]|0:f)<<2)>>2]|0){case 1:{a=u;f=t;break}case 3:{a=v;f=u;break}case 2:{a=t;f=v;break}default:{a=8;break a}}Qc(A,s,f,a,w);if(!(Rc(A,w)|0)?!(Rc(s,w)|0):0){kb(w,b[x>>2]|0,k,1,g+8+(b[g>>2]<<4)|0);b[g>>2]=(b[g>>2]|0)+1}}if((j|0)<(l|0)){Ea(q,A);kb(A,b[z>>2]|0,k,1,g+8+(b[g>>2]<<4)|0);b[g>>2]=(b[g>>2]|0)+1}j=j+1|0;if((j|0)>=(r|0)){a=3;break}else f=b[z>>2]|0}if((a|0)==3){T=B;return}else if((a|0)==8)I(22606,22569,736,22651)}function rb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=T;T=T+160|0;e=j+80|0;f=j;g=e;h=20368;i=g+72|0;do{b[g>>2]=b[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));g=f;h=20448;i=g+72|0;do{b[g>>2]=b[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(i|0));i=(Lb(b[c>>2]|0)|0)==0;e=i?e:f;f=a+4|0;Ua(f);Va(f);if(Lb(b[c>>2]|0)|0){Oa(f);b[c>>2]=(b[c>>2]|0)+1}b[d>>2]=b[a>>2];c=d+4|0;Fa(f,e,c);Da(c);b[d+16>>2]=b[a>>2];c=d+20|0;Fa(f,e+12|0,c);Da(c);b[d+32>>2]=b[a>>2];c=d+36|0;Fa(f,e+24|0,c);Da(c);b[d+48>>2]=b[a>>2];c=d+52|0;Fa(f,e+36|0,c);Da(c);b[d+64>>2]=b[a>>2];c=d+68|0;Fa(f,e+48|0,c);Da(c);b[d+80>>2]=b[a>>2];d=d+84|0;Fa(f,e+60|0,d);Da(d);T=j;return}function sb(a,b){a=a|0;b=b|0;b=vd(a|0,b|0,52)|0;H()|0;return b&15|0}function tb(a,b){a=a|0;b=b|0;b=vd(a|0,b|0,45)|0;H()|0;return b&127|0}function ub(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;if(!(0==0&(b&-16777216|0)==134217728)){b=0;return b|0}g=vd(a|0,b|0,45)|0;H()|0;g=g&127;if(g>>>0>121){b=0;return b|0}c=vd(a|0,b|0,52)|0;H()|0;c=c&15;do if(c|0){e=1;d=0;while(1){f=vd(a|0,b|0,(15-e|0)*3|0)|0;H()|0;f=f&7;if((f|0)!=0&(d^1))if((f|0)==1&(ma(g)|0)!=0){h=0;d=13;break}else d=1;if((f|0)==7){h=0;d=13;break}if(e>>>0<c>>>0)e=e+1|0;else{d=9;break}}if((d|0)==9){if((c|0)==15)h=1;else break;return h|0}else if((d|0)==13)return h|0}while(0);while(1){h=vd(a|0,b|0,(14-c|0)*3|0)|0;H()|0;if(!((h&7|0)==7&0==0)){h=0;d=13;break}if(c>>>0<14)c=c+1|0;else{h=1;d=13;break}}if((d|0)==13)return h|0;return 0}function vb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=vd(a|0,c|0,52)|0;H()|0;g=g&15;if(d>>>0>15){e=4;return e|0}if((g|0)<(d|0)){e=12;return e|0}if((g|0)==(d|0)){b[e>>2]=a;b[e+4>>2]=c;e=0;return e|0}f=wd(d|0,0,52)|0;f=f|a;a=H()|0|c&-15728641;if((g|0)>(d|0))do{c=wd(7,0,(14-d|0)*3|0)|0;d=d+1|0;f=c|f;a=H()|0|a}while((d|0)<(g|0));b[e>>2]=f;b[e+4>>2]=a;e=0;return e|0}function wb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=vd(a|0,c|0,52)|0;H()|0;g=g&15;if(!((d|0)<16&(g|0)<=(d|0))){e=4;return e|0}f=d-g|0;d=vd(a|0,c|0,45)|0;H()|0;a:do if(!(ma(d&127)|0)){d=Cc(7,0,f,((f|0)<0)<<31>>31)|0;f=H()|0}else{b:do if(g|0){d=1;while(1){h=wd(7,0,(15-d|0)*3|0)|0;if(!((h&a|0)==0&((H()|0)&c|0)==0))break;if(d>>>0<g>>>0)d=d+1|0;else break b}d=Cc(7,0,f,((f|0)<0)<<31>>31)|0;f=H()|0;break a}while(0);d=Cc(7,0,f,((f|0)<0)<<31>>31)|0;d=rd(d|0,H()|0,5,0)|0;d=ld(d|0,H()|0,-5,-1)|0;d=pd(d|0,H()|0,6,0)|0;d=ld(d|0,H()|0,1,0)|0;f=H()|0}while(0);h=e;b[h>>2]=d;b[h+4>>2]=f;h=0;return h|0}function xb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;e=vd(a|0,b|0,45)|0;H()|0;if(!(ma(e&127)|0)){e=0;return e|0}e=vd(a|0,b|0,52)|0;H()|0;e=e&15;a:do if(!e)c=0;else{d=1;while(1){c=vd(a|0,b|0,(15-d|0)*3|0)|0;H()|0;c=c&7;if(c|0)break a;if(d>>>0<e>>>0)d=d+1|0;else{c=0;break}}}while(0);e=(c|0)==0&1;return e|0}function yb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=T;T=T+16|0;g=h;Xb(g,a,c,d);c=g;a=b[c>>2]|0;c=b[c+4>>2]|0;if((a|0)==0&(c|0)==0){T=h;return 0}f=0;d=0;do{i=e+(f<<3)|0;b[i>>2]=a;b[i+4>>2]=c;f=ld(f|0,d|0,1,0)|0;d=H()|0;Yb(g);i=g;a=b[i>>2]|0;c=b[i+4>>2]|0}while(!((a|0)==0&(c|0)==0));T=h;return 0}function zb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((d|0)<(c|0)){c=b;d=a;G(c|0);return d|0}c=wd(-1,-1,((d-c|0)*3|0)+3|0)|0;d=wd(~c|0,~(H()|0)|0,(15-d|0)*3|0)|0;c=~(H()|0)&b;d=~d&a;G(c|0);return d|0}function Ab(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0;f=vd(a|0,c|0,52)|0;H()|0;f=f&15;if(!((d|0)<16&(f|0)<=(d|0))){e=4;return e|0}if((f|0)<(d|0)){f=wd(-1,-1,((d+-1-f|0)*3|0)+3|0)|0;f=wd(~f|0,~(H()|0)|0,(15-d|0)*3|0)|0;c=~(H()|0)&c;a=~f&a}f=wd(d|0,0,52)|0;d=c&-15728641|(H()|0);b[e>>2]=a|f;b[e+4>>2]=d;e=0;return e|0}function Bb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;if((d|0)==0&(e|0)==0){y=0;return y|0}f=a;g=b[f>>2]|0;f=b[f+4>>2]|0;if(0==0&(f&15728640|0)==0){if(!((e|0)>0|(e|0)==0&d>>>0>0)){y=0;return y|0}y=c;b[y>>2]=g;b[y+4>>2]=f;if((d|0)==1&(e|0)==0){y=0;return y|0}f=1;do{w=a+(f<<3)|0;x=b[w+4>>2]|0;y=c+(f<<3)|0;b[y>>2]=b[w>>2];b[y+4>>2]=x;f=f+1|0}while(0<(e|0)|0==(e|0)&f>>>0<d>>>0);f=0;return f|0}v=d<<3;x=id(v)|0;if(!x){y=13;return y|0}Ad(x|0,a|0,v|0)|0;w=kd(d,8)|0;if(!w){jd(x);y=13;return y|0}a:do if(d|0){b:while(1){f=x;s=b[f>>2]|0;f=b[f+4>>2]|0;t=vd(s|0,f|0,52)|0;H()|0;t=t&15;u=t+-1|0;r=(d|0)>0;c:do if((t|0)!=0&r){o=((d|0)<0)<<31>>31;p=wd(u|0,0,52)|0;q=H()|0;if(u>>>0>15){if(!((s|0)==0&(f|0)==0)){y=17;break b}g=0;while(1){g=g+1|0;if((g|0)>=(d|0))break c;e=x+(g<<3)|0;q=b[e>>2]|0;e=b[e+4>>2]|0;if(!((q|0)==0&(e|0)==0)){f=e;y=17;break b}}}g=0;a=s;e=f;while(1){if(!((a|0)==0&(e|0)==0)){if(!(0==0&(e&117440512|0)==0)){y=22;break b}i=vd(a|0,e|0,52)|0;H()|0;i=i&15;if((i|0)<(u|0)){f=12;y=28;break b}if((i|0)!=(u|0)){a=a|p;e=e&-15728641|q;if(i>>>0>=t>>>0){h=u;do{n=wd(7,0,(14-h|0)*3|0)|0;h=h+1|0;a=n|a;e=H()|0|e}while(h>>>0<i>>>0)}}h=td(a|0,e|0,d|0,o|0)|0;H()|0;k=w+(h<<3)|0;i=k;j=b[i>>2]|0;i=b[i+4>>2]|0;if((j|0)==0&(i|0)==0)h=k;else{n=0;while(1){if((n|0)>(d|0)){y=32;break b}if((j|0)==(a|0)&(i&-117440513|0)==(e|0)){l=vd(j|0,i|0,56)|0;H()|0;l=l&7;m=l+1|0;z=vd(j|0,i|0,45)|0;H()|0;d:do if(!(ma(z&127)|0))i=7;else{j=vd(j|0,i|0,52)|0;H()|0;j=j&15;if(!j){i=6;break}i=1;while(1){z=wd(7,0,(15-i|0)*3|0)|0;if(!((z&a|0)==0&((H()|0)&e|0)==0)){i=7;break d}if(i>>>0<j>>>0)i=i+1|0;else{i=6;break}}}while(0);if((l+2|0)>>>0>i>>>0){y=42;break b}z=wd(m|0,0,56)|0;e=H()|0|e&-117440513;m=k;b[m>>2]=0;b[m+4>>2]=0;a=z|a}else h=(h+1|0)%(d|0)|0;k=w+(h<<3)|0;i=k;j=b[i>>2]|0;i=b[i+4>>2]|0;if((j|0)==0&(i|0)==0){h=k;break}else n=n+1|0}}z=h;b[z>>2]=a;b[z+4>>2]=e}g=g+1|0;if((g|0)>=(d|0))break c;e=x+(g<<3)|0;a=b[e>>2]|0;e=b[e+4>>2]|0}}while(0);if((d+5|0)>>>0<11){y=85;break}q=kd((d|0)/6|0,8)|0;if(!q){y=49;break}e:do if(r){n=0;m=0;do{i=w+(n<<3)|0;e=i;g=b[e>>2]|0;e=b[e+4>>2]|0;if(!((g|0)==0&(e|0)==0)){j=vd(g|0,e|0,56)|0;H()|0;j=j&7;a=j+1|0;k=e&-117440513;z=vd(g|0,e|0,45)|0;H()|0;f:do if(ma(z&127)|0){l=vd(g|0,e|0,52)|0;H()|0;l=l&15;if(l|0){h=1;while(1){z=wd(7,0,(15-h|0)*3|0)|0;if(!((g&z|0)==0&(k&(H()|0)|0)==0))break f;if(h>>>0<l>>>0)h=h+1|0;else break}}e=wd(a|0,0,56)|0;g=e|g;e=H()|0|k;a=i;b[a>>2]=g;b[a+4>>2]=e;a=j+2|0}while(0);if((a|0)==7){z=q+(m<<3)|0;b[z>>2]=g;b[z+4>>2]=e&-117440513;m=m+1|0}}n=n+1|0}while((n|0)!=(d|0));if(r){n=((d|0)<0)<<31>>31;o=wd(u|0,0,52)|0;p=H()|0;if(u>>>0>15){if(!((s|0)==0&(f|0)==0)){f=4;y=84;break b}f=0;while(1){f=f+1|0;if((f|0)>=(d|0)){g=0;f=m;break e}z=x+(f<<3)|0;if(!((b[z>>2]|0)==0&(b[z+4>>2]|0)==0)){f=4;y=84;break b}}}l=0;g=0;k=s;while(1){do if(!((k|0)==0&(f|0)==0)){i=vd(k|0,f|0,52)|0;H()|0;i=i&15;if((i|0)<(u|0)){f=12;y=84;break b}do if((i|0)==(u|0)){e=k;i=f}else{e=k|o;a=f&-15728641|p;if(i>>>0<t>>>0){i=a;break}h=u;do{z=wd(7,0,(14-h|0)*3|0)|0;h=h+1|0;e=z|e;a=H()|0|a}while(h>>>0<i>>>0);i=a}while(0);h=td(e|0,i|0,d|0,n|0)|0;H()|0;a=0;while(1){if((a|0)>(d|0)){y=77;break b}z=w+(h<<3)|0;j=b[z+4>>2]|0;if((j&-117440513|0)==(i|0)?(b[z>>2]|0)==(e|0):0){y=79;break}h=(h+1|0)%(d|0)|0;z=w+(h<<3)|0;if((b[z>>2]|0)==(e|0)?(b[z+4>>2]|0)==(i|0):0)break;else a=a+1|0}if((y|0)==79?(y=0,0==0&(j&117440512|0)==100663296):0)break;z=c+(g<<3)|0;b[z>>2]=k;b[z+4>>2]=f;g=g+1|0}while(0);f=l+1|0;if((f|0)>=(d|0)){f=m;break e}z=x+(f<<3)|0;l=f;k=b[z>>2]|0;f=b[z+4>>2]|0}}else{g=0;f=m}}else{g=0;f=0}while(0);Bd(w|0,0,v|0)|0;Ad(x|0,q|0,f<<3|0)|0;jd(q);if(!f)break a;else{c=c+(g<<3)|0;d=f}}if((y|0)==17)if(0==0&(f&117440512|0)==0){f=4;y=28}else y=22;else if((y|0)==32)I(23313,22674,362,22684);else if((y|0)==42){jd(x);jd(w);z=10;return z|0}else if((y|0)==49){jd(x);jd(w);z=13;return z|0}else if((y|0)==77)I(23313,22674,462,22684);else if((y|0)==84){jd(q);jd(x);jd(w);z=f;return z|0}else if((y|0)==85){Ad(c|0,x|0,d<<3|0)|0;break}if((y|0)==22){jd(x);jd(w);z=5;return z|0}else if((y|0)==28){jd(x);jd(w);z=f;return z|0}}while(0);jd(x);jd(w);z=0;return z|0}function Cb(a,c,d,e,f,g,h){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=T;T=T+16|0;p=q;if(!((d|0)>0|(d|0)==0&c>>>0>0)){p=0;T=q;return p|0}if((h|0)>=16){p=12;T=q;return p|0}n=0;o=0;m=0;i=0;a:while(1){k=a+(n<<3)|0;j=b[k>>2]|0;k=b[k+4>>2]|0;l=vd(j|0,k|0,52)|0;H()|0;if((l&15|0)>(h|0)){i=12;j=11;break}Xb(p,j,k,h);l=p;k=b[l>>2]|0;l=b[l+4>>2]|0;if((k|0)==0&(l|0)==0)j=m;else{j=m;do{if(!((i|0)<(g|0)|(i|0)==(g|0)&j>>>0<f>>>0)){j=10;break a}m=e+(j<<3)|0;b[m>>2]=k;b[m+4>>2]=l;j=ld(j|0,i|0,1,0)|0;i=H()|0;Yb(p);m=p;k=b[m>>2]|0;l=b[m+4>>2]|0}while(!((k|0)==0&(l|0)==0))}n=ld(n|0,o|0,1,0)|0;o=H()|0;if(!((o|0)<(d|0)|(o|0)==(d|0)&n>>>0<c>>>0)){i=0;j=11;break}else m=j}if((j|0)==10){p=14;T=q;return p|0}else if((j|0)==11){T=q;return i|0}return 0}function Db(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;n=T;T=T+16|0;m=n;a:do if((d|0)>0|(d|0)==0&c>>>0>0){k=0;h=0;g=0;l=0;while(1){j=a+(k<<3)|0;i=b[j>>2]|0;j=b[j+4>>2]|0;if(!((i|0)==0&(j|0)==0)){j=(wb(i,j,e,m)|0)==0;i=m;h=ld(b[i>>2]|0,b[i+4>>2]|0,h|0,g|0)|0;g=H()|0;if(!j){g=12;break}}k=ld(k|0,l|0,1,0)|0;l=H()|0;if(!((l|0)<(d|0)|(l|0)==(d|0)&k>>>0<c>>>0))break a}T=n;return g|0}else{h=0;g=0}while(0);b[f>>2]=h;b[f+4>>2]=g;f=0;T=n;return f|0}function Eb(a,b){a=a|0;b=b|0;b=vd(a|0,b|0,52)|0;H()|0;return b&1|0}function Fb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;e=vd(a|0,b|0,52)|0;H()|0;e=e&15;if(!e){e=0;return e|0}d=1;while(1){c=vd(a|0,b|0,(15-d|0)*3|0)|0;H()|0;c=c&7;if(c|0){d=5;break}if(d>>>0<e>>>0)d=d+1|0;else{c=0;d=5;break}}if((d|0)==5)return c|0;return 0}function Gb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=vd(a|0,b|0,52)|0;H()|0;i=i&15;if(!i){h=b;i=a;G(h|0);return i|0}h=1;c=0;while(1){f=(15-h|0)*3|0;d=wd(7,0,f|0)|0;e=H()|0;g=vd(a|0,b|0,f|0)|0;H()|0;f=wd(Sa(g&7)|0,0,f|0)|0;g=H()|0;a=f|a&~d;b=g|b&~e;a:do if(!c)if(!((f&d|0)==0&(g&e|0)==0)){d=vd(a|0,b|0,52)|0;H()|0;d=d&15;if(!d)c=1;else{c=1;b:while(1){g=vd(a|0,b|0,(15-c|0)*3|0)|0;H()|0;switch(g&7){case 1:break b;case 0:break;default:{c=1;break a}}if(c>>>0<d>>>0)c=c+1|0;else{c=1;break a}}c=1;while(1){g=(15-c|0)*3|0;e=vd(a|0,b|0,g|0)|0;H()|0;f=wd(7,0,g|0)|0;b=b&~(H()|0);g=wd(Sa(e&7)|0,0,g|0)|0;a=a&~f|g;b=b|(H()|0);if(c>>>0<d>>>0)c=c+1|0;else{c=1;break}}}}else c=0;while(0);if(h>>>0<i>>>0)h=h+1|0;else break}G(b|0);return a|0}function Hb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;d=vd(a|0,b|0,52)|0;H()|0;d=d&15;if(!d){c=b;d=a;G(c|0);return d|0}c=1;while(1){f=(15-c|0)*3|0;g=vd(a|0,b|0,f|0)|0;H()|0;e=wd(7,0,f|0)|0;b=b&~(H()|0);f=wd(Sa(g&7)|0,0,f|0)|0;a=f|a&~e;b=H()|0|b;if(c>>>0<d>>>0)c=c+1|0;else break}G(b|0);return a|0}function Ib(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=vd(a|0,b|0,52)|0;H()|0;i=i&15;if(!i){h=b;i=a;G(h|0);return i|0}h=1;c=0;while(1){f=(15-h|0)*3|0;d=wd(7,0,f|0)|0;e=H()|0;g=vd(a|0,b|0,f|0)|0;H()|0;f=wd(Ta(g&7)|0,0,f|0)|0;g=H()|0;a=f|a&~d;b=g|b&~e;a:do if(!c)if(!((f&d|0)==0&(g&e|0)==0)){d=vd(a|0,b|0,52)|0;H()|0;d=d&15;if(!d)c=1;else{c=1;b:while(1){g=vd(a|0,b|0,(15-c|0)*3|0)|0;H()|0;switch(g&7){case 1:break b;case 0:break;default:{c=1;break a}}if(c>>>0<d>>>0)c=c+1|0;else{c=1;break a}}c=1;while(1){e=(15-c|0)*3|0;f=wd(7,0,e|0)|0;g=b&~(H()|0);b=vd(a|0,b|0,e|0)|0;H()|0;b=wd(Ta(b&7)|0,0,e|0)|0;a=a&~f|b;b=g|(H()|0);if(c>>>0<d>>>0)c=c+1|0;else{c=1;break}}}}else c=0;while(0);if(h>>>0<i>>>0)h=h+1|0;else break}G(b|0);return a|0}function Jb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;d=vd(a|0,b|0,52)|0;H()|0;d=d&15;if(!d){c=b;d=a;G(c|0);return d|0}c=1;while(1){g=(15-c|0)*3|0;f=wd(7,0,g|0)|0;e=b&~(H()|0);b=vd(a|0,b|0,g|0)|0;H()|0;b=wd(Ta(b&7)|0,0,g|0)|0;a=b|a&~f;b=H()|0|e;if(c>>>0<d>>>0)c=c+1|0;else break}G(b|0);return a|0}function Kb(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;j=T;T=T+64|0;i=j+40|0;e=j+24|0;f=j+12|0;g=j;wd(c|0,0,52)|0;d=H()|0|134225919;if(!c){if((b[a+4>>2]|0)>2){h=0;i=0;G(h|0);T=j;return i|0}if((b[a+8>>2]|0)>2){h=0;i=0;G(h|0);T=j;return i|0}if((b[a+12>>2]|0)>2){h=0;i=0;G(h|0);T=j;return i|0}wd(oa(a)|0,0,45)|0;h=H()|0|d;i=-1;G(h|0);T=j;return i|0};b[i>>2]=b[a>>2];b[i+4>>2]=b[a+4>>2];b[i+8>>2]=b[a+8>>2];b[i+12>>2]=b[a+12>>2];h=i+4|0;if((c|0)>0){a=-1;while(1){b[e>>2]=b[h>>2];b[e+4>>2]=b[h+4>>2];b[e+8>>2]=b[h+8>>2];if(!(c&1)){Ma(h);b[f>>2]=b[h>>2];b[f+4>>2]=b[h+4>>2];b[f+8>>2]=b[h+8>>2];Oa(f)}else{La(h);b[f>>2]=b[h>>2];b[f+4>>2]=b[h+4>>2];b[f+8>>2]=b[h+8>>2];Na(f)}Ga(e,f,g);Da(g);l=(15-c|0)*3|0;k=wd(7,0,l|0)|0;d=d&~(H()|0);l=wd(Ia(g)|0,0,l|0)|0;a=l|a&~k;d=H()|0|d;if((c|0)>1)c=c+-1|0;else break}}else a=-1;a:do if(((b[h>>2]|0)<=2?(b[i+8>>2]|0)<=2:0)?(b[i+12>>2]|0)<=2:0){e=oa(i)|0;c=wd(e|0,0,45)|0;c=c|a;a=H()|0|d&-1040385;g=pa(i)|0;if(!(ma(e)|0)){if((g|0)<=0)break;f=0;while(1){e=vd(c|0,a|0,52)|0;H()|0;e=e&15;if(e){d=1;while(1){l=(15-d|0)*3|0;i=vd(c|0,a|0,l|0)|0;H()|0;k=wd(7,0,l|0)|0;a=a&~(H()|0);l=wd(Sa(i&7)|0,0,l|0)|0;c=c&~k|l;a=a|(H()|0);if(d>>>0<e>>>0)d=d+1|0;else break}}f=f+1|0;if((f|0)==(g|0))break a}}f=vd(c|0,a|0,52)|0;H()|0;f=f&15;b:do if(f){d=1;c:while(1){l=vd(c|0,a|0,(15-d|0)*3|0)|0;H()|0;switch(l&7){case 1:break c;case 0:break;default:break b}if(d>>>0<f>>>0)d=d+1|0;else break b}if(sa(e,b[i>>2]|0)|0){d=1;while(1){i=(15-d|0)*3|0;k=wd(7,0,i|0)|0;l=a&~(H()|0);a=vd(c|0,a|0,i|0)|0;H()|0;a=wd(Ta(a&7)|0,0,i|0)|0;c=c&~k|a;a=l|(H()|0);if(d>>>0<f>>>0)d=d+1|0;else break}}else{d=1;while(1){l=(15-d|0)*3|0;i=vd(c|0,a|0,l|0)|0;H()|0;k=wd(7,0,l|0)|0;a=a&~(H()|0);l=wd(Sa(i&7)|0,0,l|0)|0;c=c&~k|l;a=a|(H()|0);if(d>>>0<f>>>0)d=d+1|0;else break}}}while(0);if((g|0)>0){d=0;do{c=Gb(c,a)|0;a=H()|0;d=d+1|0}while((d|0)!=(g|0))}}else{c=0;a=0}while(0);k=a;l=c;G(k|0);T=j;return l|0}function Lb(a){a=a|0;return (a|0)%2|0|0}function Mb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;f=T;T=T+16|0;e=f;if(c>>>0>15){e=4;T=f;return e|0}if(0==0?(b[a+4>>2]&2146435072|0)==2146435072:0){e=3;T=f;return e|0}if(0==0?(b[a+8+4>>2]&2146435072|0)==2146435072:0){e=3;T=f;return e|0}hb(a,c,e);c=Kb(e,c)|0;e=H()|0;b[d>>2]=c;b[d+4>>2]=e;if((c|0)==0&(e|0)==0)I(23313,22674,786,22697);e=0;T=f;return e|0}function Nb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=d+4|0;g=vd(a|0,c|0,52)|0;H()|0;g=g&15;h=vd(a|0,c|0,45)|0;H()|0;e=(g|0)==0;if(!(ma(h&127)|0)){if(e){h=0;return h|0}if((b[f>>2]|0)==0?(b[d+8>>2]|0)==0:0)e=(b[d+12>>2]|0)!=0&1;else e=1}else if(e){h=1;return h|0}else e=1;d=1;while(1){if(!(d&1))Oa(f);else Na(f);h=vd(a|0,c|0,(15-d|0)*3|0)|0;H()|0;Pa(f,h&7);if(d>>>0<g>>>0)d=d+1|0;else break}return e|0}function Ob(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;l=T;T=T+16|0;j=l;k=vd(a|0,c|0,45)|0;H()|0;k=k&127;if(k>>>0>121){b[d>>2]=0;b[d+4>>2]=0;b[d+8>>2]=0;b[d+12>>2]=0;k=5;T=l;return k|0}a:do if((ma(k)|0)!=0?(g=vd(a|0,c|0,52)|0,H()|0,g=g&15,(g|0)!=0):0){e=1;b:while(1){i=vd(a|0,c|0,(15-e|0)*3|0)|0;H()|0;switch(i&7){case 5:break b;case 0:break;default:{e=c;break a}}if(e>>>0<g>>>0)e=e+1|0;else{e=c;break a}}f=1;e=c;while(1){c=(15-f|0)*3|0;h=wd(7,0,c|0)|0;i=e&~(H()|0);e=vd(a|0,e|0,c|0)|0;H()|0;e=wd(Ta(e&7)|0,0,c|0)|0;a=a&~h|e;e=i|(H()|0);if(f>>>0<g>>>0)f=f+1|0;else break}}else e=c;while(0);i=7696+(k*28|0)|0;b[d>>2]=b[i>>2];b[d+4>>2]=b[i+4>>2];b[d+8>>2]=b[i+8>>2];b[d+12>>2]=b[i+12>>2];if(!(Nb(a,e,d)|0)){k=0;T=l;return k|0}h=d+4|0;b[j>>2]=b[h>>2];b[j+4>>2]=b[h+4>>2];b[j+8>>2]=b[h+8>>2];g=vd(a|0,e|0,52)|0;H()|0;i=g&15;if(!(g&1))g=i;else{Oa(h);g=i+1|0}if(!(ma(k)|0))e=0;else{c:do if(!i)e=0;else{c=1;while(1){f=vd(a|0,e|0,(15-c|0)*3|0)|0;H()|0;f=f&7;if(f|0){e=f;break c}if(c>>>0<i>>>0)c=c+1|0;else{e=0;break}}}while(0);e=(e|0)==4&1}if(!(ob(d,g,e,0)|0)){if((g|0)!=(i|0)){b[h>>2]=b[j>>2];b[h+4>>2]=b[j+4>>2];b[h+8>>2]=b[j+8>>2]}}else{if(ma(k)|0)do{}while((ob(d,g,0,0)|0)!=0);if((g|0)!=(i|0))Ma(h)}k=0;T=l;return k|0}function Pb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;f=T;T=T+16|0;d=f;e=Ob(a,b,d)|0;if(e|0){T=f;return e|0}e=vd(a|0,b|0,52)|0;H()|0;lb(d,e&15,c);e=0;T=f;return e|0}function Qb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;g=T;T=T+16|0;f=g;d=Ob(a,b,f)|0;if(d|0){f=d;T=g;return f|0}d=vd(a|0,b|0,45)|0;H()|0;d=(ma(d&127)|0)==0;e=vd(a|0,b|0,52)|0;H()|0;e=e&15;a:do if(!d){if(e|0){d=1;while(1){h=wd(7,0,(15-d|0)*3|0)|0;if(!((h&a|0)==0&((H()|0)&b|0)==0))break a;if(d>>>0<e>>>0)d=d+1|0;else break}}mb(f,e,0,5,c);h=0;T=g;return h|0}while(0);qb(f,e,0,6,c);h=0;T=g;return h|0}function Rb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0;f=vd(a|0,c|0,45)|0;H()|0;if(!(ma(f&127)|0)){f=2;b[d>>2]=f;return 0}f=vd(a|0,c|0,52)|0;H()|0;f=f&15;if(!f){f=5;b[d>>2]=f;return 0}e=1;while(1){g=wd(7,0,(15-e|0)*3|0)|0;if(!((g&a|0)==0&((H()|0)&c|0)==0)){e=2;a=6;break}if(e>>>0<f>>>0)e=e+1|0;else{e=5;a=6;break}}if((a|0)==6){b[d>>2]=e;return 0}return 0}function Sb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=T;T=T+128|0;k=m+112|0;g=m+96|0;l=m;f=vd(a|0,c|0,52)|0;H()|0;i=f&15;b[k>>2]=i;h=vd(a|0,c|0,45)|0;H()|0;h=h&127;a:do if(ma(h)|0){if(i|0){e=1;while(1){j=wd(7,0,(15-e|0)*3|0)|0;if(!((j&a|0)==0&((H()|0)&c|0)==0)){f=0;break a}if(e>>>0<i>>>0)e=e+1|0;else break}}if(!(f&1)){j=wd(i+1|0,0,52)|0;l=H()|0|c&-15728641;k=wd(7,0,(14-i|0)*3|0)|0;l=Sb((j|a)&~k,l&~(H()|0),d)|0;T=m;return l|0}else f=1}else f=0;while(0);e=Ob(a,c,g)|0;if(!e){if(f){nb(g,k,l);j=5}else{rb(g,k,l);j=6}b:do if(ma(h)|0)if(!i)a=5;else{e=1;while(1){h=wd(7,0,(15-e|0)*3|0)|0;if(!((h&a|0)==0&((H()|0)&c|0)==0)){a=2;break b}if(e>>>0<i>>>0)e=e+1|0;else{a=5;break}}}else a=2;while(0);Bd(d|0,-1,a<<2|0)|0;c:do if(f){g=0;while(1){h=l+(g<<4)|0;pb(h,b[k>>2]|0)|0;h=b[h>>2]|0;i=b[d>>2]|0;if((i|0)==-1|(i|0)==(h|0))e=d;else{f=0;do{f=f+1|0;if(f>>>0>=a>>>0){e=1;break c}e=d+(f<<2)|0;i=b[e>>2]|0}while(!((i|0)==-1|(i|0)==(h|0)))}b[e>>2]=h;g=g+1|0;if(g>>>0>=j>>>0){e=0;break}}}else{g=0;while(1){h=l+(g<<4)|0;ob(h,b[k>>2]|0,0,1)|0;h=b[h>>2]|0;i=b[d>>2]|0;if((i|0)==-1|(i|0)==(h|0))e=d;else{f=0;do{f=f+1|0;if(f>>>0>=a>>>0){e=1;break c}e=d+(f<<2)|0;i=b[e>>2]|0}while(!((i|0)==-1|(i|0)==(h|0)))}b[e>>2]=h;g=g+1|0;if(g>>>0>=j>>>0){e=0;break}}}while(0)}l=e;T=m;return l|0}function Tb(){return 12}function Ub(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(a>>>0>15){i=4;return i|0}wd(a|0,0,52)|0;i=H()|0|134225919;if(!a){d=0;e=0;do{if(ma(e)|0){wd(e|0,0,45)|0;h=i|(H()|0);a=c+(d<<3)|0;b[a>>2]=-1;b[a+4>>2]=h;d=d+1|0}e=e+1|0}while((e|0)!=122);d=0;return d|0}d=0;h=0;do{if(ma(h)|0){wd(h|0,0,45)|0;e=1;f=-1;g=i|(H()|0);while(1){j=wd(7,0,(15-e|0)*3|0)|0;f=f&~j;g=g&~(H()|0);if((e|0)==(a|0))break;else e=e+1|0}j=c+(d<<3)|0;b[j>>2]=f;b[j+4>>2]=g;d=d+1|0}h=h+1|0}while((h|0)!=122);d=0;return d|0}function Vb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=T;T=T+16|0;r=t;s=vd(a|0,c|0,52)|0;H()|0;s=s&15;if(d>>>0>15){s=4;T=t;return s|0}if((s|0)<(d|0)){s=12;T=t;return s|0}if((s|0)!=(d|0)){g=wd(d|0,0,52)|0;g=g|a;i=H()|0|c&-15728641;if((s|0)>(d|0)){j=d;do{q=wd(7,0,(14-j|0)*3|0)|0;j=j+1|0;g=q|g;i=H()|0|i}while((j|0)<(s|0));q=g}else q=g}else{q=a;i=c}p=vd(q|0,i|0,45)|0;H()|0;a:do if(ma(p&127)|0){j=vd(q|0,i|0,52)|0;H()|0;j=j&15;if(j|0){g=1;while(1){p=wd(7,0,(15-g|0)*3|0)|0;if(!((p&q|0)==0&((H()|0)&i|0)==0)){k=33;break a}if(g>>>0<j>>>0)g=g+1|0;else break}}p=e;b[p>>2]=0;b[p+4>>2]=0;if((s|0)>(d|0)){p=c&-15728641;o=s;while(1){n=o;o=o+-1|0;if(o>>>0>15|(s|0)<(o|0)){k=19;break}if((s|0)!=(o|0)){g=wd(o|0,0,52)|0;g=g|a;j=H()|0|p;if((s|0)<(n|0))m=g;else{k=o;do{m=wd(7,0,(14-k|0)*3|0)|0;k=k+1|0;g=m|g;j=H()|0|j}while((k|0)<(s|0));m=g}}else{m=a;j=c}l=vd(m|0,j|0,45)|0;H()|0;if(!(ma(l&127)|0))g=0;else{l=vd(m|0,j|0,52)|0;H()|0;l=l&15;b:do if(!l)g=0;else{k=1;while(1){g=vd(m|0,j|0,(15-k|0)*3|0)|0;H()|0;g=g&7;if(g|0)break b;if(k>>>0<l>>>0)k=k+1|0;else{g=0;break}}}while(0);g=(g|0)==0&1}j=vd(a|0,c|0,(15-n|0)*3|0)|0;H()|0;j=j&7;if((j|0)==7){f=5;k=42;break}g=(g|0)!=0;if((j|0)==1&g){f=5;k=42;break}m=j+(((j|0)!=0&g)<<31>>31)|0;if(m|0){k=s-n|0;k=Cc(7,0,k,((k|0)<0)<<31>>31)|0;l=H()|0;if(g){g=rd(k|0,l|0,5,0)|0;g=ld(g|0,H()|0,-5,-1)|0;g=pd(g|0,H()|0,6,0)|0;g=ld(g|0,H()|0,1,0)|0;j=H()|0}else{g=k;j=l}n=m+-1|0;n=rd(k|0,l|0,n|0,((n|0)<0)<<31>>31|0)|0;n=ld(g|0,j|0,n|0,H()|0)|0;m=H()|0;l=e;l=ld(n|0,m|0,b[l>>2]|0,b[l+4>>2]|0)|0;m=H()|0;n=e;b[n>>2]=l;b[n+4>>2]=m}if((o|0)<=(d|0)){k=37;break}}if((k|0)==19)I(23313,22674,1099,22710);else if((k|0)==37){h=e;f=b[h+4>>2]|0;h=b[h>>2]|0;break}else if((k|0)==42){T=t;return f|0}}else{f=0;h=0}}else k=33;while(0);c:do if((k|0)==33){p=e;b[p>>2]=0;b[p+4>>2]=0;if((s|0)>(d|0)){g=s;while(1){f=vd(a|0,c|0,(15-g|0)*3|0)|0;H()|0;f=f&7;if((f|0)==7){f=5;break}h=s-g|0;h=Cc(7,0,h,((h|0)<0)<<31>>31)|0;f=rd(h|0,H()|0,f|0,0)|0;h=H()|0;p=e;h=ld(b[p>>2]|0,b[p+4>>2]|0,f|0,h|0)|0;f=H()|0;p=e;b[p>>2]=h;b[p+4>>2]=f;g=g+-1|0;if((g|0)<=(d|0))break c}T=t;return f|0}else{f=0;h=0}}while(0);if(wb(q,i,s,r)|0)I(23313,22674,1063,22725);s=r;r=b[s+4>>2]|0;if(((f|0)>-1|(f|0)==-1&h>>>0>4294967295)&((r|0)>(f|0)|((r|0)==(f|0)?(b[s>>2]|0)>>>0>h>>>0:0))){s=0;T=t;return s|0}else I(23313,22674,1139,22710);return 0}function Wb(a,c,d,e,f,g){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;m=T;T=T+16|0;h=m;if(f>>>0>15){g=4;T=m;return g|0}i=vd(d|0,e|0,52)|0;H()|0;i=i&15;if((i|0)>(f|0)){g=12;T=m;return g|0}if(wb(d,e,f,h)|0)I(23313,22674,1063,22725);l=h;k=b[l+4>>2]|0;if(!(((c|0)>-1|(c|0)==-1&a>>>0>4294967295)&((k|0)>(c|0)|((k|0)==(c|0)?(b[l>>2]|0)>>>0>a>>>0:0)))){g=2;T=m;return g|0}l=f-i|0;f=wd(f|0,0,52)|0;j=H()|0|e&-15728641;k=g;b[k>>2]=f|d;b[k+4>>2]=j;k=vd(d|0,e|0,45)|0;H()|0;a:do if(ma(k&127)|0){if(i|0){h=1;while(1){k=wd(7,0,(15-h|0)*3|0)|0;if(!((k&d|0)==0&((H()|0)&e|0)==0))break a;if(h>>>0<i>>>0)h=h+1|0;else break}}if((l|0)<1){g=0;T=m;return g|0}k=i^15;e=-1;j=1;h=1;while(1){i=l-j|0;i=Cc(7,0,i,((i|0)<0)<<31>>31)|0;d=H()|0;do if(h){h=rd(i|0,d|0,5,0)|0;h=ld(h|0,H()|0,-5,-1)|0;h=pd(h|0,H()|0,6,0)|0;f=H()|0;if((c|0)>(f|0)|(c|0)==(f|0)&a>>>0>h>>>0){c=ld(a|0,c|0,-1,-1)|0;c=md(c|0,H()|0,h|0,f|0)|0;h=H()|0;n=g;p=b[n>>2]|0;n=b[n+4>>2]|0;q=(k+e|0)*3|0;o=wd(7,0,q|0)|0;n=n&~(H()|0);e=pd(c|0,h|0,i|0,d|0)|0;a=H()|0;f=ld(e|0,a|0,2,0)|0;q=wd(f|0,H()|0,q|0)|0;n=H()|0|n;f=g;b[f>>2]=q|p&~o;b[f+4>>2]=n;a=rd(e|0,a|0,i|0,d|0)|0;a=md(c|0,h|0,a|0,H()|0)|0;h=0;c=H()|0;break}else{q=g;o=b[q>>2]|0;q=b[q+4>>2]|0;p=wd(7,0,(k+e|0)*3|0)|0;q=q&~(H()|0);h=g;b[h>>2]=o&~p;b[h+4>>2]=q;h=1;break}}else{o=g;f=b[o>>2]|0;o=b[o+4>>2]|0;e=(k+e|0)*3|0;n=wd(7,0,e|0)|0;o=o&~(H()|0);q=pd(a|0,c|0,i|0,d|0)|0;h=H()|0;e=wd(q|0,h|0,e|0)|0;o=H()|0|o;p=g;b[p>>2]=e|f&~n;b[p+4>>2]=o;h=rd(q|0,h|0,i|0,d|0)|0;a=md(a|0,c|0,h|0,H()|0)|0;h=0;c=H()|0}while(0);if((l|0)>(j|0)){e=~j;j=j+1|0}else{c=0;break}}T=m;return c|0}while(0);if((l|0)<1){q=0;T=m;return q|0}f=i^15;h=1;while(1){p=l-h|0;p=Cc(7,0,p,((p|0)<0)<<31>>31)|0;q=H()|0;j=g;d=b[j>>2]|0;j=b[j+4>>2]|0;i=(f-h|0)*3|0;e=wd(7,0,i|0)|0;j=j&~(H()|0);n=pd(a|0,c|0,p|0,q|0)|0;o=H()|0;i=wd(n|0,o|0,i|0)|0;j=H()|0|j;k=g;b[k>>2]=i|d&~e;b[k+4>>2]=j;q=rd(n|0,o|0,p|0,q|0)|0;a=md(a|0,c|0,q|0,H()|0)|0;c=H()|0;if((l|0)<=(h|0)){c=0;break}else h=h+1|0}T=m;return c|0}function Xb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=vd(c|0,d|0,52)|0;H()|0;f=f&15;if((c|0)==0&(d|0)==0|((e|0)>15|(f|0)>(e|0))){e=-1;f=-1;c=0;d=0}else{g=zb(c,d,f+1|0,e)|0;d=(H()|0)&-15728641;c=wd(e|0,0,52)|0;c=g|c;d=d|(H()|0);g=(xb(c,d)|0)==0;e=g?-1:e}g=a;b[g>>2]=c;b[g+4>>2]=d;b[a+8>>2]=f;b[a+12>>2]=e;return}function Yb(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a;c=b[d>>2]|0;d=b[d+4>>2]|0;if((c|0)==0&(d|0)==0)return;e=vd(c|0,d|0,52)|0;H()|0;e=e&15;i=wd(1,0,(e^15)*3|0)|0;c=ld(i|0,H()|0,c|0,d|0)|0;d=H()|0;i=a;b[i>>2]=c;b[i+4>>2]=d;i=a+8|0;h=b[i>>2]|0;if((e|0)<(h|0))return;j=a+12|0;g=e;while(1){if((g|0)==(h|0)){e=5;break}k=(g|0)==(b[j>>2]|0);f=(15-g|0)*3|0;e=vd(c|0,d|0,f|0)|0;H()|0;e=e&7;if(k&((e|0)==1&0==0)){e=7;break}if(!((e|0)==7&0==0)){e=10;break}k=wd(1,0,f|0)|0;c=ld(c|0,d|0,k|0,H()|0)|0;d=H()|0;k=a;b[k>>2]=c;b[k+4>>2]=d;if((g|0)>(h|0))g=g+-1|0;else{e=10;break}}if((e|0)==5){k=a;b[k>>2]=0;b[k+4>>2]=0;b[i>>2]=-1;b[j>>2]=-1;return}else if((e|0)==7){h=wd(1,0,f|0)|0;h=ld(c|0,d|0,h|0,H()|0)|0;i=H()|0;k=a;b[k>>2]=h;b[k+4>>2]=i;b[j>>2]=g+-1;return}else if((e|0)==10)return}function Zb(a){a=+a;var b=0.0;b=a<0.0?a+6.283185307179586:a;return +(!(a>=6.283185307179586)?b:b+-6.283185307179586)}function _b(a,b){a=a|0;b=b|0;if(!(+q(+(+e[a>>3]-+e[b>>3]))<1.7453292519943298e-11)){b=0;return b|0}b=+q(+(+e[a+8>>3]-+e[b+8>>3]))<1.7453292519943298e-11;return b|0}function $b(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,f=0.0,g=0.0;f=+e[b>>3];d=+e[a>>3];g=+u(+((f-d)*.5));c=+u(+((+e[b+8>>3]-+e[a+8>>3])*.5));c=g*g+c*(+t(+f)*+t(+d)*c);return +(+z(+(+r(+c)),+(+r(+(1.0-c))))*2.0)}function ac(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,f=0.0,g=0.0;f=+e[b>>3];d=+e[a>>3];g=+u(+((f-d)*.5));c=+u(+((+e[b+8>>3]-+e[a+8>>3])*.5));c=g*g+c*(+t(+f)*+t(+d)*c);return +(+z(+(+r(+c)),+(+r(+(1.0-c))))*2.0*6371.007180918475)}function bc(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,f=0.0,g=0.0;f=+e[b>>3];d=+e[a>>3];g=+u(+((f-d)*.5));c=+u(+((+e[b+8>>3]-+e[a+8>>3])*.5));c=g*g+c*(+t(+f)*+t(+d)*c);return +(+z(+(+r(+c)),+(+r(+(1.0-c))))*2.0*6371.007180918475*1.0e3)}function cc(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,f=0.0,g=0.0,h=0.0;g=+e[b>>3];d=+t(+g);f=+e[b+8>>3]-+e[a+8>>3];h=d*+u(+f);c=+e[a>>3];return +(+z(+h,+(+u(+g)*+t(+c)-+t(+f)*(d*+u(+c)))))}function dc(a,c,d,f){a=a|0;c=+c;d=+d;f=f|0;var g=0,h=0.0,i=0.0,j=0.0;if(d<1.0e-16){b[f>>2]=b[a>>2];b[f+4>>2]=b[a+4>>2];b[f+8>>2]=b[a+8>>2];b[f+12>>2]=b[a+12>>2];return}h=c<0.0?c+6.283185307179586:c;h=!(c>=6.283185307179586)?h:h+-6.283185307179586;do if(h<1.0e-16){c=+e[a>>3]+d;e[f>>3]=c;g=f}else{g=+q(+(h+-3.141592653589793))<1.0e-16;c=+e[a>>3];if(g){c=c-d;e[f>>3]=c;g=f;break}i=+t(+d);d=+u(+d);c=i*+u(+c)+ +t(+h)*(d*+t(+c));c=c>1.0?1.0:c;c=+x(+(c<-1.0?-1.0:c));e[f>>3]=c;if(+q(+(c+-1.5707963267948966))<1.0e-16){e[f>>3]=1.5707963267948966;e[f+8>>3]=0.0;return}if(+q(+(c+1.5707963267948966))<1.0e-16){e[f>>3]=-1.5707963267948966;e[f+8>>3]=0.0;return}j=+t(+c);h=d*+u(+h)/j;d=+e[a>>3];c=(i-+u(+c)*+u(+d))/+t(+d)/j;i=h>1.0?1.0:h;c=c>1.0?1.0:c;c=+e[a+8>>3]+ +z(+(i<-1.0?-1.0:i),+(c<-1.0?-1.0:c));if(c>3.141592653589793)do c=c+-6.283185307179586;while(c>3.141592653589793);if(c<-3.141592653589793)do c=c+6.283185307179586;while(c<-3.141592653589793);e[f+8>>3]=c;return}while(0);if(+q(+(c+-1.5707963267948966))<1.0e-16){e[g>>3]=1.5707963267948966;e[f+8>>3]=0.0;return}if(+q(+(c+1.5707963267948966))<1.0e-16){e[g>>3]=-1.5707963267948966;e[f+8>>3]=0.0;return}c=+e[a+8>>3];if(c>3.141592653589793)do c=c+-6.283185307179586;while(c>3.141592653589793);if(c<-3.141592653589793)do c=c+6.283185307179586;while(c<-3.141592653589793);e[f+8>>3]=c;return}function ec(a,b){a=a|0;b=b|0;if(a>>>0>15){b=4;return b|0}e[b>>3]=+e[20528+(a<<3)>>3];b=0;return b|0}function fc(a,b){a=a|0;b=b|0;if(a>>>0>15){b=4;return b|0}e[b>>3]=+e[20656+(a<<3)>>3];b=0;return b|0}function gc(a,b){a=a|0;b=b|0;if(a>>>0>15){b=4;return b|0}e[b>>3]=+e[20784+(a<<3)>>3];b=0;return b|0}function hc(a,b){a=a|0;b=b|0;if(a>>>0>15){b=4;return b|0}e[b>>3]=+e[20912+(a<<3)>>3];b=0;return b|0}function ic(a,c){a=a|0;c=c|0;var d=0;if(a>>>0>15){c=4;return c|0}d=Cc(7,0,a,((a|0)<0)<<31>>31)|0;d=rd(d|0,H()|0,120,0)|0;a=H()|0;b[c>>2]=d|2;b[c+4>>2]=a;c=0;return c|0}function jc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0.0,f=0.0,g=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;n=+e[b>>3];l=+e[a>>3];j=+u(+((n-l)*.5));g=+e[b+8>>3];k=+e[a+8>>3];h=+u(+((g-k)*.5));i=+t(+l);m=+t(+n);h=j*j+h*(m*i*h);h=+z(+(+r(+h)),+(+r(+(1.0-h))))*2.0;j=+e[c>>3];n=+u(+((j-n)*.5));d=+e[c+8>>3];g=+u(+((d-g)*.5));f=+t(+j);g=n*n+g*(m*f*g);g=+z(+(+r(+g)),+(+r(+(1.0-g))))*2.0;j=+u(+((l-j)*.5));d=+u(+((k-d)*.5));d=j*j+d*(i*f*d);d=+z(+(+r(+d)),+(+r(+(1.0-d))))*2.0;f=(h+g+d)*.5;return +(+y(+(+r(+(+v(+(f*.5))*+v(+((f-h)*.5))*+v(+((f-g)*.5))*+v(+((f-d)*.5))))))*4.0)}function kc(a,c,d){a=a|0;c=c|0;d=d|0;var f=0.0,g=0,h=0,i=0,j=0;j=T;T=T+192|0;h=j+168|0;i=j;g=Pb(a,c,h)|0;if(g|0){d=g;T=j;return d|0}if(Qb(a,c,i)|0)I(23313,22742,386,22751);c=b[i>>2]|0;if((c|0)>0){f=+jc(i+8|0,i+8+(((c|0)!=1&1)<<4)|0,h)+0.0;if((c|0)!=1){a=1;do{g=a;a=a+1|0;f=f+ +jc(i+8+(g<<4)|0,i+8+(((a|0)%(c|0)|0)<<4)|0,h)}while((a|0)<(c|0))}}else f=0.0;e[d>>3]=f;d=0;T=j;return d|0}function lc(a,b,c){a=a|0;b=b|0;c=c|0;a=kc(a,b,c)|0;if(a|0)return a|0;e[c>>3]=+e[c>>3]*6371.007180918475*6371.007180918475;return a|0}function mc(a,b,c){a=a|0;b=b|0;c=c|0;a=kc(a,b,c)|0;if(a|0)return a|0;e[c>>3]=+e[c>>3]*6371.007180918475*6371.007180918475*1.0e3*1.0e3;return a|0}function nc(a,c,d){a=a|0;c=c|0;d=d|0;var f=0.0,g=0.0,h=0.0,i=0,j=0,k=0.0,l=0.0,m=0.0;j=T;T=T+176|0;i=j;a=gb(a,c,i)|0;if(a|0){i=a;T=j;return i|0}e[d>>3]=0.0;a=b[i>>2]|0;if((a|0)<=1){i=0;T=j;return i|0}c=a+-1|0;a=0;f=+e[i+8>>3];g=+e[i+16>>3];h=0.0;do{a=a+1|0;l=f;f=+e[i+8+(a<<4)>>3];m=+u(+((f-l)*.5));k=g;g=+e[i+8+(a<<4)+8>>3];k=+u(+((g-k)*.5));k=m*m+k*(+t(+f)*+t(+l)*k);h=h+ +z(+(+r(+k)),+(+r(+(1.0-k))))*2.0}while((a|0)<(c|0));e[d>>3]=h;i=0;T=j;return i|0}function oc(a,c,d){a=a|0;c=c|0;d=d|0;var f=0.0,g=0.0,h=0.0,i=0,j=0,k=0.0,l=0.0,m=0.0;j=T;T=T+176|0;i=j;a=gb(a,c,i)|0;if(a|0){i=a;h=+e[d>>3];h=h*6371.007180918475;e[d>>3]=h;T=j;return i|0}e[d>>3]=0.0;a=b[i>>2]|0;if((a|0)<=1){i=0;h=0.0;h=h*6371.007180918475;e[d>>3]=h;T=j;return i|0}c=a+-1|0;a=0;f=+e[i+8>>3];g=+e[i+16>>3];h=0.0;do{a=a+1|0;l=f;f=+e[i+8+(a<<4)>>3];m=+u(+((f-l)*.5));k=g;g=+e[i+8+(a<<4)+8>>3];k=+u(+((g-k)*.5));k=m*m+k*(+t(+l)*+t(+f)*k);h=h+ +z(+(+r(+k)),+(+r(+(1.0-k))))*2.0}while((a|0)!=(c|0));e[d>>3]=h;i=0;m=h;m=m*6371.007180918475;e[d>>3]=m;T=j;return i|0}function pc(a,c,d){a=a|0;c=c|0;d=d|0;var f=0.0,g=0.0,h=0.0,i=0,j=0,k=0.0,l=0.0,m=0.0;j=T;T=T+176|0;i=j;a=gb(a,c,i)|0;if(a|0){i=a;h=+e[d>>3];h=h*6371.007180918475;h=h*1.0e3;e[d>>3]=h;T=j;return i|0}e[d>>3]=0.0;a=b[i>>2]|0;if((a|0)<=1){i=0;h=0.0;h=h*6371.007180918475;h=h*1.0e3;e[d>>3]=h;T=j;return i|0}c=a+-1|0;a=0;f=+e[i+8>>3];g=+e[i+16>>3];h=0.0;do{a=a+1|0;l=f;f=+e[i+8+(a<<4)>>3];m=+u(+((f-l)*.5));k=g;g=+e[i+8+(a<<4)+8>>3];k=+u(+((g-k)*.5));k=m*m+k*(+t(+l)*+t(+f)*k);h=h+ +z(+(+r(+k)),+(+r(+(1.0-k))))*2.0}while((a|0)!=(c|0));e[d>>3]=h;i=0;m=h;m=m*6371.007180918475;m=m*1.0e3;e[d>>3]=m;T=j;return i|0}function qc(a){a=a|0;var c=0,d=0,e=0;c=kd(1,12)|0;if(!c)I(22832,22787,49,22845);d=a+4|0;e=b[d>>2]|0;if(e|0){e=e+8|0;b[e>>2]=c;b[d>>2]=c;return c|0}if(b[a>>2]|0)I(22862,22787,61,22885);e=a;b[e>>2]=c;b[d>>2]=c;return c|0}function rc(a,c){a=a|0;c=c|0;var d=0,e=0;e=id(24)|0;if(!e)I(22899,22787,78,22913);b[e>>2]=b[c>>2];b[e+4>>2]=b[c+4>>2];b[e+8>>2]=b[c+8>>2];b[e+12>>2]=b[c+12>>2];b[e+16>>2]=0;c=a+4|0;d=b[c>>2]|0;if(d|0){b[d+16>>2]=e;b[c>>2]=e;return e|0}if(b[a>>2]|0)I(22928,22787,82,22913);b[a>>2]=e;b[c>>2]=e;return e|0}function sc(a){a=a|0;var c=0,d=0,e=0,f=0;if(!a)return;e=1;while(1){c=b[a>>2]|0;if(c|0)do{d=b[c>>2]|0;if(d|0)do{f=d;d=b[d+16>>2]|0;jd(f)}while((d|0)!=0);f=c;c=b[c+8>>2]|0;jd(f)}while((c|0)!=0);c=a;a=b[a+8>>2]|0;if(!e)jd(c);if(!a)break;else e=0}return}function tc(a){a=a|0;var c=0,d=0,f=0,g=0,h=0.0,i=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0;g=a+8|0;if(b[g>>2]|0){K=1;return K|0}f=b[a>>2]|0;if(!f){K=0;return K|0}c=f;d=0;do{d=d+1|0;c=b[c+8>>2]|0}while((c|0)!=0);if(d>>>0<2){K=0;return K|0}H=id(d<<2)|0;if(!H)I(22948,22787,317,22967);G=id(d<<5)|0;if(!G)I(22989,22787,321,22967);b[a>>2]=0;z=a+4|0;b[z>>2]=0;b[g>>2]=0;d=0;F=0;y=0;n=0;a:while(1){m=b[f>>2]|0;if(m){h=0.0;i=m;do{k=+e[i+8>>3];c=i;i=b[i+16>>2]|0;l=(i|0)==0;g=l?m:i;j=+e[g+8>>3];if(+q(+(k-j))>3.141592653589793){K=14;break}h=h+(j-k)*(+e[c>>3]+ +e[g>>3])}while(!l);if((K|0)==14){K=0;h=0.0;c=m;do{x=+e[c+8>>3];E=c+16|0;D=b[E>>2]|0;D=(D|0)==0?m:D;w=+e[D+8>>3];h=h+(+e[c>>3]+ +e[D>>3])*((w<0.0?w+6.283185307179586:w)-(x<0.0?x+6.283185307179586:x));c=b[((c|0)==0?f:E)>>2]|0}while((c|0)!=0)}if(h>0.0){b[H+(F<<2)>>2]=f;F=F+1|0;g=y;c=n}else K=19}else K=19;if((K|0)==19){K=0;do if(!d)if(!n)if(!(b[a>>2]|0)){g=z;i=a;c=f;d=a;break}else{K=27;break a}else{g=z;i=n+8|0;c=f;d=a;break}else{c=d+8|0;if(b[c>>2]|0){K=21;break a}d=kd(1,12)|0;if(!d){K=23;break a}b[c>>2]=d;g=d+4|0;i=d;c=n}while(0);b[i>>2]=f;b[g>>2]=f;i=G+(y<<5)|0;l=b[f>>2]|0;if(l){m=G+(y<<5)+8|0;e[m>>3]=1797693134862315708145274.0e284;n=G+(y<<5)+24|0;e[n>>3]=1797693134862315708145274.0e284;e[i>>3]=-1797693134862315708145274.0e284;o=G+(y<<5)+16|0;e[o>>3]=-1797693134862315708145274.0e284;u=1797693134862315708145274.0e284;v=-1797693134862315708145274.0e284;g=0;p=l;k=1797693134862315708145274.0e284;s=1797693134862315708145274.0e284;t=-1797693134862315708145274.0e284;j=-1797693134862315708145274.0e284;while(1){h=+e[p>>3];x=+e[p+8>>3];p=b[p+16>>2]|0;r=(p|0)==0;w=+e[(r?l:p)+8>>3];if(h<k){e[m>>3]=h;k=h}if(x<s){e[n>>3]=x;s=x}if(h>t)e[i>>3]=h;else h=t;if(x>j){e[o>>3]=x;j=x}u=x>0.0&x<u?x:u;v=x<0.0&x>v?x:v;g=g|+q(+(x-w))>3.141592653589793;if(r)break;else t=h}if(g){e[o>>3]=v;e[n>>3]=u}}else{b[i>>2]=0;b[i+4>>2]=0;b[i+8>>2]=0;b[i+12>>2]=0;b[i+16>>2]=0;b[i+20>>2]=0;b[i+24>>2]=0;b[i+28>>2]=0}g=y+1|0}E=f+8|0;f=b[E>>2]|0;b[E>>2]=0;if(!f){K=45;break}else{y=g;n=c}}if((K|0)==21)I(22765,22787,35,22799);else if((K|0)==23)I(22819,22787,37,22799);else if((K|0)==27)I(22862,22787,61,22885);else if((K|0)==45){b:do if((F|0)>0){E=(g|0)==0;C=g<<2;D=(a|0)==0;B=0;c=0;while(1){A=b[H+(B<<2)>>2]|0;if(!E){y=id(C)|0;if(!y){K=50;break}z=id(C)|0;if(!z){K=52;break}c:do if(!D){g=0;d=0;i=a;while(1){f=G+(g<<5)|0;if(uc(b[i>>2]|0,f,b[A>>2]|0)|0){b[y+(d<<2)>>2]=i;b[z+(d<<2)>>2]=f;r=d+1|0}else r=d;i=b[i+8>>2]|0;if(!i)break;else{g=g+1|0;d=r}}if((r|0)>0){f=b[y>>2]|0;if((r|0)==1)d=f;else{o=0;p=-1;d=f;n=f;while(1){l=b[n>>2]|0;f=0;i=0;while(1){g=b[b[y+(i<<2)>>2]>>2]|0;if((g|0)==(l|0))m=f;else m=f+((uc(g,b[z+(i<<2)>>2]|0,b[l>>2]|0)|0)&1)|0;i=i+1|0;if((i|0)==(r|0))break;else f=m}g=(m|0)>(p|0);d=g?n:d;f=o+1|0;if((f|0)==(r|0))break c;o=f;p=g?m:p;n=b[y+(f<<2)>>2]|0}}}else d=0}else d=0;while(0);jd(y);jd(z);if(d){g=d+4|0;f=b[g>>2]|0;if(!f){if(b[d>>2]|0){K=70;break}}else d=f+8|0;b[d>>2]=A;b[g>>2]=A}else K=73}else K=73;if((K|0)==73){K=0;c=b[A>>2]|0;if(c|0)do{z=c;c=b[c+16>>2]|0;jd(z)}while((c|0)!=0);jd(A);c=1}B=B+1|0;if((B|0)>=(F|0)){J=c;break b}}if((K|0)==50)I(23004,22787,249,23023);else if((K|0)==52)I(23042,22787,252,23023);else if((K|0)==70)I(22862,22787,61,22885)}else J=0;while(0);jd(H);jd(G);K=J;return K|0}return 0}function uc(a,c,d){a=a|0;c=c|0;d=d|0;var f=0.0,g=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0;if(!(ya(c,d)|0)){a=0;return a|0}c=xa(c)|0;f=+e[d>>3];g=+e[d+8>>3];g=c&g<0.0?g+6.283185307179586:g;a=b[a>>2]|0;if(!a){a=0;return a|0}if(c){c=0;l=g;d=a;a:while(1){while(1){i=+e[d>>3];g=+e[d+8>>3];d=d+16|0;m=b[d>>2]|0;m=(m|0)==0?a:m;h=+e[m>>3];j=+e[m+8>>3];if(i>h){k=i;i=j}else{k=h;h=i;i=g;g=j}f=f==h|f==k?f+2.220446049250313e-16:f;if(!(f<h|f>k))break;d=b[d>>2]|0;if(!d){d=22;break a}}j=i<0.0?i+6.283185307179586:i;i=g<0.0?g+6.283185307179586:g;l=j==l|i==l?l+-2.220446049250313e-16:l;k=j+(i-j)*((f-h)/(k-h));if((k<0.0?k+6.283185307179586:k)>l)c=c^1;d=b[d>>2]|0;if(!d){d=22;break}}if((d|0)==22)return c|0}else{c=0;l=g;d=a;b:while(1){while(1){i=+e[d>>3];g=+e[d+8>>3];d=d+16|0;m=b[d>>2]|0;m=(m|0)==0?a:m;h=+e[m>>3];j=+e[m+8>>3];if(i>h){k=i;i=j}else{k=h;h=i;i=g;g=j}f=f==h|f==k?f+2.220446049250313e-16:f;if(!(f<h|f>k))break;d=b[d>>2]|0;if(!d){d=22;break b}}l=i==l|g==l?l+-2.220446049250313e-16:l;if(i+(g-i)*((f-h)/(k-h))>l)c=c^1;d=b[d>>2]|0;if(!d){d=22;break}}if((d|0)==22)return c|0}return 0}function vc(c,d,e,f,g){c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=T;T=T+32|0;t=u+16|0;s=u;h=vd(c|0,d|0,52)|0;H()|0;h=h&15;p=vd(e|0,f|0,52)|0;H()|0;if((h|0)!=(p&15|0)){t=12;T=u;return t|0}l=vd(c|0,d|0,45)|0;H()|0;l=l&127;m=vd(e|0,f|0,45)|0;H()|0;m=m&127;if(l>>>0>121|m>>>0>121){t=5;T=u;return t|0}p=(l|0)!=(m|0);if(p){j=ua(l,m)|0;if((j|0)==7){t=1;T=u;return t|0}k=ua(m,l)|0;if((k|0)==7)I(23066,23090,161,23100);else{q=j;i=k}}else{q=0;i=0}n=ma(l)|0;o=ma(m)|0;b[t>>2]=0;b[t+4>>2]=0;b[t+8>>2]=0;b[t+12>>2]=0;do if(!q){Nb(e,f,t)|0;if((n|0)!=0&(o|0)!=0){if((m|0)!=(l|0))I(23173,23090,261,23100);i=Fb(c,d)|0;h=Fb(e,f)|0;if(!((i|0)==7|(h|0)==7))if(!(a[21872+(i*7|0)+h>>0]|0)){i=b[21040+(i*28|0)+(h<<2)>>2]|0;if((i|0)>0){j=t+4|0;h=0;do{Ra(j);h=h+1|0}while((h|0)!=(i|0));r=51}else r=51}else h=1;else h=5}else r=51}else{m=b[4272+(l*28|0)+(q<<2)>>2]|0;j=(m|0)>0;if(!o)if(j){l=0;k=e;j=f;do{k=Jb(k,j)|0;j=H()|0;i=Ta(i)|0;l=l+1|0}while((l|0)!=(m|0));m=i;l=k;k=j}else{m=i;l=e;k=f}else if(j){l=0;k=e;j=f;do{k=Ib(k,j)|0;j=H()|0;i=Ta(i)|0;if((i|0)==1)i=Ta(1)|0;l=l+1|0}while((l|0)!=(m|0));m=i;l=k;k=j}else{m=i;l=e;k=f}Nb(l,k,t)|0;if(!p)I(23115,23090,191,23100);j=(n|0)!=0;i=(o|0)!=0;if(j&i)I(23142,23090,192,23100);if(!j)if(i){i=Fb(l,k)|0;if((i|0)==7){h=5;break}if(a[21872+(i*7|0)+m>>0]|0){h=1;break}l=0;k=b[21040+(m*28|0)+(i<<2)>>2]|0}else{l=0;k=0}else{i=Fb(c,d)|0;if((i|0)==7){h=5;break}if(a[21872+(i*7|0)+q>>0]|0){h=1;break}k=b[21040+(i*28|0)+(q<<2)>>2]|0;l=k}if((l|k|0)<0)h=5;else{if((k|0)>0){j=t+4|0;i=0;do{Ra(j);i=i+1|0}while((i|0)!=(k|0))};b[s>>2]=0;b[s+4>>2]=0;b[s+8>>2]=0;Pa(s,q);if(h|0)while(1){if(!(Lb(h)|0))Oa(s);else Na(s);if((h|0)>1)h=h+-1|0;else break}if((l|0)>0){h=0;do{Ra(s);h=h+1|0}while((h|0)!=(l|0))}r=t+4|0;Fa(r,s,r);Da(r);r=51}}while(0);if((r|0)==51){h=t+4|0;b[g>>2]=b[h>>2];b[g+4>>2]=b[h+4>>2];b[g+8>>2]=b[h+8>>2];h=0}t=h;T=u;return t|0}function wc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;q=T;T=T+48|0;k=q+36|0;h=q+24|0;i=q+12|0;j=q;f=vd(a|0,c|0,52)|0;H()|0;f=f&15;n=vd(a|0,c|0,45)|0;H()|0;n=n&127;if(n>>>0>121){e=5;T=q;return e|0}l=ma(n)|0;wd(f|0,0,52)|0;r=H()|0|134225919;g=e;b[g>>2]=-1;b[g+4>>2]=r;if(!f){f=Ia(d)|0;if((f|0)==7){r=1;T=q;return r|0}f=ta(n,f)|0;if((f|0)==127){r=1;T=q;return r|0}o=wd(f|0,0,45)|0;p=H()|0;n=e;p=b[n+4>>2]&-1040385|p;r=e;b[r>>2]=b[n>>2]|o;b[r+4>>2]=p;r=0;T=q;return r|0};b[k>>2]=b[d>>2];b[k+4>>2]=b[d+4>>2];b[k+8>>2]=b[d+8>>2];d=f;while(1){g=d;d=d+-1|0;b[h>>2]=b[k>>2];b[h+4>>2]=b[k+4>>2];b[h+8>>2]=b[k+8>>2];if(!(Lb(g)|0)){f=Ka(k)|0;if(f|0){d=13;break};b[i>>2]=b[k>>2];b[i+4>>2]=b[k+4>>2];b[i+8>>2]=b[k+8>>2];Oa(i)}else{f=Ja(k)|0;if(f|0){d=13;break};b[i>>2]=b[k>>2];b[i+4>>2]=b[k+4>>2];b[i+8>>2]=b[k+8>>2];Na(i)}Ga(h,i,j);Da(j);f=e;t=b[f>>2]|0;f=b[f+4>>2]|0;u=(15-g|0)*3|0;s=wd(7,0,u|0)|0;f=f&~(H()|0);u=wd(Ia(j)|0,0,u|0)|0;f=H()|0|f;r=e;b[r>>2]=u|t&~s;b[r+4>>2]=f;if((g|0)<=1){d=14;break}}a:do if((d|0)!=13)if((d|0)==14)if(((b[k>>2]|0)<=1?(b[k+4>>2]|0)<=1:0)?(b[k+8>>2]|0)<=1:0){d=Ia(k)|0;f=ta(n,d)|0;if((f|0)==127)j=0;else j=ma(f)|0;b:do if(!d)if((l|0)!=0&(j|0)!=0){d=Fb(a,c)|0;g=e;g=Fb(b[g>>2]|0,b[g+4>>2]|0)|0;if((d|0)==7|(g|0)==7){f=5;break a}g=b[21248+(d*28|0)+(g<<2)>>2]|0;if((g|0)<0){f=5;break a}if(!g)d=59;else{i=e;d=0;h=b[i>>2]|0;i=b[i+4>>2]|0;do{h=Hb(h,i)|0;i=H()|0;u=e;b[u>>2]=h;b[u+4>>2]=i;d=d+1|0}while((d|0)<(g|0));d=58}}else d=58;else{if(l){f=Fb(a,c)|0;if((f|0)==7){f=5;break a}g=b[21248+(f*28|0)+(d<<2)>>2]|0;if((g|0)>0){f=d;d=0;do{f=Sa(f)|0;d=d+1|0}while((d|0)!=(g|0))}else f=d;if((f|0)==1){f=9;break a}d=ta(n,f)|0;if((d|0)==127)I(23200,23090,411,23230);if(!(ma(d)|0)){p=d;o=g;m=f}else I(23245,23090,412,23230)}else{p=f;o=0;m=d}i=b[4272+(n*28|0)+(m<<2)>>2]|0;if((i|0)<=-1)I(23276,23090,419,23230);if(!j){if((o|0)<0){f=5;break a}if(o|0){g=e;f=0;d=b[g>>2]|0;g=b[g+4>>2]|0;do{d=Hb(d,g)|0;g=H()|0;u=e;b[u>>2]=d;b[u+4>>2]=g;f=f+1|0}while((f|0)<(o|0))}if((i|0)<=0){f=p;d=58;break}g=e;f=0;d=b[g>>2]|0;g=b[g+4>>2]|0;while(1){d=Hb(d,g)|0;g=H()|0;u=e;b[u>>2]=d;b[u+4>>2]=g;f=f+1|0;if((f|0)==(i|0)){f=p;d=58;break b}}}h=ua(p,n)|0;if((h|0)==7)I(23066,23090,428,23230);f=e;d=b[f>>2]|0;f=b[f+4>>2]|0;if((i|0)>0){g=0;do{d=Hb(d,f)|0;f=H()|0;u=e;b[u>>2]=d;b[u+4>>2]=f;g=g+1|0}while((g|0)!=(i|0))}f=Fb(d,f)|0;if((f|0)==7)I(23313,23090,440,23230);d=na(p)|0;d=b[(d?21664:21456)+(h*28|0)+(f<<2)>>2]|0;if((d|0)<0)I(23313,23090,454,23230);if(!d){f=p;d=58}else{h=e;f=0;g=b[h>>2]|0;h=b[h+4>>2]|0;do{g=Gb(g,h)|0;h=H()|0;u=e;b[u>>2]=g;b[u+4>>2]=h;f=f+1|0}while((f|0)<(d|0));f=p;d=58}}while(0);if((d|0)==58)if(j)d=59;if((d|0)==59){u=e;if((Fb(b[u>>2]|0,b[u+4>>2]|0)|0)==1){f=9;break}}u=e;s=b[u>>2]|0;u=b[u+4>>2]&-1040385;t=wd(f|0,0,45)|0;u=u|(H()|0);f=e;b[f>>2]=s|t;b[f+4>>2]=u;f=0}else f=1;while(0);u=f;T=q;return u|0}function xc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=T;T=T+16|0;g=h;if(!e){a=vc(a,b,c,d,g)|0;if(!a){Xa(g,f);a=0}}else a=15;T=h;return a|0}function yc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=T;T=T+16|0;f=g;if(!d){c=Ya(c,f)|0;if(!c)c=wc(a,b,f,e)|0}else c=15;T=g;return c|0}function zc(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=T;T=T+32|0;h=j+12|0;i=j;g=vc(a,c,a,c,h)|0;if(g|0){i=g;T=j;return i|0}a=vc(a,c,d,e,i)|0;if(a|0){i=a;T=j;return i|0}h=Wa(h,i)|0;i=f;b[i>>2]=h;b[i+4>>2]=((h|0)<0)<<31>>31;i=0;T=j;return i|0}function Ac(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=T;T=T+32|0;h=j+12|0;i=j;g=vc(a,c,a,c,h)|0;if(!g){g=vc(a,c,d,e,i)|0;if(!g){e=Wa(h,i)|0;e=ld(e|0,((e|0)<0)<<31>>31|0,1,0)|0;h=H()|0;i=f;b[i>>2]=e;b[i+4>>2]=h;i=0;T=j;return i|0}}i=g;T=j;return i|0}function Bc(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0;z=T;T=T+48|0;h=z+24|0;i=z+12|0;y=z;g=vc(a,c,a,c,h)|0;if(!g){g=vc(a,c,d,e,i)|0;if(!g){w=Wa(h,i)|0;x=((w|0)<0)<<31>>31;b[h>>2]=0;b[h+4>>2]=0;b[h+8>>2]=0;b[i>>2]=0;b[i+4>>2]=0;b[i+8>>2]=0;if(vc(a,c,a,c,h)|0)I(23313,23090,691,23299);if(vc(a,c,d,e,i)|0)I(23313,23090,696,23299);Za(h);Za(i);if(!w){g=h+4|0;d=h+8|0;t=g;u=d;v=h;e=b[h>>2]|0;g=b[g>>2]|0;d=b[d>>2]|0;r=0.0;s=0.0;p=0.0}else{m=b[h>>2]|0;p=+(w|0);t=h+4|0;n=b[t>>2]|0;u=h+8|0;o=b[u>>2]|0;v=h;e=m;g=n;d=o;r=+((b[i>>2]|0)-m|0)/p;s=+((b[i+4>>2]|0)-n|0)/p;p=+((b[i+8>>2]|0)-o|0)/p}b[y>>2]=e;o=y+4|0;b[o>>2]=g;n=y+8|0;b[n>>2]=d;a:do if((w|0)<0)g=0;else{l=0;m=0;g=e;while(1){k=+(m>>>0)+4294967296.0*+(l|0);A=r*k+ +(g|0);j=s*k+ +(b[t>>2]|0);k=p*k+ +(b[u>>2]|0);d=~~+zd(+A);h=~~+zd(+j);g=~~+zd(+k);A=+q(+(+(d|0)-A));j=+q(+(+(h|0)-j));k=+q(+(+(g|0)-k));do if(!(A>j&A>k)){i=0-d|0;if(j>k){e=i-g|0;break}else{e=h;g=i-h|0;break}}else{d=0-(h+g)|0;e=h}while(0);b[y>>2]=d;b[o>>2]=e;b[n>>2]=g;_a(y);g=wc(a,c,y,f+(m<<3)|0)|0;if(g|0)break a;if(!((l|0)<(x|0)|(l|0)==(x|0)&m>>>0<w>>>0)){g=0;break a}g=ld(m|0,l|0,1,0)|0;i=H()|0;l=i;m=g;g=b[v>>2]|0}}while(0);y=g;T=z;return y|0}}y=g;T=z;return y|0}function Cc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;if((c|0)==0&(d|0)==0){e=0;f=1;G(e|0);return f|0}f=a;e=b;a=1;b=0;do{g=(c&1|0)==0&0==0;a=rd((g?1:f)|0,(g?0:e)|0,a|0,b|0)|0;b=H()|0;c=ud(c|0,d|0,1)|0;d=H()|0;f=rd(f|0,e|0,f|0,e|0)|0;e=H()|0}while(!((c|0)==0&(d|0)==0));G(b|0);return a|0}function Dc(a,c,d){a=a|0;c=c|0;d=d|0;var f=0.0,g=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0;if(!(ya(c,d)|0)){o=0;return o|0}c=xa(c)|0;f=+e[d>>3];g=+e[d+8>>3];g=c&g<0.0?g+6.283185307179586:g;o=b[a>>2]|0;if((o|0)<=0){o=0;return o|0}n=b[a+4>>2]|0;if(c){c=0;m=g;d=-1;a=0;a:while(1){l=a;while(1){i=+e[n+(l<<4)>>3];g=+e[n+(l<<4)+8>>3];a=(d+2|0)%(o|0)|0;h=+e[n+(a<<4)>>3];j=+e[n+(a<<4)+8>>3];if(i>h){k=i;i=j}else{k=h;h=i;i=g;g=j}f=f==h|f==k?f+2.220446049250313e-16:f;if(!(f<h|f>k))break;d=l+1|0;if((d|0)>=(o|0)){d=22;break a}else{a=l;l=d;d=a}}j=i<0.0?i+6.283185307179586:i;i=g<0.0?g+6.283185307179586:g;m=j==m|i==m?m+-2.220446049250313e-16:m;k=j+(i-j)*((f-h)/(k-h));if((k<0.0?k+6.283185307179586:k)>m)c=c^1;a=l+1|0;if((a|0)>=(o|0)){d=22;break}else d=l}if((d|0)==22)return c|0}else{c=0;m=g;d=-1;a=0;b:while(1){l=a;while(1){i=+e[n+(l<<4)>>3];g=+e[n+(l<<4)+8>>3];a=(d+2|0)%(o|0)|0;h=+e[n+(a<<4)>>3];j=+e[n+(a<<4)+8>>3];if(i>h){k=i;i=j}else{k=h;h=i;i=g;g=j}f=f==h|f==k?f+2.220446049250313e-16:f;if(!(f<h|f>k))break;d=l+1|0;if((d|0)>=(o|0)){d=22;break b}else{a=l;l=d;d=a}}m=i==m|g==m?m+-2.220446049250313e-16:m;if(i+(g-i)*((f-h)/(k-h))>m)c=c^1;a=l+1|0;if((a|0)>=(o|0)){d=22;break}else d=l}if((d|0)==22)return c|0}return 0}function Ec(a,c){a=a|0;c=c|0;var d=0.0,f=0.0,g=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,r=0,s=0,t=0,u=0,v=0;r=b[a>>2]|0;if(!r){b[c>>2]=0;b[c+4>>2]=0;b[c+8>>2]=0;b[c+12>>2]=0;b[c+16>>2]=0;b[c+20>>2]=0;b[c+24>>2]=0;b[c+28>>2]=0;return}s=c+8|0;e[s>>3]=1797693134862315708145274.0e284;t=c+24|0;e[t>>3]=1797693134862315708145274.0e284;e[c>>3]=-1797693134862315708145274.0e284;u=c+16|0;e[u>>3]=-1797693134862315708145274.0e284;if((r|0)<=0)return;o=b[a+4>>2]|0;l=1797693134862315708145274.0e284;m=-1797693134862315708145274.0e284;n=0;a=-1;h=1797693134862315708145274.0e284;i=1797693134862315708145274.0e284;k=-1797693134862315708145274.0e284;f=-1797693134862315708145274.0e284;p=0;while(1){d=+e[o+(p<<4)>>3];j=+e[o+(p<<4)+8>>3];a=a+2|0;g=+e[o+(((a|0)==(r|0)?0:a)<<4)+8>>3];if(d<h){e[s>>3]=d;h=d}if(j<i){e[t>>3]=j;i=j}if(d>k)e[c>>3]=d;else d=k;if(j>f){e[u>>3]=j;f=j}l=j>0.0&j<l?j:l;m=j<0.0&j>m?j:m;n=n|+q(+(j-g))>3.141592653589793;a=p+1|0;if((a|0)==(r|0))break;else{v=p;k=d;p=a;a=v}}if(!n)return;e[u>>3]=m;e[t>>3]=l;return}function Fc(a,c){a=a|0;c=c|0;var d=0,f=0,g=0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;r=b[a>>2]|0;if(r){s=c+8|0;e[s>>3]=1797693134862315708145274.0e284;t=c+24|0;e[t>>3]=1797693134862315708145274.0e284;e[c>>3]=-1797693134862315708145274.0e284;u=c+16|0;e[u>>3]=-1797693134862315708145274.0e284;if((r|0)>0){g=b[a+4>>2]|0;o=1797693134862315708145274.0e284;p=-1797693134862315708145274.0e284;f=0;d=-1;k=1797693134862315708145274.0e284;l=1797693134862315708145274.0e284;n=-1797693134862315708145274.0e284;i=-1797693134862315708145274.0e284;v=0;while(1){h=+e[g+(v<<4)>>3];m=+e[g+(v<<4)+8>>3];z=d+2|0;j=+e[g+(((z|0)==(r|0)?0:z)<<4)+8>>3];if(h<k){e[s>>3]=h;k=h}if(m<l){e[t>>3]=m;l=m}if(h>n)e[c>>3]=h;else h=n;if(m>i){e[u>>3]=m;i=m}o=m>0.0&m<o?m:o;p=m<0.0&m>p?m:p;f=f|+q(+(m-j))>3.141592653589793;d=v+1|0;if((d|0)==(r|0))break;else{z=v;n=h;v=d;d=z}}if(f){e[u>>3]=p;e[t>>3]=o}}}else{b[c>>2]=0;b[c+4>>2]=0;b[c+8>>2]=0;b[c+12>>2]=0;b[c+16>>2]=0;b[c+20>>2]=0;b[c+24>>2]=0;b[c+28>>2]=0}z=a+8|0;d=b[z>>2]|0;if((d|0)<=0)return;y=a+12|0;x=0;do{g=b[y>>2]|0;f=x;x=x+1|0;t=c+(x<<5)|0;u=b[g+(f<<3)>>2]|0;if(u){v=c+(x<<5)+8|0;e[v>>3]=1797693134862315708145274.0e284;a=c+(x<<5)+24|0;e[a>>3]=1797693134862315708145274.0e284;e[t>>3]=-1797693134862315708145274.0e284;w=c+(x<<5)+16|0;e[w>>3]=-1797693134862315708145274.0e284;if((u|0)>0){r=b[g+(f<<3)+4>>2]|0;o=1797693134862315708145274.0e284;p=-1797693134862315708145274.0e284;g=0;f=-1;s=0;k=1797693134862315708145274.0e284;l=1797693134862315708145274.0e284;m=-1797693134862315708145274.0e284;i=-1797693134862315708145274.0e284;while(1){h=+e[r+(s<<4)>>3];n=+e[r+(s<<4)+8>>3];f=f+2|0;j=+e[r+(((f|0)==(u|0)?0:f)<<4)+8>>3];if(h<k){e[v>>3]=h;k=h}if(n<l){e[a>>3]=n;l=n}if(h>m)e[t>>3]=h;else h=m;if(n>i){e[w>>3]=n;i=n}o=n>0.0&n<o?n:o;p=n<0.0&n>p?n:p;g=g|+q(+(n-j))>3.141592653589793;f=s+1|0;if((f|0)==(u|0))break;else{A=s;s=f;m=h;f=A}}if(g){e[w>>3]=p;e[a>>3]=o}}}else{b[t>>2]=0;b[t+4>>2]=0;b[t+8>>2]=0;b[t+12>>2]=0;b[t+16>>2]=0;b[t+20>>2]=0;b[t+24>>2]=0;b[t+28>>2]=0;d=b[z>>2]|0}}while((x|0)<(d|0));return}function Gc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0;if(!(Dc(a,c,d)|0)){f=0;return f|0}f=a+8|0;if((b[f>>2]|0)<=0){f=1;return f|0}e=a+12|0;a=0;while(1){g=a;a=a+1|0;if(Dc((b[e>>2]|0)+(g<<3)|0,c+(a<<5)|0,d)|0){a=0;e=6;break}if((a|0)>=(b[f>>2]|0)){a=1;e=6;break}}if((e|0)==6)return a|0;return 0}function Hc(){return 8}function Ic(){return 16}function Jc(){return 168}function Kc(){return 8}function Lc(){return 16}function Mc(){return 12}function Nc(){return 8}function Oc(a){a=a|0;return +(+((b[a>>2]|0)>>>0)+4294967296.0*+(b[a+4>>2]|0))}function Pc(a){a=a|0;var b=0.0,c=0.0;c=+e[a>>3];b=+e[a+8>>3];return +(+r(+(c*c+b*b)))}function Qc(a,b,c,d,f){a=a|0;b=b|0;c=c|0;d=d|0;f=f|0;var g=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;k=+e[a>>3];j=+e[b>>3]-k;i=+e[a+8>>3];h=+e[b+8>>3]-i;m=+e[c>>3];g=+e[d>>3]-m;n=+e[c+8>>3];l=+e[d+8>>3]-n;g=(g*(i-n)-(k-m)*l)/(j*l-h*g);e[f>>3]=k+j*g;e[f+8>>3]=i+h*g;return}function Rc(a,b){a=a|0;b=b|0;if(!(+q(+(+e[a>>3]-+e[b>>3]))<1.1920928955078125e-07)){b=0;return b|0}b=+q(+(+e[a+8>>3]-+e[b+8>>3]))<1.1920928955078125e-07;return b|0}function Sc(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,f=0.0;f=+e[a>>3]-+e[b>>3];d=+e[a+8>>3]-+e[b+8>>3];c=+e[a+16>>3]-+e[b+16>>3];return +(f*f+d*d+c*c)}function Tc(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,f=0.0;c=+e[a>>3];d=+t(+c);c=+u(+c);e[b+16>>3]=c;c=+e[a+8>>3];f=d*+t(+c);e[b>>3]=f;c=d*+u(+c);e[b+8>>3]=c;return}function Uc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0;g=T;T=T+16|0;f=g;e=xb(a,c)|0;if((d+-1|0)>>>0>5){f=-1;T=g;return f|0}e=(e|0)!=0;if((d|0)==1&e){f=-1;T=g;return f|0}do if(!(Vc(a,c,f)|0))if(e){e=((b[21936+(d<<2)>>2]|0)+5-(b[f>>2]|0)|0)%5|0;break}else{e=((b[21968+(d<<2)>>2]|0)+6-(b[f>>2]|0)|0)%6|0;break}else e=-1;while(0);f=e;T=g;return f|0}function Vc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=T;T=T+32|0;h=k+16|0;i=k;e=Ob(a,c,h)|0;if(e|0){d=e;T=k;return d|0}g=tb(a,c)|0;j=Fb(a,c)|0;qa(g,i);e=ra(g,b[h>>2]|0)|0;a:do if(ma(g)|0){do switch(g|0){case 4:{a=0;break}case 14:{a=1;break}case 24:{a=2;break}case 38:{a=3;break}case 49:{a=4;break}case 58:{a=5;break}case 63:{a=6;break}case 72:{a=7;break}case 83:{a=8;break}case 97:{a=9;break}case 107:{a=10;break}case 117:{a=11;break}default:{e=1;break a}}while(0);f=b[22e3+(a*24|0)+8>>2]|0;c=b[22e3+(a*24|0)+16>>2]|0;a=b[h>>2]|0;if((a|0)!=(b[i>>2]|0)){i=na(g)|0;a=b[h>>2]|0;if(i|(a|0)==(c|0))e=(e+1|0)%6|0}if((j|0)==3&(a|0)==(c|0)){e=(e+5|0)%6|0;f=22;break}if((j|0)==5&(a|0)==(f|0)){e=(e+1|0)%6|0;f=22}else f=22}else f=22;while(0);if((f|0)==22){b[d>>2]=e;e=0}d=e;T=k;return d|0}function Wc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=T;T=T+32|0;t=u+24|0;r=u+20|0;p=u+8|0;o=u+16|0;n=u;j=(xb(a,c)|0)==0;j=j?6:5;l=vd(a|0,c|0,52)|0;H()|0;l=l&15;if(j>>>0<=d>>>0){e=2;T=u;return e|0}m=(l|0)==0;if(!m?(q=wd(7,0,(l^15)*3|0)|0,(q&a|0)==0&((H()|0)&c|0)==0):0)f=d;else g=4;a:do if((g|0)==4){f=(xb(a,c)|0)!=0;if(((f?4:5)|0)<(d|0)){e=1;T=u;return e|0}if(Vc(a,c,t)|0){e=1;T=u;return e|0}g=(b[t>>2]|0)+d|0;if(f)f=22288+(((g|0)%5|0)<<2)|0;else f=22320+(((g|0)%6|0)<<2)|0;q=b[f>>2]|0;if((q|0)==7){e=1;T=u;return e|0}b[r>>2]=0;f=ea(a,c,q,r,p)|0;do if(!f){i=p;k=b[i>>2]|0;i=b[i+4>>2]|0;h=i>>>0<c>>>0|(i|0)==(c|0)&k>>>0<a>>>0;g=h?k:a;h=h?i:c;if(!m?(m=wd(7,0,(l^15)*3|0)|0,(k&m|0)==0&(i&(H()|0)|0)==0):0)f=d;else{i=(d+-1+j|0)%(j|0)|0;f=xb(a,c)|0;if((i|0)<0)I(23313,23315,245,23324);j=(f|0)!=0;if(((j?4:5)|0)<(i|0))I(23313,23315,245,23324);if(Vc(a,c,t)|0)I(23313,23315,245,23324);f=(b[t>>2]|0)+i|0;if(j)f=22288+(((f|0)%5|0)<<2)|0;else f=22320+(((f|0)%6|0)<<2)|0;i=b[f>>2]|0;if((i|0)==7)I(23313,23315,245,23324);b[o>>2]=0;f=ea(a,c,i,o,n)|0;if(f|0)break;k=n;j=b[k>>2]|0;k=b[k+4>>2]|0;do if(k>>>0<h>>>0|(k|0)==(h|0)&j>>>0<g>>>0){if(!(xb(j,k)|0))g=b[22384+((((b[o>>2]|0)+(b[22352+(i<<2)>>2]|0)|0)%6|0)<<2)>>2]|0;else g=fa(j,k,a,c)|0;f=xb(j,k)|0;if((g+-1|0)>>>0>5){f=-1;g=j;h=k;break}f=(f|0)!=0;if((g|0)==1&f){f=-1;g=j;h=k;break}do if(!(Vc(j,k,t)|0))if(f){f=((b[21936+(g<<2)>>2]|0)+5-(b[t>>2]|0)|0)%5|0;break}else{f=((b[21968+(g<<2)>>2]|0)+6-(b[t>>2]|0)|0)%6|0;break}else f=-1;while(0);g=j;h=k}else f=d;while(0);i=p;k=b[i>>2]|0;i=b[i+4>>2]|0}if((g|0)==(k|0)&(h|0)==(i|0)){j=(xb(k,i)|0)!=0;if(j)a=fa(k,i,a,c)|0;else a=b[22384+((((b[r>>2]|0)+(b[22352+(q<<2)>>2]|0)|0)%6|0)<<2)>>2]|0;f=xb(k,i)|0;if((a+-1|0)>>>0<=5?(s=(f|0)!=0,!((a|0)==1&s)):0)do if(!(Vc(k,i,t)|0))if(s){f=((b[21936+(a<<2)>>2]|0)+5-(b[t>>2]|0)|0)%5|0;break}else{f=((b[21968+(a<<2)>>2]|0)+6-(b[t>>2]|0)|0)%6|0;break}else f=-1;while(0);else f=-1;f=f+1|0;f=(f|0)==6|j&(f|0)==5?0:f}c=h;a=g;break a}while(0);e=f;T=u;return e|0}while(0);s=wd(f|0,0,56)|0;t=H()|0|c&-2130706433|536870912;b[e>>2]=s|a;b[e+4>>2]=t;e=0;T=u;return e|0}function Xc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0;g=(xb(a,c)|0)==0;e=Wc(a,c,0,d)|0;f=(e|0)==0;if(g){if(!f){g=e;return g|0}e=Wc(a,c,1,d+8|0)|0;if(e|0){g=e;return g|0}e=Wc(a,c,2,d+16|0)|0;if(e|0){g=e;return g|0}e=Wc(a,c,3,d+24|0)|0;if(e|0){g=e;return g|0}e=Wc(a,c,4,d+32|0)|0;if(!e)return Wc(a,c,5,d+40|0)|0;else{g=e;return g|0}}if(!f){g=e;return g|0}e=Wc(a,c,1,d+8|0)|0;if(e|0){g=e;return g|0}e=Wc(a,c,2,d+16|0)|0;if(e|0){g=e;return g|0}e=Wc(a,c,3,d+24|0)|0;if(e|0){g=e;return g|0}e=Wc(a,c,4,d+32|0)|0;if(e|0){g=e;return g|0}g=d+40|0;b[g>>2]=0;b[g+4>>2]=0;g=0;return g|0}function Yc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=T;T=T+192|0;f=j;g=j+168|0;h=vd(a|0,c|0,56)|0;H()|0;h=h&7;i=c&-2130706433|134217728;e=Ob(a,i,g)|0;if(e|0){i=e;T=j;return i|0}c=vd(a|0,c|0,52)|0;H()|0;c=c&15;if(!(xb(a,i)|0))qb(g,c,h,1,f);else mb(g,c,h,1,f);i=f+8|0;b[d>>2]=b[i>>2];b[d+4>>2]=b[i+4>>2];b[d+8>>2]=b[i+8>>2];b[d+12>>2]=b[i+12>>2];i=0;T=j;return i|0}function Zc(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0;f=T;T=T+16|0;d=f;if(!(0==0&(c&2013265920|0)==536870912)){e=0;T=f;return e|0}e=c&-2130706433|134217728;if(!(ub(a,e)|0)){e=0;T=f;return e|0}g=vd(a|0,c|0,56)|0;H()|0;g=(Wc(a,e,g&7,d)|0)==0;e=d;e=g&((b[e>>2]|0)==(a|0)?(b[e+4>>2]|0)==(c|0):0)&1;T=f;return e|0}function _c(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;if((c|0)>0){e=kd(c,4)|0;b[a>>2]=e;if(!e)I(23337,23360,40,23374)}else b[a>>2]=0;b[a+4>>2]=c;b[a+8>>2]=0;b[a+12>>2]=d;return}function $c(a){a=a|0;var c=0,d=0,f=0,g=0,h=0,i=0,j=0;g=a+4|0;h=a+12|0;i=a+8|0;a:while(1){d=b[g>>2]|0;c=0;while(1){if((c|0)>=(d|0))break a;f=b[a>>2]|0;j=b[f+(c<<2)>>2]|0;if(!j)c=c+1|0;else break}c=f+(~~(+q(+(+s(10.0,+(+(15-(b[h>>2]|0)|0)))*(+e[j>>3]+ +e[j+8>>3])))%+(d|0))>>>0<<2)|0;d=b[c>>2]|0;b:do if(d|0){f=j+32|0;if((d|0)==(j|0))b[c>>2]=b[f>>2];else{d=d+32|0;c=b[d>>2]|0;if(!c)break;while(1){if((c|0)==(j|0))break;d=c+32|0;c=b[d>>2]|0;if(!c)break b}b[d>>2]=b[f>>2]}jd(j);b[i>>2]=(b[i>>2]|0)+-1}while(0)}jd(b[a>>2]|0);return}function ad(a){a=a|0;var c=0,d=0,e=0;e=b[a+4>>2]|0;d=0;while(1){if((d|0)>=(e|0)){c=0;d=4;break}c=b[(b[a>>2]|0)+(d<<2)>>2]|0;if(!c)d=d+1|0;else{d=4;break}}if((d|0)==4)return c|0;return 0}function bd(a,c){a=a|0;c=c|0;var d=0,f=0,g=0,h=0;d=~~(+q(+(+s(10.0,+(+(15-(b[a+12>>2]|0)|0)))*(+e[c>>3]+ +e[c+8>>3])))%+(b[a+4>>2]|0))>>>0;d=(b[a>>2]|0)+(d<<2)|0;f=b[d>>2]|0;if(!f){h=1;return h|0}h=c+32|0;do if((f|0)!=(c|0)){d=b[f+32>>2]|0;if(!d){h=1;return h|0}g=d;while(1){if((g|0)==(c|0)){g=8;break}d=b[g+32>>2]|0;if(!d){d=1;g=10;break}else{f=g;g=d}}if((g|0)==8){b[f+32>>2]=b[h>>2];break}else if((g|0)==10)return d|0}else b[d>>2]=b[h>>2];while(0);jd(c);h=a+8|0;b[h>>2]=(b[h>>2]|0)+-1;h=0;return h|0}function cd(a,c,d){a=a|0;c=c|0;d=d|0;var f=0,g=0,h=0,i=0;h=id(40)|0;if(!h)I(23390,23360,98,23403);b[h>>2]=b[c>>2];b[h+4>>2]=b[c+4>>2];b[h+8>>2]=b[c+8>>2];b[h+12>>2]=b[c+12>>2];g=h+16|0;b[g>>2]=b[d>>2];b[g+4>>2]=b[d+4>>2];b[g+8>>2]=b[d+8>>2];b[g+12>>2]=b[d+12>>2];b[h+32>>2]=0;g=~~(+q(+(+s(10.0,+(+(15-(b[a+12>>2]|0)|0)))*(+e[c>>3]+ +e[c+8>>3])))%+(b[a+4>>2]|0))>>>0;g=(b[a>>2]|0)+(g<<2)|0;f=b[g>>2]|0;do if(!f)b[g>>2]=h;else{while(1){if(_b(f,c)|0?_b(f+16|0,d)|0:0)break;g=b[f+32>>2]|0;f=(g|0)==0?f:g;if(!(b[f+32>>2]|0)){i=10;break}}if((i|0)==10){b[f+32>>2]=h;break}jd(h);i=f;return i|0}while(0);i=a+8|0;b[i>>2]=(b[i>>2]|0)+1;i=h;return i|0}function dd(a,c,d){a=a|0;c=c|0;d=d|0;var f=0,g=0;g=~~(+q(+(+s(10.0,+(+(15-(b[a+12>>2]|0)|0)))*(+e[c>>3]+ +e[c+8>>3])))%+(b[a+4>>2]|0))>>>0;g=b[(b[a>>2]|0)+(g<<2)>>2]|0;if(!g){d=0;return d|0}if(!d){a=g;while(1){if(_b(a,c)|0){f=10;break}a=b[a+32>>2]|0;if(!a){a=0;f=10;break}}if((f|0)==10)return a|0}a=g;while(1){if(_b(a,c)|0?_b(a+16|0,d)|0:0){f=10;break}a=b[a+32>>2]|0;if(!a){a=0;f=10;break}}if((f|0)==10)return a|0;return 0}function ed(a,c){a=a|0;c=c|0;var d=0;d=~~(+q(+(+s(10.0,+(+(15-(b[a+12>>2]|0)|0)))*(+e[c>>3]+ +e[c+8>>3])))%+(b[a+4>>2]|0))>>>0;a=b[(b[a>>2]|0)+(d<<2)>>2]|0;if(!a){d=0;return d|0}while(1){if(_b(a,c)|0){c=5;break}a=b[a+32>>2]|0;if(!a){a=0;c=5;break}}if((c|0)==5)return a|0;return 0}function fd(){return 23424}function gd(a){a=+a;return +(+Cd(+a))}function hd(a){a=+a;return ~~+gd(a)|0}function id(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=T;T=T+16|0;n=w;do if(a>>>0<245){k=a>>>0<11?16:a+11&-8;a=k>>>3;m=b[5857]|0;d=m>>>a;if(d&3|0){c=(d&1^1)+a|0;a=23468+(c<<1<<2)|0;d=a+8|0;e=b[d>>2]|0;f=e+8|0;g=b[f>>2]|0;if((g|0)==(a|0))b[5857]=m&~(1<<c);else{b[g+12>>2]=a;b[d>>2]=g}v=c<<3;b[e+4>>2]=v|3;v=e+v+4|0;b[v>>2]=b[v>>2]|1;v=f;T=w;return v|0}l=b[5859]|0;if(k>>>0>l>>>0){if(d|0){c=2<<a;c=d<<a&(c|0-c);c=(c&0-c)+-1|0;i=c>>>12&16;c=c>>>i;d=c>>>5&8;c=c>>>d;g=c>>>2&4;c=c>>>g;a=c>>>1&2;c=c>>>a;e=c>>>1&1;e=(d|i|g|a|e)+(c>>>e)|0;c=23468+(e<<1<<2)|0;a=c+8|0;g=b[a>>2]|0;i=g+8|0;d=b[i>>2]|0;if((d|0)==(c|0)){a=m&~(1<<e);b[5857]=a}else{b[d+12>>2]=c;b[a>>2]=d;a=m}v=e<<3;h=v-k|0;b[g+4>>2]=k|3;f=g+k|0;b[f+4>>2]=h|1;b[g+v>>2]=h;if(l|0){e=b[5862]|0;c=l>>>3;d=23468+(c<<1<<2)|0;c=1<<c;if(!(a&c)){b[5857]=a|c;c=d;a=d+8|0}else{a=d+8|0;c=b[a>>2]|0}b[a>>2]=e;b[c+12>>2]=e;b[e+8>>2]=c;b[e+12>>2]=d}b[5859]=h;b[5862]=f;v=i;T=w;return v|0}g=b[5858]|0;if(g){d=(g&0-g)+-1|0;f=d>>>12&16;d=d>>>f;e=d>>>5&8;d=d>>>e;h=d>>>2&4;d=d>>>h;i=d>>>1&2;d=d>>>i;j=d>>>1&1;j=b[23732+((e|f|h|i|j)+(d>>>j)<<2)>>2]|0;d=j;i=j;j=(b[j+4>>2]&-8)-k|0;while(1){a=b[d+16>>2]|0;if(!a){a=b[d+20>>2]|0;if(!a)break}h=(b[a+4>>2]&-8)-k|0;f=h>>>0<j>>>0;d=a;i=f?a:i;j=f?h:j}h=i+k|0;if(h>>>0>i>>>0){f=b[i+24>>2]|0;c=b[i+12>>2]|0;do if((c|0)==(i|0)){a=i+20|0;c=b[a>>2]|0;if(!c){a=i+16|0;c=b[a>>2]|0;if(!c){d=0;break}}while(1){e=c+20|0;d=b[e>>2]|0;if(!d){e=c+16|0;d=b[e>>2]|0;if(!d)break;else{c=d;a=e}}else{c=d;a=e}}b[a>>2]=0;d=c}else{d=b[i+8>>2]|0;b[d+12>>2]=c;b[c+8>>2]=d;d=c}while(0);do if(f|0){c=b[i+28>>2]|0;a=23732+(c<<2)|0;if((i|0)==(b[a>>2]|0)){b[a>>2]=d;if(!d){b[5858]=g&~(1<<c);break}}else{v=f+16|0;b[((b[v>>2]|0)==(i|0)?v:f+20|0)>>2]=d;if(!d)break}b[d+24>>2]=f;c=b[i+16>>2]|0;if(c|0){b[d+16>>2]=c;b[c+24>>2]=d}c=b[i+20>>2]|0;if(c|0){b[d+20>>2]=c;b[c+24>>2]=d}}while(0);if(j>>>0<16){v=j+k|0;b[i+4>>2]=v|3;v=i+v+4|0;b[v>>2]=b[v>>2]|1}else{b[i+4>>2]=k|3;b[h+4>>2]=j|1;b[h+j>>2]=j;if(l|0){e=b[5862]|0;c=l>>>3;d=23468+(c<<1<<2)|0;c=1<<c;if(!(c&m)){b[5857]=c|m;c=d;a=d+8|0}else{a=d+8|0;c=b[a>>2]|0}b[a>>2]=e;b[c+12>>2]=e;b[e+8>>2]=c;b[e+12>>2]=d}b[5859]=j;b[5862]=h}v=i+8|0;T=w;return v|0}else m=k}else m=k}else m=k}else if(a>>>0<=4294967231){a=a+11|0;k=a&-8;e=b[5858]|0;if(e){f=0-k|0;a=a>>>8;if(a)if(k>>>0>16777215)j=31;else{m=(a+1048320|0)>>>16&8;q=a<<m;i=(q+520192|0)>>>16&4;q=q<<i;j=(q+245760|0)>>>16&2;j=14-(i|m|j)+(q<<j>>>15)|0;j=k>>>(j+7|0)&1|j<<1}else j=0;d=b[23732+(j<<2)>>2]|0;a:do if(!d){d=0;a=0;q=61}else{a=0;i=k<<((j|0)==31?0:25-(j>>>1)|0);g=0;while(1){h=(b[d+4>>2]&-8)-k|0;if(h>>>0<f>>>0)if(!h){a=d;f=0;q=65;break a}else{a=d;f=h}q=b[d+20>>2]|0;d=b[d+16+(i>>>31<<2)>>2]|0;g=(q|0)==0|(q|0)==(d|0)?g:q;if(!d){d=g;q=61;break}else i=i<<1}}while(0);if((q|0)==61){if((d|0)==0&(a|0)==0){a=2<<j;a=(a|0-a)&e;if(!a){m=k;break}m=(a&0-a)+-1|0;h=m>>>12&16;m=m>>>h;g=m>>>5&8;m=m>>>g;i=m>>>2&4;m=m>>>i;j=m>>>1&2;m=m>>>j;d=m>>>1&1;a=0;d=b[23732+((g|h|i|j|d)+(m>>>d)<<2)>>2]|0}if(!d){i=a;h=f}else q=65}if((q|0)==65){g=d;while(1){m=(b[g+4>>2]&-8)-k|0;d=m>>>0<f>>>0;f=d?m:f;a=d?g:a;d=b[g+16>>2]|0;if(!d)d=b[g+20>>2]|0;if(!d){i=a;h=f;break}else g=d}}if(((i|0)!=0?h>>>0<((b[5859]|0)-k|0)>>>0:0)?(l=i+k|0,l>>>0>i>>>0):0){g=b[i+24>>2]|0;c=b[i+12>>2]|0;do if((c|0)==(i|0)){a=i+20|0;c=b[a>>2]|0;if(!c){a=i+16|0;c=b[a>>2]|0;if(!c){c=0;break}}while(1){f=c+20|0;d=b[f>>2]|0;if(!d){f=c+16|0;d=b[f>>2]|0;if(!d)break;else{c=d;a=f}}else{c=d;a=f}}b[a>>2]=0}else{v=b[i+8>>2]|0;b[v+12>>2]=c;b[c+8>>2]=v}while(0);do if(g){a=b[i+28>>2]|0;d=23732+(a<<2)|0;if((i|0)==(b[d>>2]|0)){b[d>>2]=c;if(!c){e=e&~(1<<a);b[5858]=e;break}}else{v=g+16|0;b[((b[v>>2]|0)==(i|0)?v:g+20|0)>>2]=c;if(!c)break}b[c+24>>2]=g;a=b[i+16>>2]|0;if(a|0){b[c+16>>2]=a;b[a+24>>2]=c}a=b[i+20>>2]|0;if(a){b[c+20>>2]=a;b[a+24>>2]=c}}while(0);b:do if(h>>>0<16){v=h+k|0;b[i+4>>2]=v|3;v=i+v+4|0;b[v>>2]=b[v>>2]|1}else{b[i+4>>2]=k|3;b[l+4>>2]=h|1;b[l+h>>2]=h;c=h>>>3;if(h>>>0<256){d=23468+(c<<1<<2)|0;a=b[5857]|0;c=1<<c;if(!(a&c)){b[5857]=a|c;c=d;a=d+8|0}else{a=d+8|0;c=b[a>>2]|0}b[a>>2]=l;b[c+12>>2]=l;b[l+8>>2]=c;b[l+12>>2]=d;break}c=h>>>8;if(c)if(h>>>0>16777215)d=31;else{u=(c+1048320|0)>>>16&8;v=c<<u;t=(v+520192|0)>>>16&4;v=v<<t;d=(v+245760|0)>>>16&2;d=14-(t|u|d)+(v<<d>>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;c=23732+(d<<2)|0;b[l+28>>2]=d;a=l+16|0;b[a+4>>2]=0;b[a>>2]=0;a=1<<d;if(!(e&a)){b[5858]=e|a;b[c>>2]=l;b[l+24>>2]=c;b[l+12>>2]=l;b[l+8>>2]=l;break}c=b[c>>2]|0;c:do if((b[c+4>>2]&-8|0)!=(h|0)){e=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){d=c+16+(e>>>31<<2)|0;a=b[d>>2]|0;if(!a)break;if((b[a+4>>2]&-8|0)==(h|0)){c=a;break c}else{e=e<<1;c=a}}b[d>>2]=l;b[l+24>>2]=c;b[l+12>>2]=l;b[l+8>>2]=l;break b}while(0);u=c+8|0;v=b[u>>2]|0;b[v+12>>2]=l;b[u>>2]=l;b[l+8>>2]=v;b[l+12>>2]=c;b[l+24>>2]=0}while(0);v=i+8|0;T=w;return v|0}else m=k}else m=k}else m=-1;while(0);d=b[5859]|0;if(d>>>0>=m>>>0){c=d-m|0;a=b[5862]|0;if(c>>>0>15){v=a+m|0;b[5862]=v;b[5859]=c;b[v+4>>2]=c|1;b[a+d>>2]=c;b[a+4>>2]=m|3}else{b[5859]=0;b[5862]=0;b[a+4>>2]=d|3;v=a+d+4|0;b[v>>2]=b[v>>2]|1}v=a+8|0;T=w;return v|0}h=b[5860]|0;if(h>>>0>m>>>0){t=h-m|0;b[5860]=t;v=b[5863]|0;u=v+m|0;b[5863]=u;b[u+4>>2]=t|1;b[v+4>>2]=m|3;v=v+8|0;T=w;return v|0}if(!(b[5975]|0)){b[5977]=4096;b[5976]=4096;b[5978]=-1;b[5979]=-1;b[5980]=0;b[5968]=0;b[5975]=n&-16^1431655768;a=4096}else a=b[5977]|0;i=m+48|0;j=m+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=m>>>0){v=0;T=w;return v|0}a=b[5967]|0;if(a|0?(l=b[5965]|0,n=l+k|0,n>>>0<=l>>>0|n>>>0>a>>>0):0){v=0;T=w;return v|0}d:do if(!(b[5968]&4)){d=b[5863]|0;e:do if(d){e=23876;while(1){n=b[e>>2]|0;if(n>>>0<=d>>>0?(n+(b[e+4>>2]|0)|0)>>>0>d>>>0:0)break;a=b[e+8>>2]|0;if(!a){q=128;break e}else e=a}c=g-h&f;if(c>>>0<2147483647){a=Dd(c|0)|0;if((a|0)==((b[e>>2]|0)+(b[e+4>>2]|0)|0)){if((a|0)!=(-1|0)){h=c;g=a;q=145;break d}}else{e=a;q=136}}else c=0}else q=128;while(0);do if((q|0)==128){d=Dd(0)|0;if((d|0)!=(-1|0)?(c=d,o=b[5976]|0,p=o+-1|0,c=((p&c|0)==0?0:(p+c&0-o)-c|0)+k|0,o=b[5965]|0,p=c+o|0,c>>>0>m>>>0&c>>>0<2147483647):0){n=b[5967]|0;if(n|0?p>>>0<=o>>>0|p>>>0>n>>>0:0){c=0;break}a=Dd(c|0)|0;if((a|0)==(d|0)){h=c;g=d;q=145;break d}else{e=a;q=136}}else c=0}while(0);do if((q|0)==136){d=0-c|0;if(!(i>>>0>c>>>0&(c>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){c=0;break}else{h=c;g=e;q=145;break d}a=b[5977]|0;a=j-c+a&0-a;if(a>>>0>=2147483647){h=c;g=e;q=145;break d}if((Dd(a|0)|0)==(-1|0)){Dd(d|0)|0;c=0;break}else{h=a+c|0;g=e;q=145;break d}}while(0);b[5968]=b[5968]|4;q=143}else{c=0;q=143}while(0);if(((q|0)==143?k>>>0<2147483647:0)?(t=Dd(k|0)|0,p=Dd(0)|0,r=p-t|0,s=r>>>0>(m+40|0)>>>0,!((t|0)==(-1|0)|s^1|t>>>0<p>>>0&((t|0)!=(-1|0)&(p|0)!=(-1|0))^1)):0){h=s?r:c;g=t;q=145}if((q|0)==145){c=(b[5965]|0)+h|0;b[5965]=c;if(c>>>0>(b[5966]|0)>>>0)b[5966]=c;j=b[5863]|0;f:do if(j){c=23876;while(1){a=b[c>>2]|0;d=b[c+4>>2]|0;if((g|0)==(a+d|0)){q=154;break}e=b[c+8>>2]|0;if(!e)break;else c=e}if(((q|0)==154?(u=c+4|0,(b[c+12>>2]&8|0)==0):0)?g>>>0>j>>>0&a>>>0<=j>>>0:0){b[u>>2]=d+h;v=(b[5860]|0)+h|0;t=j+8|0;t=(t&7|0)==0?0:0-t&7;u=j+t|0;t=v-t|0;b[5863]=u;b[5860]=t;b[u+4>>2]=t|1;b[j+v+4>>2]=40;b[5864]=b[5979];break}if(g>>>0<(b[5861]|0)>>>0)b[5861]=g;d=g+h|0;c=23876;while(1){if((b[c>>2]|0)==(d|0)){q=162;break}a=b[c+8>>2]|0;if(!a)break;else c=a}if((q|0)==162?(b[c+12>>2]&8|0)==0:0){b[c>>2]=g;l=c+4|0;b[l>>2]=(b[l>>2]|0)+h;l=g+8|0;l=g+((l&7|0)==0?0:0-l&7)|0;c=d+8|0;c=d+((c&7|0)==0?0:0-c&7)|0;k=l+m|0;i=c-l-m|0;b[l+4>>2]=m|3;g:do if((j|0)==(c|0)){v=(b[5860]|0)+i|0;b[5860]=v;b[5863]=k;b[k+4>>2]=v|1}else{if((b[5862]|0)==(c|0)){v=(b[5859]|0)+i|0;b[5859]=v;b[5862]=k;b[k+4>>2]=v|1;b[k+v>>2]=v;break}a=b[c+4>>2]|0;if((a&3|0)==1){h=a&-8;e=a>>>3;h:do if(a>>>0<256){a=b[c+8>>2]|0;d=b[c+12>>2]|0;if((d|0)==(a|0)){b[5857]=b[5857]&~(1<<e);break}else{b[a+12>>2]=d;b[d+8>>2]=a;break}}else{g=b[c+24>>2]|0;a=b[c+12>>2]|0;do if((a|0)==(c|0)){d=c+16|0;e=d+4|0;a=b[e>>2]|0;if(!a){a=b[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=b[f>>2]|0;if(!e){f=a+16|0;e=b[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}b[d>>2]=0}else{v=b[c+8>>2]|0;b[v+12>>2]=a;b[a+8>>2]=v}while(0);if(!g)break;d=b[c+28>>2]|0;e=23732+(d<<2)|0;do if((b[e>>2]|0)!=(c|0)){v=g+16|0;b[((b[v>>2]|0)==(c|0)?v:g+20|0)>>2]=a;if(!a)break h}else{b[e>>2]=a;if(a|0)break;b[5858]=b[5858]&~(1<<d);break h}while(0);b[a+24>>2]=g;d=c+16|0;e=b[d>>2]|0;if(e|0){b[a+16>>2]=e;b[e+24>>2]=a}d=b[d+4>>2]|0;if(!d)break;b[a+20>>2]=d;b[d+24>>2]=a}while(0);c=c+h|0;f=h+i|0}else f=i;c=c+4|0;b[c>>2]=b[c>>2]&-2;b[k+4>>2]=f|1;b[k+f>>2]=f;c=f>>>3;if(f>>>0<256){d=23468+(c<<1<<2)|0;a=b[5857]|0;c=1<<c;if(!(a&c)){b[5857]=a|c;c=d;a=d+8|0}else{a=d+8|0;c=b[a>>2]|0}b[a>>2]=k;b[c+12>>2]=k;b[k+8>>2]=c;b[k+12>>2]=d;break}c=f>>>8;do if(!c)e=0;else{if(f>>>0>16777215){e=31;break}u=(c+1048320|0)>>>16&8;v=c<<u;t=(v+520192|0)>>>16&4;v=v<<t;e=(v+245760|0)>>>16&2;e=14-(t|u|e)+(v<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}while(0);c=23732+(e<<2)|0;b[k+28>>2]=e;a=k+16|0;b[a+4>>2]=0;b[a>>2]=0;a=b[5858]|0;d=1<<e;if(!(a&d)){b[5858]=a|d;b[c>>2]=k;b[k+24>>2]=c;b[k+12>>2]=k;b[k+8>>2]=k;break}c=b[c>>2]|0;i:do if((b[c+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=c+16+(e>>>31<<2)|0;a=b[d>>2]|0;if(!a)break;if((b[a+4>>2]&-8|0)==(f|0)){c=a;break i}else{e=e<<1;c=a}}b[d>>2]=k;b[k+24>>2]=c;b[k+12>>2]=k;b[k+8>>2]=k;break g}while(0);u=c+8|0;v=b[u>>2]|0;b[v+12>>2]=k;b[u>>2]=k;b[k+8>>2]=v;b[k+12>>2]=c;b[k+24>>2]=0}while(0);v=l+8|0;T=w;return v|0}c=23876;while(1){a=b[c>>2]|0;if(a>>>0<=j>>>0?(v=a+(b[c+4>>2]|0)|0,v>>>0>j>>>0):0)break;c=b[c+8>>2]|0}f=v+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=j+16|0;a=a>>>0<f>>>0?j:a;c=a+8|0;d=h+-40|0;t=g+8|0;t=(t&7|0)==0?0:0-t&7;u=g+t|0;t=d-t|0;b[5863]=u;b[5860]=t;b[u+4>>2]=t|1;b[g+d+4>>2]=40;b[5864]=b[5979];d=a+4|0;b[d>>2]=27;b[c>>2]=b[5969];b[c+4>>2]=b[5970];b[c+8>>2]=b[5971];b[c+12>>2]=b[5972];b[5969]=g;b[5970]=h;b[5972]=0;b[5971]=c;c=a+24|0;do{u=c;c=c+4|0;b[c>>2]=7}while((u+8|0)>>>0<v>>>0);if((a|0)!=(j|0)){g=a-j|0;b[d>>2]=b[d>>2]&-2;b[j+4>>2]=g|1;b[a>>2]=g;c=g>>>3;if(g>>>0<256){d=23468+(c<<1<<2)|0;a=b[5857]|0;c=1<<c;if(!(a&c)){b[5857]=a|c;c=d;a=d+8|0}else{a=d+8|0;c=b[a>>2]|0}b[a>>2]=j;b[c+12>>2]=j;b[j+8>>2]=c;b[j+12>>2]=d;break}c=g>>>8;if(c)if(g>>>0>16777215)e=31;else{u=(c+1048320|0)>>>16&8;v=c<<u;t=(v+520192|0)>>>16&4;v=v<<t;e=(v+245760|0)>>>16&2;e=14-(t|u|e)+(v<<e>>>15)|0;e=g>>>(e+7|0)&1|e<<1}else e=0;d=23732+(e<<2)|0;b[j+28>>2]=e;b[j+20>>2]=0;b[f>>2]=0;c=b[5858]|0;a=1<<e;if(!(c&a)){b[5858]=c|a;b[d>>2]=j;b[j+24>>2]=d;b[j+12>>2]=j;b[j+8>>2]=j;break}c=b[d>>2]|0;j:do if((b[c+4>>2]&-8|0)!=(g|0)){e=g<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=c+16+(e>>>31<<2)|0;a=b[d>>2]|0;if(!a)break;if((b[a+4>>2]&-8|0)==(g|0)){c=a;break j}else{e=e<<1;c=a}}b[d>>2]=j;b[j+24>>2]=c;b[j+12>>2]=j;b[j+8>>2]=j;break f}while(0);u=c+8|0;v=b[u>>2]|0;b[v+12>>2]=j;b[u>>2]=j;b[j+8>>2]=v;b[j+12>>2]=c;b[j+24>>2]=0}}else{v=b[5861]|0;if((v|0)==0|g>>>0<v>>>0)b[5861]=g;b[5969]=g;b[5970]=h;b[5972]=0;b[5866]=b[5975];b[5865]=-1;b[5870]=23468;b[5869]=23468;b[5872]=23476;b[5871]=23476;b[5874]=23484;b[5873]=23484;b[5876]=23492;b[5875]=23492;b[5878]=23500;b[5877]=23500;b[5880]=23508;b[5879]=23508;b[5882]=23516;b[5881]=23516;b[5884]=23524;b[5883]=23524;b[5886]=23532;b[5885]=23532;b[5888]=23540;b[5887]=23540;b[5890]=23548;b[5889]=23548;b[5892]=23556;b[5891]=23556;b[5894]=23564;b[5893]=23564;b[5896]=23572;b[5895]=23572;b[5898]=23580;b[5897]=23580;b[5900]=23588;b[5899]=23588;b[5902]=23596;b[5901]=23596;b[5904]=23604;b[5903]=23604;b[5906]=23612;b[5905]=23612;b[5908]=23620;b[5907]=23620;b[5910]=23628;b[5909]=23628;b[5912]=23636;b[5911]=23636;b[5914]=23644;b[5913]=23644;b[5916]=23652;b[5915]=23652;b[5918]=23660;b[5917]=23660;b[5920]=23668;b[5919]=23668;b[5922]=23676;b[5921]=23676;b[5924]=23684;b[5923]=23684;b[5926]=23692;b[5925]=23692;b[5928]=23700;b[5927]=23700;b[5930]=23708;b[5929]=23708;b[5932]=23716;b[5931]=23716;v=h+-40|0;t=g+8|0;t=(t&7|0)==0?0:0-t&7;u=g+t|0;t=v-t|0;b[5863]=u;b[5860]=t;b[u+4>>2]=t|1;b[g+v+4>>2]=40;b[5864]=b[5979]}while(0);c=b[5860]|0;if(c>>>0>m>>>0){t=c-m|0;b[5860]=t;v=b[5863]|0;u=v+m|0;b[5863]=u;b[u+4>>2]=t|1;b[v+4>>2]=m|3;v=v+8|0;T=w;return v|0}}v=fd()|0;b[v>>2]=12;v=0;T=w;return v|0}function jd(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;d=a+-8|0;f=b[5861]|0;a=b[a+-4>>2]|0;c=a&-8;j=d+c|0;do if(!(a&1)){e=b[d>>2]|0;if(!(a&3))return;h=d+(0-e)|0;g=e+c|0;if(h>>>0<f>>>0)return;if((b[5862]|0)==(h|0)){a=j+4|0;c=b[a>>2]|0;if((c&3|0)!=3){i=h;c=g;break}b[5859]=g;b[a>>2]=c&-2;b[h+4>>2]=g|1;b[h+g>>2]=g;return}d=e>>>3;if(e>>>0<256){a=b[h+8>>2]|0;c=b[h+12>>2]|0;if((c|0)==(a|0)){b[5857]=b[5857]&~(1<<d);i=h;c=g;break}else{b[a+12>>2]=c;b[c+8>>2]=a;i=h;c=g;break}}f=b[h+24>>2]|0;a=b[h+12>>2]|0;do if((a|0)==(h|0)){c=h+16|0;d=c+4|0;a=b[d>>2]|0;if(!a){a=b[c>>2]|0;if(!a){a=0;break}}else c=d;while(1){e=a+20|0;d=b[e>>2]|0;if(!d){e=a+16|0;d=b[e>>2]|0;if(!d)break;else{a=d;c=e}}else{a=d;c=e}}b[c>>2]=0}else{i=b[h+8>>2]|0;b[i+12>>2]=a;b[a+8>>2]=i}while(0);if(f){c=b[h+28>>2]|0;d=23732+(c<<2)|0;if((b[d>>2]|0)==(h|0)){b[d>>2]=a;if(!a){b[5858]=b[5858]&~(1<<c);i=h;c=g;break}}else{i=f+16|0;b[((b[i>>2]|0)==(h|0)?i:f+20|0)>>2]=a;if(!a){i=h;c=g;break}}b[a+24>>2]=f;c=h+16|0;d=b[c>>2]|0;if(d|0){b[a+16>>2]=d;b[d+24>>2]=a}c=b[c+4>>2]|0;if(c){b[a+20>>2]=c;b[c+24>>2]=a;i=h;c=g}else{i=h;c=g}}else{i=h;c=g}}else{i=d;h=d}while(0);if(h>>>0>=j>>>0)return;a=j+4|0;e=b[a>>2]|0;if(!(e&1))return;if(!(e&2)){if((b[5863]|0)==(j|0)){j=(b[5860]|0)+c|0;b[5860]=j;b[5863]=i;b[i+4>>2]=j|1;if((i|0)!=(b[5862]|0))return;b[5862]=0;b[5859]=0;return}if((b[5862]|0)==(j|0)){j=(b[5859]|0)+c|0;b[5859]=j;b[5862]=h;b[i+4>>2]=j|1;b[h+j>>2]=j;return}f=(e&-8)+c|0;d=e>>>3;do if(e>>>0<256){c=b[j+8>>2]|0;a=b[j+12>>2]|0;if((a|0)==(c|0)){b[5857]=b[5857]&~(1<<d);break}else{b[c+12>>2]=a;b[a+8>>2]=c;break}}else{g=b[j+24>>2]|0;a=b[j+12>>2]|0;do if((a|0)==(j|0)){c=j+16|0;d=c+4|0;a=b[d>>2]|0;if(!a){a=b[c>>2]|0;if(!a){d=0;break}}else c=d;while(1){e=a+20|0;d=b[e>>2]|0;if(!d){e=a+16|0;d=b[e>>2]|0;if(!d)break;else{a=d;c=e}}else{a=d;c=e}}b[c>>2]=0;d=a}else{d=b[j+8>>2]|0;b[d+12>>2]=a;b[a+8>>2]=d;d=a}while(0);if(g|0){a=b[j+28>>2]|0;c=23732+(a<<2)|0;if((b[c>>2]|0)==(j|0)){b[c>>2]=d;if(!d){b[5858]=b[5858]&~(1<<a);break}}else{e=g+16|0;b[((b[e>>2]|0)==(j|0)?e:g+20|0)>>2]=d;if(!d)break}b[d+24>>2]=g;a=j+16|0;c=b[a>>2]|0;if(c|0){b[d+16>>2]=c;b[c+24>>2]=d}a=b[a+4>>2]|0;if(a|0){b[d+20>>2]=a;b[a+24>>2]=d}}}while(0);b[i+4>>2]=f|1;b[h+f>>2]=f;if((i|0)==(b[5862]|0)){b[5859]=f;return}}else{b[a>>2]=e&-2;b[i+4>>2]=c|1;b[h+c>>2]=c;f=c}a=f>>>3;if(f>>>0<256){d=23468+(a<<1<<2)|0;c=b[5857]|0;a=1<<a;if(!(c&a)){b[5857]=c|a;a=d;c=d+8|0}else{c=d+8|0;a=b[c>>2]|0}b[c>>2]=i;b[a+12>>2]=i;b[i+8>>2]=a;b[i+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)e=31;else{h=(a+1048320|0)>>>16&8;j=a<<h;g=(j+520192|0)>>>16&4;j=j<<g;e=(j+245760|0)>>>16&2;e=14-(g|h|e)+(j<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;a=23732+(e<<2)|0;b[i+28>>2]=e;b[i+20>>2]=0;b[i+16>>2]=0;c=b[5858]|0;d=1<<e;a:do if(!(c&d)){b[5858]=c|d;b[a>>2]=i;b[i+24>>2]=a;b[i+12>>2]=i;b[i+8>>2]=i}else{a=b[a>>2]|0;b:do if((b[a+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=a+16+(e>>>31<<2)|0;c=b[d>>2]|0;if(!c)break;if((b[c+4>>2]&-8|0)==(f|0)){a=c;break b}else{e=e<<1;a=c}}b[d>>2]=i;b[i+24>>2]=a;b[i+12>>2]=i;b[i+8>>2]=i;break a}while(0);h=a+8|0;j=b[h>>2]|0;b[j+12>>2]=i;b[h>>2]=i;b[i+8>>2]=j;b[i+12>>2]=a;b[i+24>>2]=0}while(0);j=(b[5865]|0)+-1|0;b[5865]=j;if(j|0)return;a=23884;while(1){a=b[a>>2]|0;if(!a)break;else a=a+8|0}b[5865]=-1;return}function kd(a,c){a=a|0;c=c|0;var d=0;if(a){d=B(c,a)|0;if((c|a)>>>0>65535)d=((d>>>0)/(a>>>0)|0|0)==(c|0)?d:-1}else d=0;a=id(d)|0;if(!a)return a|0;if(!(b[a+-4>>2]&3))return a|0;Bd(a|0,0,d|0)|0;return a|0}function ld(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (G(b+d+(c>>>0<a>>>0|0)>>>0|0),c|0)|0}function md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (G(d|0),a-c>>>0|0)|0}function nd(a){a=a|0;return (a?31-(E(a^a-1)|0)|0:32)|0}function od(a,c,d,e,f){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=c;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){b[f>>2]=(l>>>0)%(h>>>0);b[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (G(n|0),f)|0}else{if(!g){n=0;f=0;return (G(n|0),f)|0}b[f>>2]=a|0;b[f+4>>2]=c&0;n=0;f=0;return (G(n|0),f)|0}}g=(i|0)==0;do if(h){if(!g){g=(E(i|0)|0)-(E(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;c=g-31>>31;h=m;a=l>>>(m>>>0)&c|k<<i;c=k>>>(m>>>0)&c;g=0;i=l<<i;break}if(!f){n=0;f=0;return (G(n|0),f)|0}b[f>>2]=a|0;b[f+4>>2]=j|c&0;n=0;f=0;return (G(n|0),f)|0}g=h-1|0;if(g&h|0){i=(E(h|0)|0)+33-(E(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;c=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&c;c=c&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f|0){b[f>>2]=g&l;b[f+4>>2]=0}if((h|0)==1){o=j|c&0;p=a|0|0;return (G(o|0),p)|0}else{p=nd(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (G(o|0),p)|0}}else{if(g){if(f|0){b[f>>2]=(k>>>0)%(h>>>0);b[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (G(o|0),p)|0}if(!l){if(f|0){b[f>>2]=0;b[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (G(o|0),p)|0}g=i-1|0;if(!(g&i)){if(f|0){b[f>>2]=a|0;b[f+4>>2]=g&k|c&0}o=0;p=k>>>((nd(i|0)|0)>>>0);return (G(o|0),p)|0}g=(E(i|0)|0)-(E(k|0)|0)|0;if(g>>>0<=30){c=g+1|0;i=31-g|0;h=c;a=k<<i|l>>>(c>>>0);c=k>>>(c>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return (G(o|0),p)|0}b[f>>2]=a|0;b[f+4>>2]=j|c&0;o=0;p=0;return (G(o|0),p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=ld(m|0,l|0,-1,-1)|0;d=H()|0;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|c<<1|0;md(k|0,d|0,e|0,n|0)|0;p=H()|0;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=md(e|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;c=H()|0;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f|0){b[f>>2]=a;b[f+4>>2]=c}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (G(o|0),p)|0}function pd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=md(j^a|0,i^b|0,j|0,i|0)|0;g=H()|0;a=f^j;b=e^i;return md((od(h,g,md(f^c|0,e^d|0,f|0,e|0)|0,H()|0,0)|0)^a|0,(H()|0)^b|0,a|0,b|0)|0}function qd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=B(e,f)|0;d=a>>>16;a=(c>>>16)+(B(e,d)|0)|0;e=b>>>16;b=B(e,f)|0;return (G((a>>>16)+(B(e,d)|0)+(((a&65535)+b|0)>>>16)|0),a+b<<16|c&65535|0)|0}function rd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=qd(e,f)|0;a=H()|0;return (G((B(b,f)|0)+(B(d,e)|0)+a|a&0|0),c|0|0)|0}function sd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=T;T=T+16|0;i=f|0;h=c>>31|((c|0)<0?-1:0)<<1;g=((c|0)<0?-1:0)>>31|((c|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;j=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=md(h^a|0,g^c|0,h|0,g|0)|0;c=H()|0;od(a,c,md(k^d|0,j^e|0,k|0,j|0)|0,H()|0,i)|0;e=md(b[i>>2]^h|0,b[i+4>>2]^g|0,h|0,g|0)|0;d=H()|0;T=f;return (G(d|0),e)|0}function td(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=T;T=T+16|0;f=g|0;od(a,c,d,e,f)|0;T=g;return (G(b[f+4>>2]|0),b[f>>2]|0)|0}function ud(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){G(b>>c|0);return a>>>c|(b&(1<<c)-1)<<32-c}G(((b|0)<0?-1:0)|0);return b>>c-32|0}function vd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){G(b>>>c|0);return a>>>c|(b&(1<<c)-1)<<32-c}G(0);return b>>>c-32|0}function wd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){G(b<<c|(a&(1<<c)-1<<32-c)>>>32-c|0);return a<<c}G(a<<c-32|0);return 0}function xd(a,b){a=+a;b=+b;if(a!=a)return +b;if(b!=b)return +a;return +D(+a,+b)}function yd(a,b){a=+a;b=+b;if(a!=a)return +b;if(b!=b)return +a;return +C(+a,+b)}function zd(a){a=+a;return a>=0.0?+p(a+.5):+A(a-.5)}function Ad(c,d,e){c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192){L(c|0,d|0,e|0)|0;return c|0}h=c|0;g=c+e|0;if((c&3)==(d&3)){while(c&3){if(!e)return h|0;a[c>>0]=a[d>>0]|0;c=c+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((c|0)<=(f|0)){b[c>>2]=b[d>>2];b[c+4>>2]=b[d+4>>2];b[c+8>>2]=b[d+8>>2];b[c+12>>2]=b[d+12>>2];b[c+16>>2]=b[d+16>>2];b[c+20>>2]=b[d+20>>2];b[c+24>>2]=b[d+24>>2];b[c+28>>2]=b[d+28>>2];b[c+32>>2]=b[d+32>>2];b[c+36>>2]=b[d+36>>2];b[c+40>>2]=b[d+40>>2];b[c+44>>2]=b[d+44>>2];b[c+48>>2]=b[d+48>>2];b[c+52>>2]=b[d+52>>2];b[c+56>>2]=b[d+56>>2];b[c+60>>2]=b[d+60>>2];c=c+64|0;d=d+64|0}while((c|0)<(e|0)){b[c>>2]=b[d>>2];c=c+4|0;d=d+4|0}}else{e=g-4|0;while((c|0)<(e|0)){a[c>>0]=a[d>>0]|0;a[c+1>>0]=a[d+1>>0]|0;a[c+2>>0]=a[d+2>>0]|0;a[c+3>>0]=a[d+3>>0]|0;c=c+4|0;d=d+4|0}}while((c|0)<(g|0)){a[c>>0]=a[d>>0]|0;c=c+1|0;d=d+1|0}return h|0}function Bd(c,d,e){c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=c+e|0;d=d&255;if((e|0)>=67){while(c&3){a[c>>0]=d;c=c+1|0}f=h&-4|0;i=d|d<<8|d<<16|d<<24;g=f-64|0;while((c|0)<=(g|0)){b[c>>2]=i;b[c+4>>2]=i;b[c+8>>2]=i;b[c+12>>2]=i;b[c+16>>2]=i;b[c+20>>2]=i;b[c+24>>2]=i;b[c+28>>2]=i;b[c+32>>2]=i;b[c+36>>2]=i;b[c+40>>2]=i;b[c+44>>2]=i;b[c+48>>2]=i;b[c+52>>2]=i;b[c+56>>2]=i;b[c+60>>2]=i;c=c+64|0}while((c|0)<(f|0)){b[c>>2]=i;c=c+4|0}}while((c|0)<(h|0)){a[c>>0]=d;c=c+1|0}return h-e|0}function Cd(a){a=+a;return a>=0.0?+p(a+.5):+A(a-.5)}function Dd(a){a=a|0;var c=0,d=0,e=0;e=K()|0;d=b[g>>2]|0;c=d+a|0;if((a|0)>0&(c|0)<(d|0)|(c|0)<0){N(c|0)|0;J(12);return -1}if((c|0)>(e|0))if(!(M(c|0)|0)){J(12);return -1}b[g>>2]=c;return d|0}\n\n// EMSCRIPTEN_END_FUNCS\nreturn{___divdi3:pd,___muldi3:rd,___remdi3:sd,___uremdi3:td,_areNeighborCells:$a,_bitshift64Ashr:ud,_bitshift64Lshr:vd,_bitshift64Shl:wd,_calloc:kd,_cellAreaKm2:lc,_cellAreaM2:mc,_cellAreaRads2:kc,_cellToBoundary:Qb,_cellToCenterChild:Ab,_cellToChildPos:Vb,_cellToChildren:yb,_cellToChildrenSize:wb,_cellToLatLng:Pb,_cellToLocalIj:xc,_cellToParent:vb,_cellToVertex:Wc,_cellToVertexes:Xc,_cellsToDirectedEdge:ab,_cellsToLinkedMultiPolygon:la,_childPosToCell:Wb,_compactCells:Bb,_destroyLinkedMultiPolygon:sc,_directedEdgeToBoundary:gb,_directedEdgeToCells:eb,_edgeLengthKm:oc,_edgeLengthM:pc,_edgeLengthRads:nc,_emscripten_replace_memory:W,_free:jd,_getBaseCellNumber:tb,_getDirectedEdgeDestination:cb,_getDirectedEdgeOrigin:bb,_getHexagonAreaAvgKm2:ec,_getHexagonAreaAvgM2:fc,_getHexagonEdgeLengthAvgKm:gc,_getHexagonEdgeLengthAvgM:hc,_getIcosahedronFaces:Sb,_getNumCells:ic,_getPentagons:Ub,_getRes0Cells:wa,_getResolution:sb,_greatCircleDistanceKm:ac,_greatCircleDistanceM:bc,_greatCircleDistanceRads:$b,_gridDisk:aa,_gridDiskDistances:ba,_gridDistance:zc,_gridPathCells:Bc,_gridPathCellsSize:Ac,_gridRingUnsafe:ga,_i64Add:ld,_i64Subtract:md,_isPentagon:xb,_isResClassIII:Eb,_isValidCell:ub,_isValidDirectedEdge:db,_isValidVertex:Zc,_latLngToCell:Mb,_llvm_maxnum_f64:xd,_llvm_minnum_f64:yd,_llvm_round_f64:zd,_localIjToCell:yc,_malloc:id,_maxFaceCount:Rb,_maxGridDiskSize:$,_maxPolygonToCellsSize:ha,_memcpy:Ad,_memset:Bd,_originToDirectedEdges:fb,_pentagonCount:Tb,_polygonToCells:ja,_readInt64AsDoubleFromPointer:Oc,_res0CellCount:va,_round:Cd,_sbrk:Dd,_sizeOfCellBoundary:Jc,_sizeOfCoordIJ:Nc,_sizeOfGeoLoop:Kc,_sizeOfGeoPolygon:Lc,_sizeOfH3Index:Hc,_sizeOfLatLng:Ic,_sizeOfLinkedGeoPolygon:Mc,_uncompactCells:Cb,_uncompactCellsSize:Db,_vertexToLatLng:Yc,establishStackSpace:_,stackAlloc:X,stackRestore:Z,stackSave:Y}})\n\n\n// EMSCRIPTEN_END_ASM\n(asmGlobalArg,asmLibraryArg,buffer);var ___divdi3=Module[\"___divdi3\"]=asm[\"___divdi3\"];var ___muldi3=Module[\"___muldi3\"]=asm[\"___muldi3\"];var ___remdi3=Module[\"___remdi3\"]=asm[\"___remdi3\"];var ___uremdi3=Module[\"___uremdi3\"]=asm[\"___uremdi3\"];var _areNeighborCells=Module[\"_areNeighborCells\"]=asm[\"_areNeighborCells\"];var _bitshift64Ashr=Module[\"_bitshift64Ashr\"]=asm[\"_bitshift64Ashr\"];var _bitshift64Lshr=Module[\"_bitshift64Lshr\"]=asm[\"_bitshift64Lshr\"];var _bitshift64Shl=Module[\"_bitshift64Shl\"]=asm[\"_bitshift64Shl\"];var _calloc=Module[\"_calloc\"]=asm[\"_calloc\"];var _cellAreaKm2=Module[\"_cellAreaKm2\"]=asm[\"_cellAreaKm2\"];var _cellAreaM2=Module[\"_cellAreaM2\"]=asm[\"_cellAreaM2\"];var _cellAreaRads2=Module[\"_cellAreaRads2\"]=asm[\"_cellAreaRads2\"];var _cellToBoundary=Module[\"_cellToBoundary\"]=asm[\"_cellToBoundary\"];var _cellToCenterChild=Module[\"_cellToCenterChild\"]=asm[\"_cellToCenterChild\"];var _cellToChildPos=Module[\"_cellToChildPos\"]=asm[\"_cellToChildPos\"];var _cellToChildren=Module[\"_cellToChildren\"]=asm[\"_cellToChildren\"];var _cellToChildrenSize=Module[\"_cellToChildrenSize\"]=asm[\"_cellToChildrenSize\"];var _cellToLatLng=Module[\"_cellToLatLng\"]=asm[\"_cellToLatLng\"];var _cellToLocalIj=Module[\"_cellToLocalIj\"]=asm[\"_cellToLocalIj\"];var _cellToParent=Module[\"_cellToParent\"]=asm[\"_cellToParent\"];var _cellToVertex=Module[\"_cellToVertex\"]=asm[\"_cellToVertex\"];var _cellToVertexes=Module[\"_cellToVertexes\"]=asm[\"_cellToVertexes\"];var _cellsToDirectedEdge=Module[\"_cellsToDirectedEdge\"]=asm[\"_cellsToDirectedEdge\"];var _cellsToLinkedMultiPolygon=Module[\"_cellsToLinkedMultiPolygon\"]=asm[\"_cellsToLinkedMultiPolygon\"];var _childPosToCell=Module[\"_childPosToCell\"]=asm[\"_childPosToCell\"];var _compactCells=Module[\"_compactCells\"]=asm[\"_compactCells\"];var _destroyLinkedMultiPolygon=Module[\"_destroyLinkedMultiPolygon\"]=asm[\"_destroyLinkedMultiPolygon\"];var _directedEdgeToBoundary=Module[\"_directedEdgeToBoundary\"]=asm[\"_directedEdgeToBoundary\"];var _directedEdgeToCells=Module[\"_directedEdgeToCells\"]=asm[\"_directedEdgeToCells\"];var _edgeLengthKm=Module[\"_edgeLengthKm\"]=asm[\"_edgeLengthKm\"];var _edgeLengthM=Module[\"_edgeLengthM\"]=asm[\"_edgeLengthM\"];var _edgeLengthRads=Module[\"_edgeLengthRads\"]=asm[\"_edgeLengthRads\"];var _emscripten_replace_memory=Module[\"_emscripten_replace_memory\"]=asm[\"_emscripten_replace_memory\"];var _free=Module[\"_free\"]=asm[\"_free\"];var _getBaseCellNumber=Module[\"_getBaseCellNumber\"]=asm[\"_getBaseCellNumber\"];var _getDirectedEdgeDestination=Module[\"_getDirectedEdgeDestination\"]=asm[\"_getDirectedEdgeDestination\"];var _getDirectedEdgeOrigin=Module[\"_getDirectedEdgeOrigin\"]=asm[\"_getDirectedEdgeOrigin\"];var _getHexagonAreaAvgKm2=Module[\"_getHexagonAreaAvgKm2\"]=asm[\"_getHexagonAreaAvgKm2\"];var _getHexagonAreaAvgM2=Module[\"_getHexagonAreaAvgM2\"]=asm[\"_getHexagonAreaAvgM2\"];var _getHexagonEdgeLengthAvgKm=Module[\"_getHexagonEdgeLengthAvgKm\"]=asm[\"_getHexagonEdgeLengthAvgKm\"];var _getHexagonEdgeLengthAvgM=Module[\"_getHexagonEdgeLengthAvgM\"]=asm[\"_getHexagonEdgeLengthAvgM\"];var _getIcosahedronFaces=Module[\"_getIcosahedronFaces\"]=asm[\"_getIcosahedronFaces\"];var _getNumCells=Module[\"_getNumCells\"]=asm[\"_getNumCells\"];var _getPentagons=Module[\"_getPentagons\"]=asm[\"_getPentagons\"];var _getRes0Cells=Module[\"_getRes0Cells\"]=asm[\"_getRes0Cells\"];var _getResolution=Module[\"_getResolution\"]=asm[\"_getResolution\"];var _greatCircleDistanceKm=Module[\"_greatCircleDistanceKm\"]=asm[\"_greatCircleDistanceKm\"];var _greatCircleDistanceM=Module[\"_greatCircleDistanceM\"]=asm[\"_greatCircleDistanceM\"];var _greatCircleDistanceRads=Module[\"_greatCircleDistanceRads\"]=asm[\"_greatCircleDistanceRads\"];var _gridDisk=Module[\"_gridDisk\"]=asm[\"_gridDisk\"];var _gridDiskDistances=Module[\"_gridDiskDistances\"]=asm[\"_gridDiskDistances\"];var _gridDistance=Module[\"_gridDistance\"]=asm[\"_gridDistance\"];var _gridPathCells=Module[\"_gridPathCells\"]=asm[\"_gridPathCells\"];var _gridPathCellsSize=Module[\"_gridPathCellsSize\"]=asm[\"_gridPathCellsSize\"];var _gridRingUnsafe=Module[\"_gridRingUnsafe\"]=asm[\"_gridRingUnsafe\"];var _i64Add=Module[\"_i64Add\"]=asm[\"_i64Add\"];var _i64Subtract=Module[\"_i64Subtract\"]=asm[\"_i64Subtract\"];var _isPentagon=Module[\"_isPentagon\"]=asm[\"_isPentagon\"];var _isResClassIII=Module[\"_isResClassIII\"]=asm[\"_isResClassIII\"];var _isValidCell=Module[\"_isValidCell\"]=asm[\"_isValidCell\"];var _isValidDirectedEdge=Module[\"_isValidDirectedEdge\"]=asm[\"_isValidDirectedEdge\"];var _isValidVertex=Module[\"_isValidVertex\"]=asm[\"_isValidVertex\"];var _latLngToCell=Module[\"_latLngToCell\"]=asm[\"_latLngToCell\"];var _llvm_maxnum_f64=Module[\"_llvm_maxnum_f64\"]=asm[\"_llvm_maxnum_f64\"];var _llvm_minnum_f64=Module[\"_llvm_minnum_f64\"]=asm[\"_llvm_minnum_f64\"];var _llvm_round_f64=Module[\"_llvm_round_f64\"]=asm[\"_llvm_round_f64\"];var _localIjToCell=Module[\"_localIjToCell\"]=asm[\"_localIjToCell\"];var _malloc=Module[\"_malloc\"]=asm[\"_malloc\"];var _maxFaceCount=Module[\"_maxFaceCount\"]=asm[\"_maxFaceCount\"];var _maxGridDiskSize=Module[\"_maxGridDiskSize\"]=asm[\"_maxGridDiskSize\"];var _maxPolygonToCellsSize=Module[\"_maxPolygonToCellsSize\"]=asm[\"_maxPolygonToCellsSize\"];var _memcpy=Module[\"_memcpy\"]=asm[\"_memcpy\"];var _memset=Module[\"_memset\"]=asm[\"_memset\"];var _originToDirectedEdges=Module[\"_originToDirectedEdges\"]=asm[\"_originToDirectedEdges\"];var _pentagonCount=Module[\"_pentagonCount\"]=asm[\"_pentagonCount\"];var _polygonToCells=Module[\"_polygonToCells\"]=asm[\"_polygonToCells\"];var _readInt64AsDoubleFromPointer=Module[\"_readInt64AsDoubleFromPointer\"]=asm[\"_readInt64AsDoubleFromPointer\"];var _res0CellCount=Module[\"_res0CellCount\"]=asm[\"_res0CellCount\"];var _round=Module[\"_round\"]=asm[\"_round\"];var _sbrk=Module[\"_sbrk\"]=asm[\"_sbrk\"];var _sizeOfCellBoundary=Module[\"_sizeOfCellBoundary\"]=asm[\"_sizeOfCellBoundary\"];var _sizeOfCoordIJ=Module[\"_sizeOfCoordIJ\"]=asm[\"_sizeOfCoordIJ\"];var _sizeOfGeoLoop=Module[\"_sizeOfGeoLoop\"]=asm[\"_sizeOfGeoLoop\"];var _sizeOfGeoPolygon=Module[\"_sizeOfGeoPolygon\"]=asm[\"_sizeOfGeoPolygon\"];var _sizeOfH3Index=Module[\"_sizeOfH3Index\"]=asm[\"_sizeOfH3Index\"];var _sizeOfLatLng=Module[\"_sizeOfLatLng\"]=asm[\"_sizeOfLatLng\"];var _sizeOfLinkedGeoPolygon=Module[\"_sizeOfLinkedGeoPolygon\"]=asm[\"_sizeOfLinkedGeoPolygon\"];var _uncompactCells=Module[\"_uncompactCells\"]=asm[\"_uncompactCells\"];var _uncompactCellsSize=Module[\"_uncompactCellsSize\"]=asm[\"_uncompactCellsSize\"];var _vertexToLatLng=Module[\"_vertexToLatLng\"]=asm[\"_vertexToLatLng\"];var establishStackSpace=Module[\"establishStackSpace\"]=asm[\"establishStackSpace\"];var stackAlloc=Module[\"stackAlloc\"]=asm[\"stackAlloc\"];var stackRestore=Module[\"stackRestore\"]=asm[\"stackRestore\"];var stackSave=Module[\"stackSave\"]=asm[\"stackSave\"];Module[\"asm\"]=asm;Module[\"cwrap\"]=cwrap;Module[\"setValue\"]=setValue;Module[\"getValue\"]=getValue;if(memoryInitializer){if(!isDataURI(memoryInitializer)){memoryInitializer=locateFile(memoryInitializer)}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=readBinary(memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency(\"memory initializer\");var applyMemoryInitializer=function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module[\"memoryInitializerRequest\"])delete Module[\"memoryInitializerRequest\"].response;removeRunDependency(\"memory initializer\")};var doBrowserLoad=function(){readAsync(memoryInitializer,applyMemoryInitializer,function(){throw\"could not load memory initializer \"+memoryInitializer})};var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module[\"memoryInitializerRequest\"]){var useRequest=function(){var request=Module[\"memoryInitializerRequest\"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module[\"memoryInitializerRequestURL\"]);if(data){response=data.buffer}else{console.warn(\"a problem seems to have happened with Module.memoryInitializerRequest, status: \"+request.status+\", retrying \"+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)};if(Module[\"memoryInitializerRequest\"].response){setTimeout(useRequest,0)}else{Module[\"memoryInitializerRequest\"].addEventListener(\"load\",useRequest)}}else{doBrowserLoad()}}}var calledRun;function ExitStatus(status){this.name=\"ExitStatus\";this.message=\"Program terminated with exit(\"+status+\")\";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;if(ABORT)return;initRuntime();preMain();if(Module[\"onRuntimeInitialized\"])Module[\"onRuntimeInitialized\"]();postRun()}if(Module[\"setStatus\"]){Module[\"setStatus\"](\"Running...\");setTimeout(function(){setTimeout(function(){Module[\"setStatus\"](\"\")},1);doRun()},1)}else{doRun()}}Module[\"run\"]=run;function abort(what){if(Module[\"onAbort\"]){Module[\"onAbort\"](what)}what+=\"\";out(what);err(what);ABORT=true;EXITSTATUS=1;throw\"abort(\"+what+\"). Build with -s ASSERTIONS=1 for more info.\"}Module[\"abort\"]=abort;if(Module[\"preInit\"]){if(typeof Module[\"preInit\"]==\"function\")Module[\"preInit\"]=[Module[\"preInit\"]];while(Module[\"preInit\"].length>0){Module[\"preInit\"].pop()()}}noExitRuntime=true;run();\n\n\n\n  return libh3\n}\n)(typeof libh3 === 'object' ? libh3 : {});\nexport default libh3;", "/*\n * Copyright 2018-2019, 2022 Uber Technologies, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Define the C bindings for the h3 library\n\n// Add some aliases to make the function definitions more intelligible\nconst NUMBER = 'number';\nconst H3_ERROR = NUMBER;\nconst BOOLEAN = NUMBER;\nconst H3_LOWER = NUMBER;\nconst H3_UPPER = NUMBER;\nconst RESOLUTION = NUMBER;\nconst POINTER = NUMBER;\n\n// Define the bindings to functions in the C lib. Functions are defined as\n// [name, return type, [arg types]]. You must run `npm run build-emscripten`\n// before new functions added here will be available.\n/** @type {([string, string] | [string, string | null, string[]])[]} */\nexport default [\n    // The size functions are inserted via build/sizes.h\n    ['sizeOfH3Index', NUMBER],\n    ['sizeOfLatLng', NUMBER],\n    ['sizeOfCellBoundary', NUMBER],\n    ['sizeOfGeoLoop', NUMBER],\n    ['sizeOfGeoPolygon', NUMBER],\n    ['sizeOfLinkedGeoPolygon', NUMBER],\n    ['sizeOfCoordIJ', NUMBER],\n    ['readInt64AsDoubleFromPointer', NUMBER],\n    // The remaining functions are defined in the core lib in h3Api.h\n    ['isValidCell', BOOLEAN, [H3_LOWER, H3_UPPER]],\n    ['latLngToCell', H3_ERROR, [NUMBER, NUMBER, RESOLUTION, POINTER]],\n    ['cellToLatLng', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['cellToBoundary', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['maxGridDiskSize', H3_ERROR, [NUMBER, POINTER]],\n    ['gridDisk', H3_ERROR, [H3_LOWER, H3_UPPER, NUMBER, POINTER]],\n    ['gridDiskDistances', H3_ERROR, [H3_LOWER, H3_UPPER, NUMBER, POINTER, POINTER]],\n    ['gridRingUnsafe', H3_ERROR, [H3_LOWER, H3_UPPER, NUMBER, POINTER]],\n    ['maxPolygonToCellsSize', H3_ERROR, [POINTER, RESOLUTION, NUMBER, POINTER]],\n    ['polygonToCells', H3_ERROR, [POINTER, RESOLUTION, NUMBER, POINTER]],\n    ['cellsToLinkedMultiPolygon', H3_ERROR, [POINTER, NUMBER, POINTER]],\n    ['destroyLinkedMultiPolygon', null, [POINTER]],\n    ['compactCells', H3_ERROR, [POINTER, POINTER, NUMBER, NUMBER]],\n    ['uncompactCells', H3_ERROR, [POINTER, NUMBER, NUMBER, POINTER, NUMBER, RESOLUTION]],\n    ['uncompactCellsSize', H3_ERROR, [POINTER, NUMBER, NUMBER, RESOLUTION, POINTER]],\n    ['isPentagon', BOOLEAN, [H3_LOWER, H3_UPPER]],\n    ['isResClassIII', BOOLEAN, [H3_LOWER, H3_UPPER]],\n    ['getBaseCellNumber', NUMBER, [H3_LOWER, H3_UPPER]],\n    ['getResolution', NUMBER, [H3_LOWER, H3_UPPER]],\n    ['maxFaceCount', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['getIcosahedronFaces', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['cellToParent', H3_ERROR, [H3_LOWER, H3_UPPER, RESOLUTION, POINTER]],\n    ['cellToChildren', H3_ERROR, [H3_LOWER, H3_UPPER, RESOLUTION, POINTER]],\n    ['cellToCenterChild', H3_ERROR, [H3_LOWER, H3_UPPER, RESOLUTION, POINTER]],\n    ['cellToChildrenSize', H3_ERROR, [H3_LOWER, H3_UPPER, RESOLUTION, POINTER]],\n    ['cellToChildPos', H3_ERROR, [H3_LOWER, H3_UPPER, RESOLUTION, POINTER]],\n    ['childPosToCell', H3_ERROR, [NUMBER, NUMBER, H3_LOWER, H3_UPPER, RESOLUTION, POINTER]],\n    ['areNeighborCells', H3_ERROR, [H3_LOWER, H3_UPPER, H3_LOWER, H3_UPPER, POINTER]],\n    ['cellsToDirectedEdge', H3_ERROR, [H3_LOWER, H3_UPPER, H3_LOWER, H3_UPPER, POINTER]],\n    ['getDirectedEdgeOrigin', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['getDirectedEdgeDestination', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['isValidDirectedEdge', BOOLEAN, [H3_LOWER, H3_UPPER]],\n    ['directedEdgeToCells', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['originToDirectedEdges', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['directedEdgeToBoundary', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['gridDistance', H3_ERROR, [H3_LOWER, H3_UPPER, H3_LOWER, H3_UPPER, POINTER]],\n    ['gridPathCells', H3_ERROR, [H3_LOWER, H3_UPPER, H3_LOWER, H3_UPPER, POINTER]],\n    ['gridPathCellsSize', H3_ERROR, [H3_LOWER, H3_UPPER, H3_LOWER, H3_UPPER, POINTER]],\n    ['cellToLocalIj', H3_ERROR, [H3_LOWER, H3_UPPER, H3_LOWER, H3_UPPER, NUMBER, POINTER]],\n    ['localIjToCell', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER, NUMBER, POINTER]],\n    ['getHexagonAreaAvgM2', H3_ERROR, [RESOLUTION, POINTER]],\n    ['getHexagonAreaAvgKm2', H3_ERROR, [RESOLUTION, POINTER]],\n    ['getHexagonEdgeLengthAvgM', H3_ERROR, [RESOLUTION, POINTER]],\n    ['getHexagonEdgeLengthAvgKm', H3_ERROR, [RESOLUTION, POINTER]],\n    ['greatCircleDistanceM', NUMBER, [POINTER, POINTER]],\n    ['greatCircleDistanceKm', NUMBER, [POINTER, POINTER]],\n    ['greatCircleDistanceRads', NUMBER, [POINTER, POINTER]],\n    ['cellAreaM2', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['cellAreaKm2', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['cellAreaRads2', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['edgeLengthM', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['edgeLengthKm', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['edgeLengthRads', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['getNumCells', H3_ERROR, [RESOLUTION, POINTER]],\n    ['getRes0Cells', H3_ERROR, [POINTER]],\n    ['res0CellCount', NUMBER],\n    ['getPentagons', H3_ERROR, [NUMBER, POINTER]],\n    ['pentagonCount', NUMBER],\n    ['cellToVertex', H3_ERROR, [H3_LOWER, H3_UPPER, NUMBER, POINTER]],\n    ['cellToVertexes', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['vertexToLatLng', H3_ERROR, [H3_LOWER, H3_UPPER, POINTER]],\n    ['isValidVertex', BOOLEAN, [H3_LOWER, H3_UPPER]]\n];\n", "/*\n * Copyright 2018-2019, 2022 Uber Technologies, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Error codes from the code library, aliased here for legibility\nexport const E_SUCCESS = 0;\nexport const E_FAILED = 1;\nexport const E_DOMAIN = 2;\nexport const E_LATLNG_DOMAIN = 3;\nexport const E_RES_DOMAIN = 4;\nexport const E_CELL_INVALID = 5;\nexport const E_DIR_EDGE_INVALID = 6;\nexport const E_UNDIR_EDGE_INVALID = 7;\nexport const E_VERTEX_INVALID = 8;\nexport const E_PENTAGON = 9;\nexport const E_DUPLICATE_INPUT = 10;\nexport const E_NOT_NEIGHBORS = 11;\nexport const E_RES_MISMATCH = 12;\nexport const E_MEMORY_ALLOC = 13;\nexport const E_MEMORY_BOUNDS = 14;\nexport const E_OPTION_INVALID = 15;\n\n/**\n * Error messages corresponding to the core library error codes. See\n * https://h3geo.org/docs/library/errors#table-of-error-codes\n * @private\n */\nconst H3_ERROR_MSGS = {\n    [E_SUCCESS]: 'Success',\n    [E_FAILED]: 'The operation failed but a more specific error is not available',\n    [E_DOMAIN]: 'Argument was outside of acceptable range',\n    [E_LATLNG_DOMAIN]: 'Latitude or longitude arguments were outside of acceptable range',\n    [E_RES_DOMAIN]: 'Resolution argument was outside of acceptable range',\n    [E_CELL_INVALID]: 'Cell argument was not valid',\n    [E_DIR_EDGE_INVALID]: 'Directed edge argument was not valid',\n    [E_UNDIR_EDGE_INVALID]: 'Undirected edge argument was not valid',\n    [E_VERTEX_INVALID]: 'Vertex argument was not valid',\n    [E_PENTAGON]: 'Pentagon distortion was encountered',\n    [E_DUPLICATE_INPUT]: 'Duplicate input',\n    [E_NOT_NEIGHBORS]: 'Cell arguments were not neighbors',\n    [E_RES_MISMATCH]: 'Cell arguments had incompatible resolutions',\n    [E_MEMORY_ALLOC]: 'Memory allocation failed',\n    [E_MEMORY_BOUNDS]: 'Bounds of provided memory were insufficient',\n    [E_OPTION_INVALID]: 'Mode or flags argument was not valid'\n};\n\n// Error codes for JS errors thrown in the bindings\nexport const E_UNKNOWN_UNIT = 1000;\nexport const E_ARRAY_LENGTH = 1001;\nexport const E_NULL_INDEX = 1002;\n\n/**\n * Error messages for errors thrown in the binding code. These don't strictly\n * need error codes, but it's simpler to treat all of the errors consistently\n * @private\n */\nconst JS_ERROR_MESSAGES = {\n    [E_UNKNOWN_UNIT]: 'Unknown unit',\n    [E_ARRAY_LENGTH]: 'Array length out of bounds',\n    [E_NULL_INDEX]: 'Got unexpected null value for H3 index'\n};\n\nconst UNKNOWN_ERROR_MSG = 'Unknown error';\n\n/**\n * Create an error with an attached code\n * @private\n * @param {Record<number, string>} messages  Map of code-to-messages to use\n * @param {number} errCode                   Numeric error code\n * @param {{value: unknown} | {}} [meta]     Metadata with value to associate with the error\n */\nfunction createError(messages, errCode, meta) {\n    // The error value may be \"undefined\", so check if the argument was provided\n    const hasValue = meta && 'value' in meta;\n    // Throw a custom error type with the code attached\n    const err = new Error(\n        `${messages[errCode] || UNKNOWN_ERROR_MSG} (code: ${errCode}${\n            hasValue ? `, value: ${meta.value}` : ''\n        })`\n    );\n    // @ts-expect-error - TS doesn't like extending Error\n    err.code = errCode;\n    return err;\n}\n\n/**\n * Custom error for H3Error codes\n * @private\n * @param {number} errCode     Error code from the H3 library\n * @param {unknown} [value]    Value to associate with the error, if any\n * @returns {Error}\n */\nexport function H3LibraryError(errCode, value) {\n    // The error value may be \"undefined\", so check if the argument was provided\n    const meta = arguments.length === 2 ? {value} : {};\n    return createError(H3_ERROR_MSGS, errCode, meta);\n}\n\n/**\n * Custom errors thrown from the JS bindings.\n * @private\n * @param {number} errCode     Error code from the H3 library\n * @param {unknown} [value]    Value to associate with the error, if any\n * @returns {Error}\n */\nexport function JSBindingError(errCode, value) {\n    // The error value may be \"undefined\", so check if the argument was provided\n    const meta = arguments.length === 2 ? {value} : {};\n    return createError(JS_ERROR_MESSAGES, errCode, meta);\n}\n\n/**\n * Throw a JavaScript error if the C library return code is an error\n * @private\n * @param {number} errCode     Error code from the H3 library\n * @throws {Error} Error if err is not E_SUCCESS (0)\n */\nexport function throwIfError(errCode) {\n    if (errCode !== 0) {\n        throw H3LibraryError(errCode);\n    }\n}\n", "/*\n * Copyright 2018-2019, 2022 Uber Technologies, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @module h3\n */\n\nimport C from '../out/libh3';\nimport BINDINGS from './bindings';\nimport {\n    throwIfError,\n    H3LibraryError,\n    JSBindingError,\n    E_RES_DOMAIN,\n    E_UNKNOWN_UNIT,\n    E_ARRAY_LENGTH,\n    E_NULL_INDEX,\n    E_CELL_INVALID\n} from './errors';\n\n/**\n * Map of C-defined functions\n * @type {any}\n * @private\n */\nconst H3 = {};\n\n// Create the bound functions themselves\nBINDINGS.forEach(function bind(def) {\n    H3[def[0]] = C.cwrap(...def);\n});\n\n// Alias the hexidecimal base for legibility\nconst BASE_16 = 16;\n\n// Alias unused bits for legibility\nconst UNUSED_UPPER_32_BITS = 0;\n\n// ----------------------------------------------------------------------------\n// Byte size imports\n\nconst SZ_INT = 4;\nconst SZ_PTR = 4;\nconst SZ_DBL = 8;\nconst SZ_INT64 = 8;\nconst SZ_H3INDEX = H3.sizeOfH3Index();\nconst SZ_LATLNG = H3.sizeOfLatLng();\nconst SZ_CELLBOUNDARY = H3.sizeOfCellBoundary();\nconst SZ_GEOPOLYGON = H3.sizeOfGeoPolygon();\nconst SZ_GEOLOOP = H3.sizeOfGeoLoop();\nconst SZ_LINKED_GEOPOLYGON = H3.sizeOfLinkedGeoPolygon();\nconst SZ_COORDIJ = H3.sizeOfCoordIJ();\n\n// ----------------------------------------------------------------------------\n// Custom types\n\n/**\n * 64-bit hexidecimal string representation of an H3 index\n * @static\n * @typedef {string} H3Index\n */\n\n/**\n * 64-bit hexidecimal string representation of an H3 index,\n * or two 32-bit integers in little endian order in an array.\n * @static\n * @typedef {string | number[]} H3IndexInput\n */\n\n/**\n * Coordinates as an `{i, j}` pair\n * @static\n * @typedef CoordIJ\n * @property {number} i\n * @property {number} j\n */\n\n/**\n * Custom JS Error instance with an attached error code. Error codes come from the\n * core H3 library and can be found [in the H3 docs](https://h3geo.org/docs/library/errors#table-of-error-codes).\n * @static\n * @typedef H3Error\n * @property {string} message\n * @property {number} code\n */\n\n/**\n * Pair of lat,lng coordinates (or lng,lat if GeoJSON output is specified)\n * @static\n * @typedef {number[]} CoordPair\n */\n\n/**\n * Pair of lower,upper 32-bit ints representing a 64-bit value\n * @static\n * @typedef {number[]} SplitLong\n */\n\n// ----------------------------------------------------------------------------\n// Unit constants\n\n/**\n * Length/Area units\n * @static\n * @property {string} m\n * @property {string} m2\n * @property {string} km\n * @property {string} km2\n * @property {string} rads\n * @property {string} rads2\n */\nexport const UNITS = {\n    m: 'm',\n    m2: 'm2',\n    km: 'km',\n    km2: 'km2',\n    rads: 'rads',\n    rads2: 'rads2'\n};\n\n// ----------------------------------------------------------------------------\n// Utilities and helpers\n\n/**\n * Validate a resolution, throwing an error if invalid\n * @private\n * @param  {unknown} res Value to validate\n * @return {number}      Valid res\n * @throws {H3Error}     If invalid\n */\nfunction validateRes(res) {\n    if (typeof res !== 'number' || res < 0 || res > 15 || Math.floor(res) !== res) {\n        throw H3LibraryError(E_RES_DOMAIN, res);\n    }\n    return res;\n}\n\n/**\n * Assert H3 index output, throwing an error if null\n * @private\n * @param {H3Index | null} h3Index    Index to validate\n * @return {H3Index}\n * @throws {H3Error}     If invalid\n */\nfunction validateH3Index(h3Index) {\n    if (!h3Index) throw JSBindingError(E_NULL_INDEX);\n    return h3Index;\n}\n\nconst MAX_JS_ARRAY_LENGTH = Math.pow(2, 32) - 1;\n\n/**\n * Validate an array length. JS will throw its own error if you try\n * to create an array larger than 2^32 - 1, but validating beforehand\n * allows us to exit early before we try to process large amounts\n * of data that won't even fit in an output array\n * @private\n * @param  {number} length  Length to validate\n * @return {number}         Valid array length\n * @throws {H3Error}        If invalid\n */\nfunction validateArrayLength(length) {\n    if (length > MAX_JS_ARRAY_LENGTH) {\n        throw JSBindingError(E_ARRAY_LENGTH, length);\n    }\n    return length;\n}\n\nconst INVALID_HEXIDECIMAL_CHAR = /[^0-9a-fA-F]/;\n\n/**\n * Convert an H3 index (64-bit hexidecimal string) into a \"split long\" - a pair of 32-bit ints\n * @param  {H3IndexInput} h3Index  H3 index to check\n * @return {SplitLong}             A two-element array with 32 lower bits and 32 upper bits\n */\nexport function h3IndexToSplitLong(h3Index) {\n    if (\n        Array.isArray(h3Index) &&\n        h3Index.length === 2 &&\n        Number.isInteger(h3Index[0]) &&\n        Number.isInteger(h3Index[1])\n    ) {\n        return h3Index;\n    }\n    if (typeof h3Index !== 'string' || INVALID_HEXIDECIMAL_CHAR.test(h3Index)) {\n        return [0, 0];\n    }\n    const upper = parseInt(h3Index.substring(0, h3Index.length - 8), BASE_16);\n    const lower = parseInt(h3Index.substring(h3Index.length - 8), BASE_16);\n    return [lower, upper];\n}\n\n/**\n * Convert a 32-bit int to a hexdecimal string\n * @private\n * @param  {number} num  Integer to convert\n * @return {H3Index}     Hexidecimal string\n */\nfunction hexFrom32Bit(num) {\n    if (num >= 0) {\n        return num.toString(BASE_16);\n    }\n\n    // Handle negative numbers\n    num = num & 0x7fffffff;\n    let tempStr = zeroPad(8, num.toString(BASE_16));\n    const topNum = (parseInt(tempStr[0], BASE_16) + 8).toString(BASE_16);\n    tempStr = topNum + tempStr.substring(1);\n    return tempStr;\n}\n\n/**\n * Get a H3 index string from a split long (pair of 32-bit ints)\n * @param  {number} lower Lower 32 bits\n * @param  {number} upper Upper 32 bits\n * @return {H3Index}       H3 index\n */\nexport function splitLongToH3Index(lower, upper) {\n    return hexFrom32Bit(upper) + zeroPad(8, hexFrom32Bit(lower));\n}\n\n/**\n * Zero-pad a string to a given length\n * @private\n * @param  {number} fullLen Target length\n * @param  {string} numStr  String to zero-pad\n * @return {string}         Zero-padded string\n */\nfunction zeroPad(fullLen, numStr) {\n    const numZeroes = fullLen - numStr.length;\n    let outStr = '';\n    for (let i = 0; i < numZeroes; i++) {\n        outStr += '0';\n    }\n    outStr = outStr + numStr;\n    return outStr;\n}\n\n// One more than the max size of an unsigned 32-bit int.\n// Dividing by this number is equivalent to num >>> 32\nconst UPPER_BIT_DIVISOR = Math.pow(2, 32);\n\n/**\n * Convert a JS double-precision floating point number to a split long\n * @private\n * @param  {number} num  Number to convert\n * @return {SplitLong}     A two-element array with 32 lower bits and 32 upper bits\n */\nfunction numberToSplitLong(num) {\n    if (typeof num !== 'number') {\n        return [0, 0];\n    }\n    return [num | 0, (num / UPPER_BIT_DIVISOR) | 0];\n}\n\n/**\n * Populate a C-appropriate GeoLoop struct from a polygon array\n * @private\n * @param  {number[][]} polygonArray  Polygon, as an array of coordinate pairs\n * @param  {number}  geoLoop          C pointer to a GeoLoop struct\n * @param  {boolean} isGeoJson        Whether coordinates are in [lng, lat] order per GeoJSON spec\n * @return {number}                   C pointer to populated GeoLoop struct\n */\nfunction polygonArrayToGeoLoop(polygonArray, geoLoop, isGeoJson) {\n    const numVerts = polygonArray.length;\n    const geoCoordArray = C._calloc(numVerts, SZ_LATLNG);\n    // Support [lng, lat] pairs if GeoJSON is specified\n    const latIndex = isGeoJson ? 1 : 0;\n    const lngIndex = isGeoJson ? 0 : 1;\n    for (let i = 0; i < numVerts * 2; i += 2) {\n        C.HEAPF64.set(\n            [polygonArray[i / 2][latIndex], polygonArray[i / 2][lngIndex]].map(degsToRads),\n            geoCoordArray / SZ_DBL + i\n        );\n    }\n    C.HEAPU32.set([numVerts, geoCoordArray], geoLoop / SZ_INT);\n    return geoLoop;\n}\n\n/**\n * Create a C-appropriate GeoPolygon struct from an array of polygons\n * @private\n * @param  {number[][][]} coordinates Array of polygons, each an array of coordinate pairs\n * @param  {boolean} isGeoJson        Whether coordinates are in [lng, lat] order per GeoJSON spec\n * @return {number}                   C pointer to populated GeoPolygon struct\n */\nfunction coordinatesToGeoPolygon(coordinates, isGeoJson) {\n    // Any loops beyond the first loop are holes\n    const numHoles = coordinates.length - 1;\n    const geoPolygon = C._calloc(SZ_GEOPOLYGON);\n    // Byte positions within the struct\n    const geoLoopOffset = 0;\n    const numHolesOffset = geoLoopOffset + SZ_GEOLOOP;\n    const holesOffset = numHolesOffset + SZ_INT;\n    // geoLoop is first part of struct\n    polygonArrayToGeoLoop(coordinates[0], geoPolygon + geoLoopOffset, isGeoJson);\n    let holes;\n    if (numHoles > 0) {\n        holes = C._calloc(numHoles, SZ_GEOLOOP);\n        for (let i = 0; i < numHoles; i++) {\n            polygonArrayToGeoLoop(coordinates[i + 1], holes + SZ_GEOLOOP * i, isGeoJson);\n        }\n    }\n    C.setValue(geoPolygon + numHolesOffset, numHoles, 'i32');\n    C.setValue(geoPolygon + holesOffset, holes, 'i32');\n    return geoPolygon;\n}\n\n/**\n * Free memory allocated for a GeoPolygon struct. It is an error to access the struct\n * after passing it to this method.\n * @private\n * @param {number} geoPolygon     C pointer to GeoPolygon struct\n * @return {void}\n */\nfunction destroyGeoPolygon(geoPolygon) {\n    // Byte positions within the struct\n    const geoLoopOffset = 0;\n    const numHolesOffset = geoLoopOffset + SZ_GEOLOOP;\n    const holesOffset = numHolesOffset + SZ_INT;\n    // Offset of the geoLoop vertex array pointer within the GeoLoop struct\n    const geoLoopArrayOffset = SZ_INT;\n    // Free the outer vertex array\n    C._free(C.getValue(geoPolygon + geoLoopOffset + geoLoopArrayOffset, 'i8*'));\n    // Free the vertex array for the holes, if any\n    const numHoles = C.getValue(geoPolygon + numHolesOffset, 'i32');\n    if (numHoles > 0) {\n        const holes = C.getValue(geoPolygon + holesOffset, 'i32');\n        for (let i = 0; i < numHoles; i++) {\n            C._free(C.getValue(holes + SZ_GEOLOOP * i + geoLoopArrayOffset, 'i8*'));\n        }\n        C._free(holes);\n    }\n    C._free(geoPolygon);\n}\n\n/**\n * Read an H3 index from a pointer to C memory.\n * @private\n * @param  {number} cAddress  Pointer to allocated C memory\n * @param {number} offset     Offset, in number of H3 indexes, in case we're\n *                            reading an array\n * @return {H3Index | null}   H3 index, or null if index was invalid\n */\nfunction readH3IndexFromPointer(cAddress, offset = 0) {\n    const lower = C.getValue(cAddress + SZ_H3INDEX * offset, 'i32');\n    const upper = C.getValue(cAddress + SZ_H3INDEX * offset + SZ_INT, 'i32');\n    // The lower bits are allowed to be 0s, but if the upper bits are 0\n    // this represents an invalid H3 index\n    return upper ? splitLongToH3Index(lower, upper) : null;\n}\n\n/**\n * Read a boolean (32 bit) from a pointer to C memory.\n * @private\n * @param  {number} cAddress  Pointer to allocated C memory\n * @param {number} offset     Offset, in number of booleans, in case we're\n *                            reading an array\n * @return {Boolean} Boolean value\n */\nfunction readBooleanFromPointer(cAddress, offset = 0) {\n    const val = C.getValue(cAddress + SZ_INT * offset, 'i32');\n    return Boolean(val);\n}\n\n/**\n * Read a double from a pointer to C memory.\n * @private\n * @param  {number} cAddress  Pointer to allocated C memory\n * @param {number} offset     Offset, in number of doubles, in case we're\n *                            reading an array\n * @return {number} Double value\n */\nfunction readDoubleFromPointer(cAddress, offset = 0) {\n    return C.getValue(cAddress + SZ_DBL * offset, 'double');\n}\n\n/**\n * Read a 64-bit int from a pointer to C memory into a JS 64-bit float.\n * Note that this may lose precision if larger than MAX_SAFE_INTEGER\n * @private\n * @param  {number} cAddress  Pointer to allocated C memory\n * @return {number} Double value\n */\nfunction readInt64AsDoubleFromPointer(cAddress) {\n    return H3.readInt64AsDoubleFromPointer(cAddress);\n}\n\n/**\n * Store an H3 index in C memory. Primarily used as an efficient way to\n * write sets of hexagons.\n * @private\n * @param  {H3IndexInput} h3Index  H3 index to store\n * @param  {number} cAddress  Pointer to allocated C memory\n * @param {number} offset     Offset, in number of H3 indexes from beginning\n *                            of the current array\n */\nfunction storeH3Index(h3Index, cAddress, offset) {\n    // HEAPU32 is a typed array projection on the index space\n    // as unsigned 32-bit integers. This means the index needs\n    // to be divided by SZ_INT (4) to access correctly. Also,\n    // the H3 index is 64 bits, so we skip by twos as we're writing\n    // to 32-bit integers in the proper order.\n    C.HEAPU32.set(h3IndexToSplitLong(h3Index), cAddress / SZ_INT + 2 * offset);\n}\n\n/**\n * Read an array of 64-bit H3 indexes from C and convert to a JS array of\n * H3 index strings\n * @private\n * @param  {number} cAddress    Pointer to C ouput array\n * @param  {number} maxCount    Max number of hexagons in array. Hexagons with\n *                              the value 0 will be skipped, so this isn't\n *                              necessarily the length of the output array.\n * @return {H3Index[]}          Array of H3 indexes\n */\nfunction readArrayOfH3Indexes(cAddress, maxCount) {\n    const out = [];\n    for (let i = 0; i < maxCount; i++) {\n        const h3Index = readH3IndexFromPointer(cAddress, i);\n        if (h3Index !== null) {\n            out.push(h3Index);\n        }\n    }\n    return out;\n}\n\n/**\n * Store an array of H3 index strings as a C array of 64-bit integers.\n * @private\n * @param  {number} cAddress    Pointer to C input array\n * @param  {H3IndexInput[]} hexagons H3 indexes to pass to the C lib\n */\nfunction storeArrayOfH3Indexes(cAddress, hexagons) {\n    // Assuming the cAddress points to an already appropriately\n    // allocated space\n    const count = hexagons.length;\n    for (let i = 0; i < count; i++) {\n        storeH3Index(hexagons[i], cAddress, i);\n    }\n}\n\n/**\n * Populate a C-appropriate LatLng struct from a [lat, lng] array\n * @private\n * @param {number} lat     Coordinate latitude\n * @param {number} lng     Coordinate longitude\n * @return {number}        C pointer to populated LatLng struct\n */\nfunction storeLatLng(lat, lng) {\n    const geoCoord = C._calloc(1, SZ_LATLNG);\n    C.HEAPF64.set([lat, lng].map(degsToRads), geoCoord / SZ_DBL);\n    return geoCoord;\n}\n\n/**\n * Read a single lat or lng value\n * @private\n * @param  {number} cAddress Pointer to C value\n * @return {number}\n */\nfunction readSingleCoord(cAddress) {\n    return radsToDegs(C.getValue(cAddress, 'double'));\n}\n\n/**\n * Read a LatLng from C and return a [lat, lng] pair.\n * @private\n * @param  {number} cAddress    Pointer to C struct\n * @return {CoordPair}          [lat, lng] pair\n */\nfunction readLatLng(cAddress) {\n    return [readSingleCoord(cAddress), readSingleCoord(cAddress + SZ_DBL)];\n}\n\n/**\n * Read a LatLng from C and return a GeoJSON-style [lng, lat] pair.\n * @private\n * @param  {number} cAddress    Pointer to C struct\n * @return {CoordPair}          [lng, lat] pair\n */\nfunction readLatLngGeoJson(cAddress) {\n    return [readSingleCoord(cAddress + SZ_DBL), readSingleCoord(cAddress)];\n}\n\n/**\n * Read the CellBoundary structure into a list of geo coordinate pairs\n * @private\n * @param {number}  cellBoundary       C pointer to CellBoundary struct\n * @param {boolean} [geoJsonCoords]    Whether to provide GeoJSON coordinate order: [lng, lat]\n * @param {boolean} [closedLoop]       Whether to close the loop\n * @return {CoordPair[]}               Array of geo coordinate pairs\n */\nfunction readCellBoundary(cellBoundary, geoJsonCoords, closedLoop) {\n    const numVerts = C.getValue(cellBoundary, 'i32');\n    // Note that though numVerts is an int, the coordinate doubles have to be\n    // aligned to 8 bytes, hence the 8-byte offset here\n    const vertsPos = cellBoundary + SZ_DBL;\n    const out = [];\n    // Support [lng, lat] pairs if GeoJSON is specified\n    const readCoord = geoJsonCoords ? readLatLngGeoJson : readLatLng;\n    for (let i = 0; i < numVerts * 2; i += 2) {\n        out.push(readCoord(vertsPos + SZ_DBL * i));\n    }\n    if (closedLoop) {\n        // Close loop if GeoJSON is specified\n        out.push(out[0]);\n    }\n    return out;\n}\n\n/**\n * Read the LinkedGeoPolygon structure into a nested array of MultiPolygon coordinates\n * @private\n * @param {number}  polygon           C pointer to LinkedGeoPolygon struct\n * @param {boolean} [formatAsGeoJson] Whether to provide GeoJSON output: [lng, lat], closed loops\n * @return {CoordPair[][][]}          MultiPolygon-style output.\n */\nfunction readMultiPolygon(polygon, formatAsGeoJson) {\n    const output = [];\n    const readCoord = formatAsGeoJson ? readLatLngGeoJson : readLatLng;\n    let loops;\n    let loop;\n    let coords;\n    let coord;\n    // Loop through the linked structure, building the output\n    while (polygon) {\n        output.push((loops = []));\n        // Follow ->first pointer\n        loop = C.getValue(polygon, 'i8*');\n        while (loop) {\n            loops.push((coords = []));\n            // Follow ->first pointer\n            coord = C.getValue(loop, 'i8*');\n            while (coord) {\n                coords.push(readCoord(coord));\n                // Follow ->next pointer\n                coord = C.getValue(coord + SZ_DBL * 2, 'i8*');\n            }\n            if (formatAsGeoJson) {\n                // Close loop if GeoJSON is requested\n                coords.push(coords[0]);\n            }\n            // Follow ->next pointer\n            loop = C.getValue(loop + SZ_PTR * 2, 'i8*');\n        }\n        // Follow ->next pointer\n        polygon = C.getValue(polygon + SZ_PTR * 2, 'i8*');\n    }\n    return output;\n}\n\n/**\n * Read a CoordIJ from C and return an {i, j} pair.\n * @private\n * @param  {number} cAddress    Pointer to C struct\n * @return {CoordIJ}            {i, j} pair\n */\nfunction readCoordIJ(cAddress) {\n    return {\n        i: C.getValue(cAddress, 'i32'),\n        j: C.getValue(cAddress + SZ_INT, 'i32')\n    };\n}\n\n/**\n * Store an {i, j} pair to a C CoordIJ struct.\n * @private\n * @param  {number} cAddress    Pointer to C memory\n * @param {CoordIJ} ij          {i,j} pair to store\n * @return {void}\n */\nfunction storeCoordIJ(cAddress, {i, j}) {\n    C.setValue(cAddress, i, 'i32');\n    C.setValue(cAddress + SZ_INT, j, 'i32');\n}\n\n/**\n * Read an array of positive integers array from C. Negative\n * values are considered invalid and ignored in output.\n * @private\n * @param  {number} cAddress    Pointer to C array\n * @param  {number} count       Length of C array\n * @return {number[]}           Javascript integer array\n */\nfunction readArrayOfPositiveIntegers(cAddress, count) {\n    const out = [];\n    for (let i = 0; i < count; i++) {\n        const int = C.getValue(cAddress + SZ_INT * i, 'i32');\n        if (int >= 0) {\n            out.push(int);\n        }\n    }\n    return out;\n}\n\n// ----------------------------------------------------------------------------\n// Public API functions: Core\n\n/**\n * Whether a given string represents a valid H3 index\n * @static\n * @param  {H3IndexInput} h3Index  H3 index to check\n * @return {boolean}          Whether the index is valid\n */\nexport function isValidCell(h3Index) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    return Boolean(H3.isValidCell(lower, upper));\n}\n\n/**\n * Whether the given H3 index is a pentagon\n * @static\n * @param  {H3IndexInput} h3Index  H3 index to check\n * @return {boolean}          isPentagon\n */\nexport function isPentagon(h3Index) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    return Boolean(H3.isPentagon(lower, upper));\n}\n\n/**\n * Whether the given H3 index is in a Class III resolution (rotated versus\n * the icosahedron and subject to shape distortion adding extra points on\n * icosahedron edges, making them not true hexagons).\n * @static\n * @param  {H3IndexInput} h3Index  H3 index to check\n * @return {boolean}          isResClassIII\n */\nexport function isResClassIII(h3Index) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    return Boolean(H3.isResClassIII(lower, upper));\n}\n\n/**\n * Get the number of the base cell for a given H3 index\n * @static\n * @param  {H3IndexInput} h3Index  H3 index to get the base cell for\n * @return {number}           Index of the base cell (0-121)\n */\nexport function getBaseCellNumber(h3Index) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    return H3.getBaseCellNumber(lower, upper);\n}\n\n/**\n * Get the indices of all icosahedron faces intersected by a given H3 index\n * @static\n * @param  {H3IndexInput} h3Index  H3 index to get faces for\n * @return {number[]}              Indices (0-19) of all intersected faces\n * @throws {H3Error}               If input is invalid\n */\nexport function getIcosahedronFaces(h3Index) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const countPtr = C._malloc(SZ_INT);\n    try {\n        throwIfError(H3.maxFaceCount(lower, upper, countPtr));\n        const count = C.getValue(countPtr, 'i32');\n        const faces = C._malloc(SZ_INT * count);\n        try {\n            throwIfError(H3.getIcosahedronFaces(lower, upper, faces));\n            return readArrayOfPositiveIntegers(faces, count);\n        } finally {\n            C._free(faces);\n        }\n    } finally {\n        C._free(countPtr);\n    }\n}\n\n/**\n * Returns the resolution of an H3 index\n * @static\n * @param  {H3IndexInput} h3Index H3 index to get resolution\n * @return {number}          The number (0-15) resolution, or -1 if invalid\n */\nexport function getResolution(h3Index) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    if (!H3.isValidCell(lower, upper)) {\n        // Compatability with stated API\n        return -1;\n    }\n    return H3.getResolution(lower, upper);\n}\n\n/**\n * Get the hexagon containing a lat,lon point\n * @static\n * @param  {number} lat Latitude of point\n * @param  {number} lng Longtitude of point\n * @param  {number} res Resolution of hexagons to return\n * @return {H3Index}    H3 index\n * @throws {H3Error}    If input is invalid\n */\nexport function latLngToCell(lat, lng, res) {\n    const latLng = C._malloc(SZ_LATLNG);\n    // Slightly more efficient way to set the memory\n    C.HEAPF64.set([lat, lng].map(degsToRads), latLng / SZ_DBL);\n    // Read value as a split long\n    const h3Index = C._malloc(SZ_H3INDEX);\n    try {\n        throwIfError(H3.latLngToCell(latLng, res, h3Index));\n        return validateH3Index(readH3IndexFromPointer(h3Index));\n    } finally {\n        C._free(h3Index);\n        C._free(latLng);\n    }\n}\n\n/**\n * Get the lat,lon center of a given hexagon\n * @static\n * @param  {H3IndexInput} h3Index  H3 index\n * @return {CoordPair}             Point as a [lat, lng] pair\n * @throws {H3Error}               If input is invalid\n */\nexport function cellToLatLng(h3Index) {\n    const latLng = C._malloc(SZ_LATLNG);\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    try {\n        throwIfError(H3.cellToLatLng(lower, upper, latLng));\n        return readLatLng(latLng);\n    } finally {\n        C._free(latLng);\n    }\n}\n\n/**\n * Get the vertices of a given hexagon (or pentagon), as an array of [lat, lng]\n * points. For pentagons and hexagons on the edge of an icosahedron face, this\n * function may return up to 10 vertices.\n * @static\n * @param  {H3IndexInput} h3Index          H3 index\n * @param {boolean} [formatAsGeoJson] Whether to provide GeoJSON output: [lng, lat], closed loops\n * @return {CoordPair[]}              Array of [lat, lng] pairs\n * @throws {H3Error}                  If input is invalid\n */\nexport function cellToBoundary(h3Index, formatAsGeoJson) {\n    const cellBoundary = C._malloc(SZ_CELLBOUNDARY);\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    try {\n        throwIfError(H3.cellToBoundary(lower, upper, cellBoundary));\n        return readCellBoundary(cellBoundary, formatAsGeoJson, formatAsGeoJson);\n    } finally {\n        C._free(cellBoundary);\n    }\n}\n\n// ----------------------------------------------------------------------------\n// Public API functions: Algorithms\n\n/**\n * Get the parent of the given hexagon at a particular resolution\n * @static\n * @param  {H3IndexInput} h3Index  H3 index to get parent for\n * @param  {number} res       Resolution of hexagon to return\n * @return {H3Index}          H3 index of parent, or null for invalid input\n * @throws {H3Error}          If input is invalid\n */\nexport function cellToParent(h3Index, res) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const parent = C._malloc(SZ_H3INDEX);\n    try {\n        throwIfError(H3.cellToParent(lower, upper, res, parent));\n        return validateH3Index(readH3IndexFromPointer(parent));\n    } finally {\n        C._free(parent);\n    }\n}\n\n/**\n * Get the children/descendents of the given hexagon at a particular resolution\n * @static\n * @param  {H3IndexInput} h3Index  H3 index to get children for\n * @param  {number} res       Resolution of hexagons to return\n * @return {H3Index[]}        H3 indexes of children, or empty array for invalid input\n * @throws {H3Error}          If resolution is invalid or output is too large for JS\n */\nexport function cellToChildren(h3Index, res) {\n    // Bad input in this case can potentially result in high computation volume\n    // using the current C algorithm. Validate and return an empty array on failure.\n    if (!isValidCell(h3Index)) {\n        return [];\n    }\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const count = validateArrayLength(cellToChildrenSize(h3Index, res));\n    const hexagons = C._calloc(count, SZ_H3INDEX);\n    try {\n        throwIfError(H3.cellToChildren(lower, upper, res, hexagons));\n        return readArrayOfH3Indexes(hexagons, count);\n    } finally {\n        C._free(hexagons);\n    }\n}\n\n/**\n * Get the number of children for a cell at a given resolution\n * @static\n * @param  {H3IndexInput} h3Index  H3 index to get child count for\n * @param  {number} res            Child resolution\n * @return {number}                Number of children at res for the given cell\n * @throws {H3Error}               If cell or parentRes are invalid\n */\nexport function cellToChildrenSize(h3Index, res) {\n    if (!isValidCell(h3Index)) {\n        throw H3LibraryError(E_CELL_INVALID);\n    }\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const countPtr = C._malloc(SZ_INT64);\n    try {\n        throwIfError(H3.cellToChildrenSize(lower, upper, res, countPtr));\n        return readInt64AsDoubleFromPointer(countPtr);\n    } finally {\n        C._free(countPtr);\n    }\n}\n\n/**\n * Get the center child of the given hexagon at a particular resolution\n * @static\n * @param  {H3IndexInput} h3Index  H3 index to get center child for\n * @param  {number} res       Resolution of cell to return\n * @return {H3Index}          H3 index of child, or null for invalid input\n * @throws {H3Error}          If resolution is invalid\n */\nexport function cellToCenterChild(h3Index, res) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const centerChild = C._malloc(SZ_H3INDEX);\n    try {\n        throwIfError(H3.cellToCenterChild(lower, upper, res, centerChild));\n        return validateH3Index(readH3IndexFromPointer(centerChild));\n    } finally {\n        C._free(centerChild);\n    }\n}\n\n/**\n * Get the position of the cell within an ordered list of all children of the\n * cell's parent at the specified resolution.\n * @static\n * @param  {H3IndexInput} h3Index  H3 index to get child pos for\n * @param  {number} parentRes      Resolution of reference parent\n * @return {number}                Position of child within parent at parentRes\n * @throws {H3Error}               If cell or parentRes are invalid\n */\nexport function cellToChildPos(h3Index, parentRes) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const childPos = C._malloc(SZ_INT64);\n    try {\n        throwIfError(H3.cellToChildPos(lower, upper, parentRes, childPos));\n        return readInt64AsDoubleFromPointer(childPos);\n    } finally {\n        C._free(childPos);\n    }\n}\n\n/**\n * Get the child cell at a given position within an ordered list of all children\n * at the specified resolution\n * @static\n * @param  {number} childPos       Position of the child cell to get\n * @param  {H3IndexInput} h3Index  H3 index of the parent cell\n * @param  {number} childRes       Resolution of child cell to return\n * @return {H3Index}          H3 index of child\n * @throws {H3Error}          If input is invalid\n */\nexport function childPosToCell(childPos, h3Index, childRes) {\n    const [cpLower, cpUpper] = numberToSplitLong(childPos);\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const child = C._malloc(SZ_H3INDEX);\n    try {\n        throwIfError(H3.childPosToCell(cpLower, cpUpper, lower, upper, childRes, child));\n        return validateH3Index(readH3IndexFromPointer(child));\n    } finally {\n        C._free(child);\n    }\n}\n\n/**\n * Get all hexagons in a k-ring around a given center. The order of the hexagons is undefined.\n * @static\n * @param  {H3IndexInput} h3Index  H3 index of center hexagon\n * @param  {number} ringSize  Radius of k-ring\n * @return {H3Index[]}        H3 indexes for all hexagons in ring\n * @throws {H3Error}          If input is invalid or output is too large for JS\n */\nexport function gridDisk(h3Index, ringSize) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const countPtr = C._malloc(SZ_INT64);\n    try {\n        throwIfError(H3.maxGridDiskSize(ringSize, countPtr));\n        const count = validateArrayLength(readInt64AsDoubleFromPointer(countPtr));\n        const hexagons = C._calloc(count, SZ_H3INDEX);\n        try {\n            throwIfError(H3.gridDisk(lower, upper, ringSize, hexagons));\n            return readArrayOfH3Indexes(hexagons, count);\n        } finally {\n            C._free(hexagons);\n        }\n    } finally {\n        C._free(countPtr);\n    }\n}\n\n/**\n * Get all hexagons in a k-ring around a given center, in an array of arrays\n * ordered by distance from the origin. The order of the hexagons within each ring is undefined.\n * @static\n * @param  {H3IndexInput} h3Index  H3 index of center hexagon\n * @param  {number} ringSize  Radius of k-ring\n * @return {H3Index[][]}      Array of arrays with H3 indexes for all hexagons each ring\n * @throws {H3Error}          If input is invalid or output is too large for JS\n */\nexport function gridDiskDistances(h3Index, ringSize) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const countPtr = C._malloc(SZ_INT64);\n    try {\n        throwIfError(H3.maxGridDiskSize(ringSize, countPtr));\n        const count = validateArrayLength(readInt64AsDoubleFromPointer(countPtr));\n        const kRings = C._calloc(count, SZ_H3INDEX);\n        const distances = C._calloc(count, SZ_INT);\n        try {\n            throwIfError(H3.gridDiskDistances(lower, upper, ringSize, kRings, distances));\n            /**\n             * An array of empty arrays to hold the output\n             * @type {string[][]}\n             * @private\n             */\n            const out = [];\n            for (let i = 0; i < ringSize + 1; i++) {\n                out.push([]);\n            }\n            // Read the array of hexagons, putting them into the appropriate rings\n            for (let i = 0; i < count; i++) {\n                const cell = readH3IndexFromPointer(kRings, i);\n                const index = C.getValue(distances + SZ_INT * i, 'i32');\n                // eslint-disable-next-line max-depth\n                if (cell !== null) {\n                    out[index].push(cell);\n                }\n            }\n            return out;\n        } finally {\n            C._free(kRings);\n            C._free(distances);\n        }\n    } finally {\n        C._free(countPtr);\n    }\n}\n\n/**\n * Get all hexagons in a hollow hexagonal ring centered at origin with sides of a given length.\n * Unlike kRing, this function will throw an error if there is a pentagon anywhere in the ring.\n * @static\n * @param  {H3IndexInput} h3Index  H3 index of center hexagon\n * @param  {number} ringSize  Radius of ring\n * @return {H3Index[]}        H3 indexes for all hexagons in ring\n * @throws {Error}            If the algorithm could not calculate the ring\n * @throws {H3Error}          If input is invalid\n */\nexport function gridRingUnsafe(h3Index, ringSize) {\n    const maxCount = ringSize === 0 ? 1 : 6 * ringSize;\n    const hexagons = C._calloc(maxCount, SZ_H3INDEX);\n    try {\n        throwIfError(H3.gridRingUnsafe(...h3IndexToSplitLong(h3Index), ringSize, hexagons));\n        return readArrayOfH3Indexes(hexagons, maxCount);\n    } finally {\n        C._free(hexagons);\n    }\n}\n\n/**\n * Get all hexagons with centers contained in a given polygon. The polygon\n * is specified with GeoJson semantics as an array of loops. Each loop is\n * an array of [lat, lng] pairs (or [lng, lat] if isGeoJson is specified).\n * The first loop is the perimeter of the polygon, and subsequent loops are\n * expected to be holes.\n * @static\n * @param  {number[][] | number[][][]} coordinates\n *                                  Array of loops, or a single loop\n * @param  {number} res             Resolution of hexagons to return\n * @param  {boolean} [isGeoJson]    Whether to expect GeoJson-style [lng, lat]\n *                                  pairs instead of [lat, lng]\n * @return {H3Index[]}              H3 indexes for all hexagons in polygon\n * @throws {H3Error}                If input is invalid or output is too large for JS\n */\nexport function polygonToCells(coordinates, res, isGeoJson) {\n    validateRes(res);\n    isGeoJson = Boolean(isGeoJson);\n    // Guard against empty input\n    if (coordinates.length === 0 || coordinates[0].length === 0) {\n        return [];\n    }\n    // Wrap to expected format if a single loop is provided\n    const polygon = typeof coordinates[0][0] === 'number' ? [coordinates] : coordinates;\n    const geoPolygon = coordinatesToGeoPolygon(\n        // @ts-expect-error - There's no way to convince TS that polygon is now number[][][]\n        polygon,\n        isGeoJson\n    );\n    const countPtr = C._malloc(SZ_INT64);\n    try {\n        throwIfError(H3.maxPolygonToCellsSize(geoPolygon, res, 0, countPtr));\n        const count = validateArrayLength(readInt64AsDoubleFromPointer(countPtr));\n        const hexagons = C._calloc(count, SZ_H3INDEX);\n        try {\n            throwIfError(H3.polygonToCells(geoPolygon, res, 0, hexagons));\n            return readArrayOfH3Indexes(hexagons, count);\n        } finally {\n            C._free(hexagons);\n        }\n    } finally {\n        C._free(countPtr);\n        destroyGeoPolygon(geoPolygon);\n    }\n}\n\n/**\n * Get the outlines of a set of H3 hexagons, returned in GeoJSON MultiPolygon\n * format (an array of polygons, each with an array of loops, each an array of\n * coordinates). Coordinates are returned as [lat, lng] pairs unless GeoJSON\n * is requested.\n *\n * It is the responsibility of the caller to ensure that all hexagons in the\n * set have the same resolution and that the set contains no duplicates. Behavior\n * is undefined if duplicates or multiple resolutions are present, and the\n * algorithm may produce unexpected or invalid polygons.\n *\n * @static\n * @param {H3IndexInput[]} h3Indexes  H3 indexes to get outlines for\n * @param {boolean} [formatAsGeoJson] Whether to provide GeoJSON output: [lng, lat], closed loops\n * @return {CoordPair[][][]}          MultiPolygon-style output.\n * @throws {H3Error}                  If input is invalid\n */\nexport function cellsToMultiPolygon(h3Indexes, formatAsGeoJson) {\n    // Early exit on empty input\n    if (!h3Indexes || !h3Indexes.length) {\n        return [];\n    }\n    // Set up input set\n    const indexCount = h3Indexes.length;\n    const set = C._calloc(indexCount, SZ_H3INDEX);\n    storeArrayOfH3Indexes(set, h3Indexes);\n    // Allocate memory for output linked polygon\n    const polygon = C._calloc(SZ_LINKED_GEOPOLYGON);\n    try {\n        throwIfError(H3.cellsToLinkedMultiPolygon(set, indexCount, polygon));\n        return readMultiPolygon(polygon, formatAsGeoJson);\n    } finally {\n        // Clean up\n        H3.destroyLinkedMultiPolygon(polygon);\n        C._free(polygon);\n        C._free(set);\n    }\n}\n\n/**\n * Compact a set of hexagons of the same resolution into a set of hexagons across\n * multiple levels that represents the same area.\n * @static\n * @param  {H3IndexInput[]} h3Set H3 indexes to compact\n * @return {H3Index[]}       Compacted H3 indexes\n * @throws {H3Error}         If the input is invalid (e.g. duplicate hexagons)\n */\nexport function compactCells(h3Set) {\n    if (!h3Set || !h3Set.length) {\n        return [];\n    }\n    // Set up input set\n    const count = h3Set.length;\n    const set = C._calloc(count, SZ_H3INDEX);\n    storeArrayOfH3Indexes(set, h3Set);\n    // Allocate memory for compacted hexagons, worst-case is no compaction\n    const compactedSet = C._calloc(count, SZ_H3INDEX);\n    try {\n        throwIfError(H3.compactCells(set, compactedSet, count, UNUSED_UPPER_32_BITS));\n        return readArrayOfH3Indexes(compactedSet, count);\n    } finally {\n        C._free(set);\n        C._free(compactedSet);\n    }\n}\n\n/**\n * Uncompact a compacted set of hexagons to hexagons of the same resolution\n * @static\n * @param  {H3IndexInput[]} compactedSet H3 indexes to uncompact\n * @param  {number}    res          The resolution to uncompact to\n * @return {H3Index[]}              The uncompacted H3 indexes\n * @throws {H3Error}                If the input is invalid (e.g. invalid resolution)\n */\nexport function uncompactCells(compactedSet, res) {\n    validateRes(res);\n    if (!compactedSet || !compactedSet.length) {\n        return [];\n    }\n    // Set up input set\n    const count = compactedSet.length;\n    const set = C._calloc(count, SZ_H3INDEX);\n    storeArrayOfH3Indexes(set, compactedSet);\n    // Estimate how many hexagons we need (always overestimates if in error)\n    const uncompactCellSizePtr = C._malloc(SZ_INT64);\n    try {\n        throwIfError(\n            H3.uncompactCellsSize(set, count, UNUSED_UPPER_32_BITS, res, uncompactCellSizePtr)\n        );\n        const uncompactCellSize = validateArrayLength(\n            readInt64AsDoubleFromPointer(uncompactCellSizePtr)\n        );\n        // Allocate memory for uncompacted hexagons\n        const uncompactedSet = C._calloc(uncompactCellSize, SZ_H3INDEX);\n        try {\n            throwIfError(\n                H3.uncompactCells(\n                    set,\n                    count,\n                    UNUSED_UPPER_32_BITS,\n                    uncompactedSet,\n                    uncompactCellSize,\n                    UNUSED_UPPER_32_BITS,\n                    res\n                )\n            );\n            return readArrayOfH3Indexes(uncompactedSet, uncompactCellSize);\n        } finally {\n            C._free(set);\n            C._free(uncompactedSet);\n        }\n    } finally {\n        C._free(uncompactCellSizePtr);\n    }\n}\n\n// ----------------------------------------------------------------------------\n// Public API functions: Directed edges\n\n/**\n * Whether two H3 indexes are neighbors (share an edge)\n * @static\n * @param  {H3IndexInput} origin      Origin hexagon index\n * @param  {H3IndexInput} destination Destination hexagon index\n * @return {boolean}             Whether the hexagons share an edge\n * @throws {H3Error}             If the input is invalid\n */\nexport function areNeighborCells(origin, destination) {\n    const [oLower, oUpper] = h3IndexToSplitLong(origin);\n    const [dLower, dUpper] = h3IndexToSplitLong(destination);\n    const out = C._malloc(SZ_INT);\n    try {\n        throwIfError(H3.areNeighborCells(oLower, oUpper, dLower, dUpper, out));\n        return readBooleanFromPointer(out);\n    } finally {\n        C._free(out);\n    }\n}\n\n/**\n * Get an H3 index representing a unidirectional edge for a given origin and destination\n * @static\n * @param  {H3IndexInput} origin      Origin hexagon index\n * @param  {H3IndexInput} destination Destination hexagon index\n * @return {H3Index}             H3 index of the edge, or null if no edge is shared\n * @throws {H3Error}             If the input is invalid\n */\nexport function cellsToDirectedEdge(origin, destination) {\n    const [oLower, oUpper] = h3IndexToSplitLong(origin);\n    const [dLower, dUpper] = h3IndexToSplitLong(destination);\n    const h3Index = C._malloc(SZ_H3INDEX);\n    try {\n        throwIfError(H3.cellsToDirectedEdge(oLower, oUpper, dLower, dUpper, h3Index));\n        return validateH3Index(readH3IndexFromPointer(h3Index));\n    } finally {\n        C._free(h3Index);\n    }\n}\n\n/**\n * Get the origin hexagon from an H3 index representing a unidirectional edge\n * @static\n * @param  {H3IndexInput} edgeIndex H3 index of the edge\n * @return {H3Index}           H3 index of the edge origin\n * @throws {H3Error}           If the input is invalid\n */\nexport function getDirectedEdgeOrigin(edgeIndex) {\n    const [lower, upper] = h3IndexToSplitLong(edgeIndex);\n    const h3Index = C._malloc(SZ_H3INDEX);\n    try {\n        throwIfError(H3.getDirectedEdgeOrigin(lower, upper, h3Index));\n        return validateH3Index(readH3IndexFromPointer(h3Index));\n    } finally {\n        C._free(h3Index);\n    }\n}\n\n/**\n * Get the destination hexagon from an H3 index representing a unidirectional edge\n * @static\n * @param  {H3IndexInput} edgeIndex H3 index of the edge\n * @return {H3Index}           H3 index of the edge destination\n * @throws {H3Error}           If the input is invalid\n */\nexport function getDirectedEdgeDestination(edgeIndex) {\n    const [lower, upper] = h3IndexToSplitLong(edgeIndex);\n    const h3Index = C._malloc(SZ_H3INDEX);\n    try {\n        throwIfError(H3.getDirectedEdgeDestination(lower, upper, h3Index));\n        return validateH3Index(readH3IndexFromPointer(h3Index));\n    } finally {\n        C._free(h3Index);\n    }\n}\n\n/**\n * Whether the input is a valid unidirectional edge\n * @static\n * @param  {H3IndexInput} edgeIndex H3 index of the edge\n * @return {boolean}           Whether the index is valid\n */\nexport function isValidDirectedEdge(edgeIndex) {\n    const [lower, upper] = h3IndexToSplitLong(edgeIndex);\n    return Boolean(H3.isValidDirectedEdge(lower, upper));\n}\n\n/**\n * Get the [origin, destination] pair represented by a unidirectional edge\n * @static\n * @param  {H3IndexInput} edgeIndex H3 index of the edge\n * @return {H3Index[]}         [origin, destination] pair as H3 indexes\n * @throws {H3Error}           If the input is invalid\n */\nexport function directedEdgeToCells(edgeIndex) {\n    const [lower, upper] = h3IndexToSplitLong(edgeIndex);\n    const count = 2;\n    const hexagons = C._calloc(count, SZ_H3INDEX);\n    try {\n        throwIfError(H3.directedEdgeToCells(lower, upper, hexagons));\n        return readArrayOfH3Indexes(hexagons, count);\n    } finally {\n        C._free(hexagons);\n    }\n}\n\n/**\n * Get all of the unidirectional edges with the given H3 index as the origin (i.e. an edge to\n * every neighbor)\n * @static\n * @param  {H3IndexInput} h3Index   H3 index of the origin hexagon\n * @return {H3Index[]}         List of unidirectional edges\n * @throws {H3Error}           If the input is invalid\n */\nexport function originToDirectedEdges(h3Index) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const count = 6;\n    const edges = C._calloc(count, SZ_H3INDEX);\n    try {\n        throwIfError(H3.originToDirectedEdges(lower, upper, edges));\n        return readArrayOfH3Indexes(edges, count);\n    } finally {\n        C._free(edges);\n    }\n}\n\n/**\n * Get the vertices of a given edge as an array of [lat, lng] points. Note that for edges that\n * cross the edge of an icosahedron face, this may return 3 coordinates.\n * @static\n * @param  {H3IndexInput} edgeIndex        H3 index of the edge\n * @param {boolean} [formatAsGeoJson] Whether to provide GeoJSON output: [lng, lat]\n * @return {CoordPair[]}              Array of geo coordinate pairs\n * @throws {H3Error}                  If the input is invalid\n */\nexport function directedEdgeToBoundary(edgeIndex, formatAsGeoJson) {\n    const cellBoundary = C._malloc(SZ_CELLBOUNDARY);\n    const [lower, upper] = h3IndexToSplitLong(edgeIndex);\n    try {\n        throwIfError(H3.directedEdgeToBoundary(lower, upper, cellBoundary));\n        return readCellBoundary(cellBoundary, formatAsGeoJson);\n    } finally {\n        C._free(cellBoundary);\n    }\n}\n\n/**\n * Get the grid distance between two hex indexes. This function may fail\n * to find the distance between two indexes if they are very far apart or\n * on opposite sides of a pentagon.\n * @static\n * @param  {H3IndexInput} origin      Origin hexagon index\n * @param  {H3IndexInput} destination Destination hexagon index\n * @return {number}          Distance between hexagons\n * @throws {H3Error}         If input is invalid or the distance could not be calculated\n */\nexport function gridDistance(origin, destination) {\n    const [oLower, oUpper] = h3IndexToSplitLong(origin);\n    const [dLower, dUpper] = h3IndexToSplitLong(destination);\n    const countPtr = C._malloc(SZ_INT64);\n    try {\n        throwIfError(H3.gridDistance(oLower, oUpper, dLower, dUpper, countPtr));\n        return readInt64AsDoubleFromPointer(countPtr);\n    } finally {\n        C._free(countPtr);\n    }\n}\n\n/**\n * Given two H3 indexes, return the line of indexes between them (inclusive).\n *\n * This function may fail to find the line between two indexes, for\n * example if they are very far apart. It may also fail when finding\n * distances for indexes on opposite sides of a pentagon.\n *\n * Notes:\n *\n *  - The specific output of this function should not be considered stable\n *    across library versions. The only guarantees the library provides are\n *    that the line length will be `h3Distance(start, end) + 1` and that\n *    every index in the line will be a neighbor of the preceding index.\n *  - Lines are drawn in grid space, and may not correspond exactly to either\n *    Cartesian lines or great arcs.\n *\n * @static\n * @param  {H3IndexInput} origin      Origin hexagon index\n * @param  {H3IndexInput} destination Destination hexagon index\n * @return {H3Index[]}           H3 indexes connecting origin and destination\n * @throws {H3Error}             If input is invalid or the line cannot be calculated\n */\nexport function gridPathCells(origin, destination) {\n    const [oLower, oUpper] = h3IndexToSplitLong(origin);\n    const [dLower, dUpper] = h3IndexToSplitLong(destination);\n    const countPtr = C._malloc(SZ_INT64);\n    try {\n        throwIfError(H3.gridPathCellsSize(oLower, oUpper, dLower, dUpper, countPtr));\n        const count = validateArrayLength(readInt64AsDoubleFromPointer(countPtr));\n        const hexagons = C._calloc(count, SZ_H3INDEX);\n        try {\n            H3.gridPathCells(oLower, oUpper, dLower, dUpper, hexagons);\n            return readArrayOfH3Indexes(hexagons, count);\n        } finally {\n            C._free(hexagons);\n        }\n    } finally {\n        C._free(countPtr);\n    }\n}\n\nconst LOCAL_IJ_DEFAULT_MODE = 0;\n\n/**\n * Produces IJ coordinates for an H3 index anchored by an origin.\n *\n * - The coordinate space used by this function may have deleted\n * regions or warping due to pentagonal distortion.\n * - Coordinates are only comparable if they come from the same\n * origin index.\n * - Failure may occur if the index is too far away from the origin\n * or if the index is on the other side of a pentagon.\n * - This function is experimental, and its output is not guaranteed\n * to be compatible across different versions of H3.\n * @static\n * @param  {H3IndexInput} origin      Origin H3 index\n * @param  {H3IndexInput} destination H3 index for which to find relative coordinates\n * @return {CoordIJ}             Coordinates as an `{i, j}` pair\n * @throws {H3Error}             If the IJ coordinates cannot be calculated\n */\nexport function cellToLocalIj(origin, destination) {\n    const ij = C._malloc(SZ_COORDIJ);\n    try {\n        throwIfError(\n            H3.cellToLocalIj(\n                ...h3IndexToSplitLong(origin),\n                ...h3IndexToSplitLong(destination),\n                LOCAL_IJ_DEFAULT_MODE,\n                ij\n            )\n        );\n        return readCoordIJ(ij);\n    } finally {\n        C._free(ij);\n    }\n}\n\n/**\n * Produces an H3 index for IJ coordinates anchored by an origin.\n *\n * - The coordinate space used by this function may have deleted\n * regions or warping due to pentagonal distortion.\n * - Coordinates are only comparable if they come from the same\n * origin index.\n * - Failure may occur if the index is too far away from the origin\n * or if the index is on the other side of a pentagon.\n * - This function is experimental, and its output is not guaranteed\n * to be compatible across different versions of H3.\n * @static\n * @param  {H3IndexInput} origin     Origin H3 index\n * @param  {CoordIJ} coords     Coordinates as an `{i, j}` pair\n * @return {H3Index}            H3 index at the relative coordinates\n * @throws {H3Error}            If the H3 index cannot be calculated\n */\nexport function localIjToCell(origin, coords) {\n    // Validate input coords\n    if (!coords || typeof coords.i !== 'number' || typeof coords.j !== 'number') {\n        throw new Error('Coordinates must be provided as an {i, j} object');\n    }\n    // Allocate memory for the CoordIJ struct and an H3 index to hold the return value\n    const ij = C._malloc(SZ_COORDIJ);\n    const out = C._malloc(SZ_H3INDEX);\n    storeCoordIJ(ij, coords);\n    try {\n        throwIfError(\n            H3.localIjToCell(...h3IndexToSplitLong(origin), ij, LOCAL_IJ_DEFAULT_MODE, out)\n        );\n        return validateH3Index(readH3IndexFromPointer(out));\n    } finally {\n        C._free(ij);\n        C._free(out);\n    }\n}\n\n// ----------------------------------------------------------------------------\n// Public API functions: Distance/area utilities\n\n/**\n * Great circle distance between two geo points. This is not specific to H3,\n * but is implemented in the library and provided here as a convenience.\n * @static\n * @param  {number[]} latLng1 Origin coordinate as [lat, lng]\n * @param  {number[]} latLng2 Destination coordinate as [lat, lng]\n * @param  {string}   unit    Distance unit (either UNITS.m, UNITS.km, or UNITS.rads)\n * @return {number}           Great circle distance\n * @throws {H3Error}          If the unit is invalid\n */\nexport function greatCircleDistance(latLng1, latLng2, unit) {\n    const coord1 = storeLatLng(latLng1[0], latLng1[1]);\n    const coord2 = storeLatLng(latLng2[0], latLng2[1]);\n    let result;\n    switch (unit) {\n        case UNITS.m:\n            result = H3.greatCircleDistanceM(coord1, coord2);\n            break;\n        case UNITS.km:\n            result = H3.greatCircleDistanceKm(coord1, coord2);\n            break;\n        case UNITS.rads:\n            result = H3.greatCircleDistanceRads(coord1, coord2);\n            break;\n        default:\n            result = null;\n    }\n    C._free(coord1);\n    C._free(coord2);\n    if (result === null) {\n        throw JSBindingError(E_UNKNOWN_UNIT, unit);\n    }\n    return result;\n}\n\n/**\n * Exact area of a given cell\n * @static\n * @param  {H3IndexInput} h3Index  H3 index of the hexagon to measure\n * @param  {string}  unit     Distance unit (either UNITS.m2, UNITS.km2, or UNITS.rads2)\n * @return {number}           Cell area\n * @throws {H3Error}          If the input is invalid\n */\nexport function cellArea(h3Index, unit) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const out = C._malloc(SZ_DBL);\n    try {\n        switch (unit) {\n            case UNITS.m2:\n                throwIfError(H3.cellAreaM2(lower, upper, out));\n                break;\n            case UNITS.km2:\n                throwIfError(H3.cellAreaKm2(lower, upper, out));\n                break;\n            case UNITS.rads2:\n                throwIfError(H3.cellAreaRads2(lower, upper, out));\n                break;\n            default:\n                throw JSBindingError(E_UNKNOWN_UNIT, unit);\n        }\n        return readDoubleFromPointer(out);\n    } finally {\n        C._free(out);\n    }\n}\n\n/**\n * Calculate length of a given unidirectional edge\n * @static\n * @param  {H3IndexInput} edge     H3 index of the edge to measure\n * @param  {string}  unit     Distance unit (either UNITS.m, UNITS.km, or UNITS.rads)\n * @return {number}           Cell area\n * @throws {H3Error}          If the input is invalid\n */\nexport function edgeLength(edge, unit) {\n    const [lower, upper] = h3IndexToSplitLong(edge);\n    const out = C._malloc(SZ_DBL);\n    try {\n        switch (unit) {\n            case UNITS.m:\n                throwIfError(H3.edgeLengthM(lower, upper, out));\n                break;\n            case UNITS.km:\n                throwIfError(H3.edgeLengthKm(lower, upper, out));\n                break;\n            case UNITS.rads:\n                throwIfError(H3.edgeLengthRads(lower, upper, out));\n                break;\n            default:\n                throw JSBindingError(E_UNKNOWN_UNIT, unit);\n        }\n        return readDoubleFromPointer(out);\n    } finally {\n        C._free(out);\n    }\n}\n\n/**\n * Average hexagon area at a given resolution\n * @static\n * @param  {number} res  Hexagon resolution\n * @param  {string} unit Area unit (either UNITS.m2, UNITS.km2, or UNITS.rads2)\n * @return {number}      Average area\n * @throws {H3Error}     If the input is invalid\n */\nexport function getHexagonAreaAvg(res, unit) {\n    validateRes(res);\n    const out = C._malloc(SZ_DBL);\n    try {\n        switch (unit) {\n            case UNITS.m2:\n                throwIfError(H3.getHexagonAreaAvgM2(res, out));\n                break;\n            case UNITS.km2:\n                throwIfError(H3.getHexagonAreaAvgKm2(res, out));\n                break;\n            default:\n                throw JSBindingError(E_UNKNOWN_UNIT, unit);\n        }\n        return readDoubleFromPointer(out);\n    } finally {\n        C._free(out);\n    }\n}\n\n/**\n * Average hexagon edge length at a given resolution\n * @static\n * @param  {number} res  Hexagon resolution\n * @param  {string} unit Distance unit (either UNITS.m, UNITS.km, or UNITS.rads)\n * @return {number}      Average edge length\n * @throws {H3Error}     If the input is invalid\n */\nexport function getHexagonEdgeLengthAvg(res, unit) {\n    validateRes(res);\n    const out = C._malloc(SZ_DBL);\n    try {\n        switch (unit) {\n            case UNITS.m:\n                throwIfError(H3.getHexagonEdgeLengthAvgM(res, out));\n                break;\n            case UNITS.km:\n                throwIfError(H3.getHexagonEdgeLengthAvgKm(res, out));\n                break;\n            default:\n                throw JSBindingError(E_UNKNOWN_UNIT, unit);\n        }\n        return readDoubleFromPointer(out);\n    } finally {\n        C._free(out);\n    }\n}\n\n// ----------------------------------------------------------------------------\n// Public API functions: Vertex mode\n\n/**\n * Find the index for a vertex of a cell.\n * @static\n * @param {H3IndexInput} h3Index     Cell to find the vertex for\n * @param {number} vertexNum         Number (index) of the vertex to calculate\n * @return {H3Index}     Vertex index\n * @throws {H3Error}     If the input is invalid\n */\nexport function cellToVertex(h3Index, vertexNum) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const vertexIndex = C._malloc(SZ_H3INDEX);\n    try {\n        throwIfError(H3.cellToVertex(lower, upper, vertexNum, vertexIndex));\n        return validateH3Index(readH3IndexFromPointer(vertexIndex));\n    } finally {\n        C._free(vertexIndex);\n    }\n}\n\n/**\n * Find the indexes for all vertexes of a cell.\n * @static\n * @param {H3IndexInput} h3Index     Cell to find all vertexes for\n * @return {H3Index[]}   All vertex indexes of this cell\n * @throws {H3Error}     If the input is invalid\n */\nexport function cellToVertexes(h3Index) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    const maxNumVertexes = 6;\n    const vertexIndexes = C._calloc(maxNumVertexes, SZ_H3INDEX);\n    try {\n        throwIfError(H3.cellToVertexes(lower, upper, vertexIndexes));\n        return readArrayOfH3Indexes(vertexIndexes, maxNumVertexes);\n    } finally {\n        C._free(vertexIndexes);\n    }\n}\n\n/**\n * Get the lat, lng of a given vertex\n * @static\n * @param {H3IndexInput} h3Index A vertex index\n * @returns {CoordPair}          Latitude, longitude coordinates of the vertex\n * @throws {H3Error}             If the input is invalid\n */\nexport function vertexToLatLng(h3Index) {\n    const latlng = C._malloc(SZ_LATLNG);\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    try {\n        throwIfError(H3.vertexToLatLng(lower, upper, latlng));\n        return readLatLng(latlng);\n    } finally {\n        C._free(latlng);\n    }\n}\n\n/**\n * Returns true if the input is a valid vertex index.\n * @static\n * @param {H3IndexInput} h3Index An index to test for being a vertex index\n * @returns {boolean} True if the index represents a vertex\n */\nexport function isValidVertex(h3Index) {\n    const [lower, upper] = h3IndexToSplitLong(h3Index);\n    return Boolean(H3.isValidVertex(lower, upper));\n}\n\n// ----------------------------------------------------------------------------\n// Public informational utilities\n\n/**\n * The total count of hexagons in the world at a given resolution. Note that above\n * resolution 8 the exact count cannot be represented in a JavaScript 32-bit number,\n * so consumers should use caution when applying further operations to the output.\n * @static\n * @param  {number} res  Hexagon resolution\n * @return {number}      Count\n * @throws {H3Error}     If the resolution is invalid\n */\nexport function getNumCells(res) {\n    validateRes(res);\n    const countPtr = C._malloc(SZ_INT64);\n    try {\n        // Get number as a long value\n        throwIfError(H3.getNumCells(res, countPtr));\n        return readInt64AsDoubleFromPointer(countPtr);\n    } finally {\n        C._free(countPtr);\n    }\n}\n\n/**\n * Get all H3 indexes at resolution 0. As every index at every resolution > 0 is\n * the descendant of a res 0 index, this can be used with h3ToChildren to iterate\n * over H3 indexes at any resolution.\n * @static\n * @return {H3Index[]}  All H3 indexes at res 0\n */\nexport function getRes0Cells() {\n    const count = H3.res0CellCount();\n    const hexagons = C._malloc(SZ_H3INDEX * count);\n    try {\n        throwIfError(H3.getRes0Cells(hexagons));\n        return readArrayOfH3Indexes(hexagons, count);\n    } finally {\n        C._free(hexagons);\n    }\n}\n\n/**\n * Get the twelve pentagon indexes at a given resolution.\n * @static\n * @param  {number} res  Hexagon resolution\n * @return {H3Index[]}   All H3 pentagon indexes at res\n * @throws {H3Error}     If the resolution is invalid\n */\nexport function getPentagons(res) {\n    validateRes(res);\n    const count = H3.pentagonCount();\n    const hexagons = C._malloc(SZ_H3INDEX * count);\n    try {\n        throwIfError(H3.getPentagons(res, hexagons));\n        return readArrayOfH3Indexes(hexagons, count);\n    } finally {\n        C._free(hexagons);\n    }\n}\n\n/**\n * Convert degrees to radians\n * @static\n * @param  {number} deg Value in degrees\n * @return {number}     Value in radians\n */\nexport function degsToRads(deg) {\n    return (deg * Math.PI) / 180;\n}\n\n/**\n * Convert radians to degrees\n * @static\n * @param  {number} rad Value in radians\n * @return {number}     Value in degrees\n */\nexport function radsToDegs(rad) {\n    return (rad * 180) / Math.PI;\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  handleHexagonClick(event) {\n    const { h3Index } = event.detail\n    const currentUrl = new URL(window.location.href)\n    const params = new URLSearchParams(currentUrl.search)\n\n    // Convert the current path to h3_map path\n    const pathParts = currentUrl.pathname.split('/')\n    const newPath = [...pathParts.slice(0, -1), 'h3_map'].join('/')\n\n    // Add the h3_index to the params\n    params.set('h3_index', h3Index)\n\n    // Construct the new URL\n    const newUrl = `${newPath}?${params.toString()}`\n\n    // Open in new tab\n    window.open(newUrl, '_blank')\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    urls: Array\n  }\n\n  // Airbnb's no photo placeholder URL\n  NO_PHOTO_URL = 'https://a0.muscache.com/airbnb/static/packages/assets/frontend/pdp-platform-shared/images/preview-no-photo.9af7e28e52b828cedae1c1a221ffc7e9.png'\n\n  connect() {\n    // Defer heavy initialization to avoid blocking Turbo events\n    // Use requestIdleCallback if available, otherwise setTimeout\n    if (window.requestIdleCallback) {\n      requestIdleCallback(() => this.initialize(), { timeout: 100 })\n    } else {\n      setTimeout(() => this.initialize(), 0)\n    }\n  }\n\n  initialize() {\n    // Track failed URLs globally to avoid infinite loops\n    this.failedUrls = new Set()\n    // Track attempts per image element using WeakMap\n    this.attempts = new WeakMap()\n    // Track displayed URLs to avoid duplicates (for gallery mode)\n    this.displayedUrls = new Set()\n    // Track images that are showing placeholder to prevent further error handling\n    this.placeholderImages = new WeakSet()\n    // Track listing UUIDs that we've already attempted to refresh\n    this.refreshedListings = new Set()\n\n    // If this is a parent container, listen to child image errors\n    // If this is an image element, set up error handling directly\n    if (this.element.tagName === 'IMG') {\n      this.setupImageErrorHandler(this.element)\n      // Track this image's initial URL as displayed\n      this.displayedUrls.add(this.element.src)\n      // If the image already finished loading with an error before handlers were attached,\n      // naturalWidth will be 0. Handle it immediately.\n      if (this.element.complete && this.element.naturalWidth === 0) {\n        // Defer error handling to avoid blocking\n        setTimeout(() => this.handleErrorForImage(this.element), 0)\n      }\n    } else {\n      // Parent mode: track all initially displayed images to avoid duplicates\n      // Process images in batches to avoid blocking\n      const images = Array.from(this.element.querySelectorAll('img'))\n      this.processImagesInBatches(images)\n      // Listen to child image errors\n      this.element.addEventListener('error', this.handleError.bind(this), true)\n    }\n  }\n\n  processImagesInBatches(images, batchSize = 10) {\n    let index = 0\n\n    const processBatch = () => {\n      const batch = images.slice(index, index + batchSize)\n      batch.forEach(img => {\n        if (img.src) {\n          this.displayedUrls.add(img.src)\n        }\n        // Attach error handler to each existing image\n        this.setupImageErrorHandler(img)\n        // If any image already failed before we attached, fix it now\n        if (img.complete && img.naturalWidth === 0) {\n          this.handleErrorForImage(img)\n        }\n      })\n\n      index += batchSize\n      if (index < images.length) {\n        // Use requestIdleCallback for next batch if available\n        if (window.requestIdleCallback) {\n          requestIdleCallback(processBatch, { timeout: 50 })\n        } else {\n          setTimeout(processBatch, 0)\n        }\n      }\n    }\n\n    processBatch()\n  }\n\n  disconnect() {\n    if (this.element.tagName !== 'IMG') {\n      this.element.removeEventListener('error', this.handleError, true)\n    }\n  }\n\n  setupImageErrorHandler(img) {\n    img.addEventListener('error', (event) => {\n      this.handleErrorForImage(event.target)\n    })\n  }\n\n  handleError(event) {\n    // Only handle errors from child img elements\n    if (event.target.tagName === 'IMG') {\n      this.handleErrorForImage(event.target)\n    }\n  }\n\n  handleErrorForImage(img) {\n    // Skip if this image is already showing placeholder\n    if (this.placeholderImages.has(img)) {\n      return\n    }\n\n    const currentSrc = img.src\n\n    // Initialize attempt counter for this image element\n    if (!this.attempts.has(img)) {\n      this.attempts.set(img, 0)\n    }\n\n    const attempts = this.attempts.get(img)\n\n    // Limit to 3 fallback attempts (original + 3 fallbacks = 4 total attempts max)\n    if (attempts >= 3) {\n      this.usePlaceholderImage(img)\n      return\n    }\n\n    // Mark current URL as failed\n    this.failedUrls.add(currentSrc)\n\n    // Get fallback URLs - use urls-value if available, otherwise try to read from gallery controller\n    let fallbackUrls = this.urlsValue || []\n\n    // If in parent mode and no urls-value, try to get from gallery controller\n    if (this.element.tagName !== 'IMG' && !fallbackUrls.length) {\n      const galleryController = this.application.getControllerForElementAndIdentifier(\n        this.element,\n        'gallery'\n      )\n      if (galleryController && galleryController.imagesValue) {\n        fallbackUrls = galleryController.imagesValue\n      }\n    }\n\n    // Filter out URLs that are already displayed to avoid duplicates\n    // Also filter out the current source and failed URLs\n    const availableUrls = fallbackUrls.filter(url => {\n      return url !== currentSrc &&\n             !this.failedUrls.has(url) &&\n             !this.displayedUrls.has(url)\n    })\n\n    // Find next available URL that hasn't been tried (limit to 3 fallback URLs)\n    const nextUrl = availableUrls.slice(0, 3 - attempts)[0]\n\n    if (nextUrl) {\n      this.attempts.set(img, attempts + 1)\n      // Mark the new URL as displayed to avoid using it for another image\n      this.displayedUrls.add(nextUrl)\n      img.src = nextUrl\n    } else {\n      // No more fallbacks available, use placeholder image\n      this.usePlaceholderImage(img)\n    }\n  }\n\n  usePlaceholderImage(img) {\n    // Mark this image as using placeholder to prevent further error handling\n    this.placeholderImages.add(img)\n    // Use Airbnb's no photo placeholder instead of hiding\n    img.src = this.NO_PHOTO_URL\n\n    // Request image refresh from backend (defer to avoid blocking)\n    setTimeout(() => this.requestImageRefresh(), 0)\n  }\n\n  requestImageRefresh() {\n    const listingUuid = this.getListingUuid()\n    if (!listingUuid) return\n\n    // Skip if we've already requested refresh for this listing on this page\n    if (this.refreshedListings.has(listingUuid)) return\n\n    // Mark as attempted\n    this.refreshedListings.add(listingUuid)\n\n    // Fire and forget - don't block on this request\n    fetch(`/listings/${listingUuid}/refresh_images`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'X-CSRF-Token': document.querySelector('meta[name=\"csrf-token\"]')?.getAttribute('content') || '',\n        'X-Requested-With': 'XMLHttpRequest'\n      },\n      credentials: 'same-origin'\n    }).catch(error => {\n      // Silently fail - just log to console for debugging\n      console.error('Failed to request image refresh:', error)\n    })\n  }\n\n  getListingUuid() {\n    // 1) Try to extract from current URL path (show page)\n    const pathMatch = window.location.pathname.match(/\\/listings\\/([a-f0-9-]{36})/)\n    if (pathMatch) return pathMatch[1]\n\n    // 2) Try to extract from closest parent link's href of the IMG element (thumbnail cards)\n    if (this.element && this.element.tagName === 'IMG') {\n      const anchor = this.element.closest('a[href]')\n      const href = anchor ? anchor.getAttribute('href') : null\n      if (href) {\n        const hrefMatch = href.match(/\\/listings\\/([a-f0-9-]{36})/)\n        if (hrefMatch) return hrefMatch[1]\n      }\n    }\n\n    return null\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nconst STORAGE_KEY = \"insights_last_polygon_id\"\n\nexport default class extends Controller {\n  static values = {\n    polygonId: String,\n    polygonName: String,\n    polygonType: String,\n    polygonSlug: String,\n    countryName: String,\n    regionName: String,\n    section: String,\n    source: String\n  }\n\n  connect() {\n    this.boundTrack = () => this.scheduleTrack()\n    document.addEventListener(\"turbo:load\", this.boundTrack)\n    this.scheduleTrack()\n  }\n\n  disconnect() {\n    document.removeEventListener(\"turbo:load\", this.boundTrack)\n  }\n\n  polygonIdValueChanged() {\n    this.scheduleTrack()\n  }\n\n  scheduleTrack() {\n    requestAnimationFrame(() => this.trackIfCityChanged())\n  }\n\n  trackIfCityChanged() {\n    if (!this.polygonIdValue) return\n\n    const previousPolygonId = sessionStorage.getItem(STORAGE_KEY)\n    const isCityChange = previousPolygonId !== this.polygonIdValue\n\n    sessionStorage.setItem(STORAGE_KEY, this.polygonIdValue)\n\n    if (!isCityChange) return\n\n    const properties = {\n      polygon_id: this.polygonIdValue,\n      polygon_name: this.polygonNameValue,\n      polygon_type: this.polygonTypeValue,\n      polygon_slug: this.polygonSlugValue || null,\n      country_name: this.countryNameValue || null,\n      region_name: this.regionNameValue || null,\n      section: this.sectionValue || null,\n      previous_polygon_id: previousPolygonId || null\n    }\n\n    if (this.hasSourceValue && this.sourceValue) {\n      properties.source = this.sourceValue\n    }\n\n    const amplitude = this.application.getControllerForElementAndIdentifier(\n      document.body,\n      \"amplitude\"\n    )\n\n    if (amplitude) {\n      amplitude.trackEvent(\"Insights City Changed\", properties)\n      return\n    }\n\n    this.dispatch(\"trackEvent\", {\n      prefix: null,\n      bubbles: true,\n      detail: {\n        name: \"Insights City Changed\",\n        properties\n      }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport * as L from 'leaflet'\nimport WktLeaflet from 'wicket-leaflet'\nimport Wkt from 'wicket'\nimport { quantile } from 'simple-statistics'\nimport { cellToBoundary } from 'h3-js'\n\n\n\nexport default class extends Controller {\n  static values = {\n    compSetPolygons: String,\n    radius: Number,\n    listingCoordinates: Array,\n    markersUrl: String,\n    listingUuid: String,\n    isLoggedIn: Boolean,\n    isStorySection: Boolean,\n    locale: String,\n    zoom: Number,\n    fitListingPins: Boolean,\n    disableScrollZoom: { type: Boolean, default: false },\n    zoomControlPosition: { type: String, default: \"topleft\" },\n    listingData: { type: Array, default: [] },\n    h3Data: { type: Array, default: [] },\n    h3Attribute: { type: String, default: '' },\n    h3CurrencySymbol: { type: String, default: '' },\n    h3Translations: { type: Object, default: {} },\n    currencySymbol: { type: String, default: '' }\n  }\n\n  translations = {\n    en: {\n      signup_title: 'Sign up to access this property data',\n      signup_button: 'Register for free',\n      super_host: 'Super Host',\n      adr: 'Daily Rate',\n      revenue: 'Revenue',\n      occupancy: 'Occupancy',\n      nights_available: 'Nights Available',\n      upgrade: 'Upgrade',\n      sign_up: 'Sign up',\n      daily_rate: 'Daily rate',\n      guest_favorite: 'Guest favorite',\n      show_property: 'Show property',\n      show_comps: 'Show comparable listings'\n    },\n    fr: {\n      signup_title: 'Inscrivez-vous pour acc\u00E9der \u00E0 ces donn\u00E9es de propri\u00E9t\u00E9',\n      signup_button: \"S'inscrire gratuitement\",\n      super_host: 'Super Host',\n      adr: 'Prix moyen',\n      revenue: 'Revenu',\n      occupancy: 'Occupation',\n      nights_available: 'Nuits disponibles',\n      upgrade: 'Am\u00E9liorer',\n      sign_up: 'S\\'inscrire',\n      daily_rate: 'Tarif journalier',\n      guest_favorite: 'Coup de c\u0153ur voyageurs',\n      show_property: 'Voir la propri\u00E9t\u00E9',\n      show_comps: 'Voir les annonces comparables'\n    },\n    es: {\n      signup_title: 'Reg\u00EDstrate para acceder a esta propiedad',\n      signup_button: 'Reg\u00EDstrate gratis',\n      super_host: 'Super Host',\n      adr: 'Tarifa promedio',\n      revenue: 'Ingresos',\n      occupancy: 'Ocupaci\u00F3n',\n      nights_available: 'Noches disponibles',\n      upgrade: 'Upgrade',\n      sign_up: 'Reg\u00EDstrate',\n      daily_rate: 'Tarifa diaria',\n      guest_favorite: 'Favorito entre hu\u00E9spedes',\n      show_property: 'Ver propiedad',\n      show_comps: 'Ver anuncios comparables'\n    },\n    de: {\n      signup_title: 'Registriere dich, um auf diese Immobiliendaten zuzugreifen',\n      signup_button: 'Kostenlos registrieren',\n      super_host: 'Superhost',\n      adr: 'Tagesrate',\n      revenue: 'Umsatz',\n      occupancy: 'Auslastung',\n      nights_available: 'Verf\u00FCgbare N\u00E4chte',\n      upgrade: 'Upgrade',\n      sign_up: 'Registrieren',\n      daily_rate: 'Tagesrate',\n      guest_favorite: 'G\u00E4ste-Favorit',\n      show_property: 'Immobilie anzeigen',\n      show_comps: 'Vergleichbare Inserate anzeigen'\n    },\n    it: {\n      signup_title: 'Registrati per accedere a questi dati della propriet\u00E0',\n      signup_button: 'Registrati gratis',\n      super_host: 'Superhost',\n      adr: 'Tariffa giornaliera',\n      revenue: 'Ricavi',\n      occupancy: 'Occupazione',\n      nights_available: 'Notti disponibili',\n      upgrade: 'Aggiorna',\n      sign_up: 'Registrati',\n      daily_rate: 'Tariffa giornaliera',\n      guest_favorite: 'Amato dagli ospiti',\n      show_property: 'Mostra propriet\u00E0',\n      show_comps: 'Mostra annunci comparabili'\n    },\n    pt: {\n      signup_title: 'Registe-se para aceder a estes dados da propriedade',\n      signup_button: 'Registe-se gr\u00E1tis',\n      super_host: 'Super Host',\n      adr: 'Di\u00E1ria m\u00E9dia',\n      revenue: 'Receita',\n      occupancy: 'Ocupa\u00E7\u00E3o',\n      nights_available: 'Noites dispon\u00EDveis',\n      upgrade: 'Upgrade',\n      sign_up: 'Registar',\n      daily_rate: 'Di\u00E1ria',\n      guest_favorite: 'Favorito dos h\u00F3spedes',\n      show_property: 'Mostrar propriedade',\n      show_comps: 'Mostrar an\u00FAncios compar\u00E1veis'\n    }\n  }\n\n  getTranslation(key) {\n    const locale = this.localeValue || 'en'\n    return this.translations[locale]?.[key] || this.translations.en[key] || key\n  }\n\n  connect() {\n    // Initialize class properties\n    this.markersLayer = null\n    this.insightsLayerGroup = null\n    this.lastProgrammaticChange = Date.now()\n    this.map = null\n    this.initializeMap()\n    // Invalidate size after layout for compact map containers (e.g. calculator sidebar).\n    setTimeout(() => this.handleResize(), 100)\n    setTimeout(() => this.handleResize(), 600)\n    // Listen for resize events to invalidate map size (useful for hidden containers)\n    window.addEventListener('resize', this.handleResize.bind(this))\n    // Listen for custom invalidate-size event (from modal)\n    this.element.addEventListener('map:invalidate-size', this.handleResize.bind(this))\n\n    // Set up map state listeners after initialization\n    setTimeout(() => {\n      if (this.map) {\n        this.map.on('moveend', () => {\n          this.dispatchMapState()\n        })\n        this.map.on('zoomend', () => {\n          this.dispatchMapState()\n        })\n      }\n    }, 100)\n  }\n\n  disconnect() {\n    window.removeEventListener('resize', this.handleResize.bind(this))\n    this.element.removeEventListener('map:invalidate-size', this.handleResize.bind(this))\n    if (this._adrLegendEl) {\n      this._adrLegendEl.remove()\n      this._adrLegendEl = null\n    }\n    if (this.map) {\n      this.map.remove()\n    }\n  }\n\n  handleResize() {\n    // Invalidate map size when container becomes visible\n    if (this.map) {\n      // Check if map is fully initialized and container is connected to DOM\n      // _mapPane can be null if map is not initialized or container is detached\n      if (!this.map._mapPane || !this.element.isConnected) {\n        // Map not ready yet, skip invalidateSize\n        return\n      }\n\n      // Use requestAnimationFrame to ensure DOM is ready\n      requestAnimationFrame(() => {\n        // Double-check map pane still exists before calling invalidateSize\n        if (this.map && this.map._mapPane && this.element.isConnected) {\n          setTimeout(() => {\n            // Final check before calling (map might have been removed)\n            if (this.map && this.map._mapPane && this.element.isConnected) {\n              this.map.invalidateSize({pan: false})\n              this.updateAdrLegend()\n              if (this.fitListingPinsValue) {\n                this.fitMapToListingPins()\n              }\n            }\n          }, 50)\n        }\n      })\n    }\n  }\n\n  // Expose map instance for sharing\n  getMapInstance() {\n    return this.map\n  }\n\n  // Sync zoom/center from another map\n  syncFromMap(otherMap) {\n    if (this.map && otherMap) {\n      const zoom = otherMap.getZoom()\n      const center = otherMap.getCenter()\n      this.map.setView(center, zoom)\n    }\n  }\n\n  // Dispatch map state for synchronization\n  dispatchMapState() {\n    if (this.map) {\n      window.dispatchEvent(new CustomEvent('map:state-changed', {\n        detail: {\n          mapType: 'insights',\n          state: {\n            zoom: this.map.getZoom(),\n            center: this.map.getCenter()\n          }\n        }\n      }))\n    }\n  }\n\n  handleSignupClick(event) {\n    // Dispatch custom event using Stimulus\n    this.dispatch('signupButtonClicked', {\n      detail: {\n        source: 'map',\n        controller: 'insights-map'\n      }\n    })\n  }\n\n  // Track the current fetch request\n  currentFetch = null\n\n  async getMarkers(bounds) {\n    // Skip if markers URL is not set (e.g., on start page)\n    if (!this.markersUrlValue) {\n      return []\n    }\n\n    // If there's a pending request, abort it\n    if (this.currentFetch) {\n      this.currentFetch.abort('Map moved')\n    }\n\n    // Create new AbortController for this request\n    const controller = new AbortController()\n    this.currentFetch = controller\n\n    const url = new URL(this.markersUrlValue, window.location.origin);\n    url.searchParams.set('bounds', bounds);\n    if (this.hasListingUuidValue) {\n      url.searchParams.set('listing_uuid', this.listingUuidValue);\n    }\n\n    const response = await fetch(url.toString(), {\n      signal: controller.signal\n    })\n    const markers = await response.json()\n\n    // Clear the currentFetch if request completed successfully\n    this.currentFetch = null\n\n    return markers\n  }\n\n  initializeMap() {\n    const wkt = new Wkt.Wkt()\n\n    this.map = L.map(this.element, {\n      preferCanvas: true,\n      scrollWheelZoom: !this.disableScrollZoomValue,\n      zoomControl: false\n    })\n    L.control.zoom({\n      position: this.zoomControlPositionValue || 'topleft'\n    }).addTo(this.map)\n    const map = this.map\n\n    if (this.disableScrollZoomValue) {\n      map.scrollWheelZoom.disable()\n      const enableScrollZoomOnInteract = () => {\n        map.scrollWheelZoom.enable()\n      }\n      // Listen on the Leaflet container; once:true so first click/tap unlocks zoom\n      map.getContainer().addEventListener('pointerdown', enableScrollZoomOnInteract, { once: true })\n    }\n\n    if (this.fitListingPinsValue) {\n      map.on('moveend', () => this.updateFocusControl())\n    }\n\n    // Initialize timestamp for tracking programmatic changes\n    this.lastProgrammaticChange = Date.now()\n\n    // CartoDB Voyager tiles (same as calculator) for all insights maps\n    L.tileLayer('https://tiles.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png', {\n      attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors &copy; <a href=\"https://carto.com/attributions\">CARTO</a>',\n      retina: '@2x',\n      detectRetina: true\n    }).addTo(map)\n\n    let mainPolygon = null;\n\n    // Add radius circle if radius value is present\n    if (this.hasListingCoordinatesValue && this.radiusValue > 0) {\n      const circle = mainPolygon = L.circle(this.listingCoordinatesValue, {\n        color: '#1F6F54',\n        fillColor: '#E4F0EA',\n        fillOpacity: 0.2,\n        radius: this.radiusValue // Convert km to meters\n      }).addTo(map)\n\n      map.setView(this.listingCoordinatesValue, 13)\n      // If we have a circle, fit bounds to it\n      map.fitBounds(circle.getBounds())\n    } else if (this.compSetPolygonsValue) {\n      wkt.read(this.compSetPolygonsValue)\n      const obj = mainPolygon = wkt.toObject({\n        color: '#1F6F54',\n        fillColor: '#E4F0EA',\n        fillOpacity: 0.1,\n        weight: 2\n      })\n      obj.addTo(map)\n      // Draw polygon immediately; refine to pin cluster after markers fetch (async).\n      this.lastProgrammaticChange = Date.now()\n      map.fitBounds(obj.getBounds(), { animate: false })\n      if (this.hasMarkersUrlValue && this.markersUrlValue) {\n        this.pendingPolygonFit = obj\n      }\n    } else if (this.hasListingCoordinatesValue && !this.fitListingPinsValue) {\n      map.setView(this.listingCoordinatesValue, this.zoomValue || 14)\n    }\n\n    // Store zoom to apply after initial markers load\n    if (this.zoomValue && (map.getZoom() == 12 || map.getZoom() == 0)) {\n      this.pendingZoom = this.zoomValue\n    }\n\n    // Single layer for all markers (merged across pan/zoom; keyed by listing id)\n    this.markersLayer = L.layerGroup()\n    this.apiMarkersById = new Map()\n    this.selectedApiMarker = null\n\n    // Create layer group\n    this.insightsLayerGroup = L.layerGroup([this.markersLayer])\n    this.h3LayerGroup = null // Will be initialized when needed\n    this.activeLayerType = 'insights' // Default to insights\n\n    // Add main listing marker if coordinates are present\n    if (this.hasListingCoordinatesValue) {\n      const mainMarker = L.marker(this.listingCoordinatesValue, {\n        icon: L.divIcon({\n          className: 'marker selected',\n          iconSize: [20, 20]\n        }),\n        zIndexOffset: 1000000 // Much higher zIndex to ensure it's always on top\n      })\n      this.insightsLayerGroup.addLayer(mainMarker)\n    }\n\n    // Embedded listing_data is for pages without a markers API (e.g. /start, calculator).\n    // Use the same morphable + declutter path as the markers API.\n    const useEmbeddedListingPins = !(this.hasMarkersUrlValue && this.markersUrlValue)\n    if (useEmbeddedListingPins && this.listingDataValue && this.listingDataValue.length > 0) {\n      this.addApiMarkers(this.normalizeEmbeddedListingPins(this.listingDataValue))\n    }\n\n    // Add insights layer to map by default\n    this.insightsLayerGroup.addTo(map)\n    this.ensureAdrLegend()\n\n    // Flag to track when initial markers are loaded\n    this.initialMarkersLoaded = false\n    this.moveEndHandler = null\n    this.lastProgrammaticChange = Date.now()\n\n    // Load initial markers (cached data via API with bounds=0)\n    // Skip if markers URL is not set (e.g., on start page)\n    if (!this.markersUrlValue) {\n      this.initialMarkersLoaded = true\n      // Same pin-cluster fit as the markers API path (insights story).\n      if (this.listingDataValue?.length > 0 || this.fitListingPinsValue) {\n        this.map.invalidateSize({ animate: false })\n        this.fitMapToListingPins()\n      } else {\n        this.applyPendingZoom()\n      }\n      this.setupMoveEndListener()\n      return\n    }\n\n    this.getMarkers('0').then(markers => {\n      this.addApiMarkers(markers)\n\n      // Mark initial load as complete\n      this.initialMarkersLoaded = true\n\n      // Store pin coords so fitMapToListingPins works without embedded listingData\n      this.loadedMarkerCoordinates = markers\n        .filter((listing) => listing.c && Array.isArray(listing.c) && listing.c.length === 2)\n        .map((listing) => listing.c)\n\n      // Calculator-style fit to majority of pins (story markers arrive async)\n      if (this.loadedMarkerCoordinates.length > 0) {\n        this.map.invalidateSize({ animate: false })\n        this.fitMapToListingPins()\n      } else if (this.pendingPolygonFit) {\n        this.lastProgrammaticChange = Date.now()\n        this.map.fitBounds(this.pendingPolygonFit.getBounds(), { animate: false })\n        this.pendingPolygonFit = null\n        this.applyPendingZoom()\n      } else {\n        this.applyPendingZoom()\n      }\n\n      // Now set up the moveend listener (after all initialization is done)\n      this.setupMoveEndListener()\n    }).catch(e => {\n      // Mark as loaded even on error to allow subsequent fetches\n      this.initialMarkersLoaded = true\n\n      if (this.pendingPolygonFit) {\n        this.lastProgrammaticChange = Date.now()\n        this.map.fitBounds(this.pendingPolygonFit.getBounds(), { animate: false })\n        this.pendingPolygonFit = null\n      }\n\n      // Apply zoom first\n      this.applyPendingZoom()\n\n      // Set up listener\n      this.setupMoveEndListener()\n    });\n\n    window.addEventListener('map-expand:expand', () => {\n      // Mark programmatic change\n      this.lastProgrammaticChange = Date.now()\n\n      if (map.getZoom() < 13) {\n       map.setZoom(13)\n      }\n      setTimeout(() => {\n        this.lastProgrammaticChange = Date.now()\n        map.fitBounds(mainPolygon.getBounds())\n      }, 0)\n    })\n  }\n\n  // Coerce cached /start-style pins (adr numeric, short keys) into markers-API shape.\n  normalizeEmbeddedListingPins(listings) {\n    const symbol = this.currencySymbolValue || this.h3CurrencySymbolValue || ''\n    return (listings || []).flatMap((listing) => {\n      if (!listing?.id || !listing?.c || !Array.isArray(listing.c) || listing.c.length !== 2) return []\n\n      const adrN = Number(listing.adr_n ?? listing.adr)\n      const hasAdr = Number.isFinite(adrN) && adrN > 0\n      let adrLabel = this.formattedListingAdr(listing)\n      // Raw numeric `adr` from cache \u2192 format with currency symbol for pills/legend.\n      if (hasAdr && (!adrLabel || adrLabel === String(adrN) || adrLabel === String(Math.round(adrN)))) {\n        adrLabel = `${symbol}${Math.round(adrN)}`\n      }\n      if (!hasAdr) adrLabel = '-'\n\n      return [{\n        ...listing,\n        name: listing.name || listing.n,\n        bedrooms: listing.bedrooms ?? listing.b,\n        bathrooms: listing.bathrooms ?? listing.h,\n        capacity: listing.capacity ?? listing.a,\n        photo: listing.photo || listing.p,\n        adr: adrLabel,\n        adr_n: hasAdr ? Math.round(adrN) : 0,\n        imp: Number(listing.imp) || Math.floor((Number(listing.nb) || 0) / 10)\n      }]\n    })\n  }\n\n  buildEmbeddedListingIcon(listing) {\n    const adrLabel = this.formattedListingAdr(listing)\n    if (adrLabel) {\n      const width = Math.ceil(adrLabel.length * 8.6) + 16\n      const height = 28\n      const tone = this.adrPillTone(listing)\n      return L.divIcon({\n        className: 'marker-adr',\n        html: `<span class=\"marker-adr-label\" style=\"--pill-bg:${tone.bg};--pill-fg:${tone.fg};--pill-border:${tone.border}\">${this.escapeHtml(adrLabel)}</span>`,\n        iconSize: [width, height],\n        iconAnchor: [width / 2, height / 2]\n      })\n    }\n\n    return this.dotMarkerIcon(listing)\n  }\n\n  // Morphable pin: full-size icon box for expanded pill; only the dot receives pointer events.\n  buildMorphableMarkerIcon(listing, { expanded = false } = {}) {\n    const adrLabel = this.formattedListingAdr(listing)\n    if (!adrLabel) return this.dotMarkerIcon(listing)\n\n    const width = Math.ceil(adrLabel.length * 8.6) + 16\n    const height = 28\n    const expandedClass = expanded ? ' is-expanded' : ''\n    const tone = this.adrPillTone(listing)\n\n    return L.divIcon({\n      className: 'marker-morph-wrap',\n      html: `<span class=\"marker-morph${expandedClass}\" style=\"--pill-w: ${width}px; --pill-bg: ${tone.bg}; --pill-fg: ${tone.fg}; --pill-border: ${tone.border}\"><span class=\"marker-morph__label\">${this.escapeHtml(adrLabel)}</span></span>`,\n      iconSize: [width, height],\n      iconAnchor: [width / 2, height / 2]\n    })\n  }\n\n  refreshAdrPillRange(listings) {\n    const values = (listings || [])\n      .map((listing) => {\n        const fromAdrN = Number(listing.adr_n)\n        if (Number.isFinite(fromAdrN) && fromAdrN > 0) return fromAdrN\n        const fromAdr = Number(listing.adr)\n        return Number.isFinite(fromAdr) && fromAdr > 0 ? fromAdr : NaN\n      })\n      .filter((n) => Number.isFinite(n) && n > 0)\n      .sort((a, b) => a - b)\n\n    if (values.length === 0) {\n      this._adrPillMin = 0\n      this._adrPillMax = 0\n      this._adrLegendBreaks = null\n      this.updateAdrLegend()\n      this.applyAdrTierVisibility()\n      return\n    }\n\n    // Percentile span so a few luxury outliers don't crush everyone into one tint.\n    const at = (q) => values[Math.min(values.length - 1, Math.floor((values.length - 1) * q))]\n    let min = at(0.1)\n    let max = at(0.9)\n    if (max <= min) {\n      min = values[0]\n      max = values[values.length - 1]\n    }\n    this._adrPillMin = min\n    this._adrPillMax = max\n    const span = max - min\n    this._adrLegendBreaks = [0.25, 0.5, 0.75].map((q) => min + span * q)\n    if (!this._adrTierVisible) this._adrTierVisible = [true, true, true, true]\n    this.updateAdrLegend()\n    this.applyAdrTierVisibility()\n  }\n\n  ensureAdrLegend() {\n    if (this._adrLegendEl || !this.map) return\n    if (!this._adrTierVisible) this._adrTierVisible = [true, true, true, true]\n\n    // Overlay on the map host (sibling of Leaflet), not an L.Control \u2014 survives modal\n    // moves and stays above tiles/markers the same way as the story map toggles.\n    const host = this.element.parentElement || this.element\n    if (getComputedStyle(host).position === 'static') {\n      host.style.position = 'relative'\n    }\n\n    const el = document.createElement('div')\n    el.className = 'map-adr-legend map-adr-legend--overlay'\n    el.innerHTML = `\n      <div class=\"map-adr-legend__title\"></div>\n      <div class=\"map-adr-legend__rows\"></div>\n    `\n    el.addEventListener('click', (event) => {\n      const row = event.target.closest('[data-adr-tier]')\n      if (!row) return\n      const tier = Number(row.dataset.adrTier)\n      if (!Number.isInteger(tier)) return\n      this.toggleAdrTier(tier)\n    })\n    el.addEventListener('wheel', (event) => event.stopPropagation())\n    el.addEventListener('dblclick', (event) => event.stopPropagation())\n    el.addEventListener('mousedown', (event) => event.stopPropagation())\n\n    host.appendChild(el)\n    this._adrLegendEl = el\n    this.updateAdrLegend()\n  }\n\n  updateAdrLegend() {\n    this.ensureAdrLegend()\n    const el = this._adrLegendEl\n    if (!el) return\n\n    const min = this._adrPillMin || 0\n    const max = this._adrPillMax || 0\n    const breaks = this._adrLegendBreaks\n    const show =\n      this.activeLayerType !== 'h3' &&\n      breaks &&\n      Number.isFinite(min) &&\n      Number.isFinite(max) &&\n      max > min\n\n    el.hidden = !show\n    el.classList.toggle('is-hidden', !show)\n    if (!show) return\n\n    const title = el.querySelector('.map-adr-legend__title')\n    if (title) title.textContent = this.getTranslation('daily_rate')\n\n    const rows = el.querySelector('.map-adr-legend__rows')\n    if (!rows) return\n\n    const swatches = [0.125, 0.375, 0.625, 0.875].map((t) => this.lerpAdrPillTone(t).bg)\n    const [b1, b2, b3] = breaks\n    const f = (v) => this.formatAdrLegendValue(v)\n    const visible = this._adrTierVisible || [true, true, true, true]\n\n    const items = [\n      { color: swatches[0], label: `< ${f(b1)}` },\n      { color: swatches[1], label: `${f(b1)} - ${f(b2)}` },\n      { color: swatches[2], label: `${f(b2)} - ${f(b3)}` },\n      { color: swatches[3], label: `> ${f(b3)}` }\n    ]\n\n    rows.innerHTML = items\n      .map(\n        (item, index) => `\n        <button type=\"button\" class=\"map-adr-legend__row${visible[index] ? '' : ' is-off'}\" data-adr-tier=\"${index}\" aria-pressed=\"${visible[index] ? 'true' : 'false'}\">\n          <span class=\"map-adr-legend__swatch\" style=\"background:${item.color}\"></span>\n          <span class=\"map-adr-legend__label\">${item.label}</span>\n        </button>\n      `\n      )\n      .join('')\n  }\n\n  toggleAdrTier(tierIndex) {\n    if (!this._adrTierVisible) this._adrTierVisible = [true, true, true, true]\n    if (tierIndex < 0 || tierIndex > 3) return\n\n    this._adrTierVisible[tierIndex] = !this._adrTierVisible[tierIndex]\n\n    // Keep at least one tier visible so the map never goes empty by accident.\n    if (this._adrTierVisible.every((on) => !on)) {\n      this._adrTierVisible[tierIndex] = true\n      return\n    }\n\n    const row = this._adrLegendEl?.querySelector(`[data-adr-tier=\"${tierIndex}\"]`)\n    if (row) {\n      const on = this._adrTierVisible[tierIndex]\n      row.classList.toggle('is-off', !on)\n      row.setAttribute('aria-pressed', on ? 'true' : 'false')\n    }\n\n    this.applyAdrTierVisibility()\n    requestAnimationFrame(() => this.syncMarkerPillsForOverlap())\n  }\n\n  adrTierForListing(listing) {\n    const n = Number(listing?.adr_n)\n    const breaks = this._adrLegendBreaks\n    if (!breaks || !Number.isFinite(n) || n <= 0) return null\n    if (n < breaks[0]) return 0\n    if (n < breaks[1]) return 1\n    if (n < breaks[2]) return 2\n    return 3\n  }\n\n  applyAdrTierVisibility() {\n    if (!this.apiMarkersById || !this.markersLayer) return\n\n    this.apiMarkersById.forEach((marker) => {\n      const tier = this.adrTierForListing(marker._listingData)\n      const visible = tier === null || this._adrTierVisible?.[tier] !== false\n      marker._adrTierHidden = !visible\n\n      if (visible) {\n        if (!this.markersLayer.hasLayer(marker)) this.markersLayer.addLayer(marker)\n      } else if (this.markersLayer.hasLayer(marker)) {\n        if (this.selectedApiMarker === marker) {\n          this.map?.closePopup()\n          this.selectedApiMarker = null\n        }\n        this.markersLayer.removeLayer(marker)\n      }\n    })\n  }\n\n  formatAdrLegendValue(value) {\n    const symbol = this.currencySymbolValue || this.h3CurrencySymbolValue || ''\n    const n = Math.round(Number(value) || 0)\n    if (n >= 1000) {\n      const k = n / 1000\n      const compact = k >= 100 ? Math.round(k).toString() : k.toFixed(1).replace(/\\.0$/, '')\n      return `${symbol}${compact}K`\n    }\n    return `${symbol}${n.toLocaleString(this.localeValue || 'en')}`\n  }\n\n  // Light \u2192 dark Canopy scale by ADR relative to current marker set.\n  adrPillTone(listing) {\n    const n = Number(listing?.adr_n)\n    const min = this._adrPillMin || 0\n    const max = this._adrPillMax || 0\n    if (!Number.isFinite(n) || n <= 0 || max <= min) {\n      return { bg: '#ffffff', fg: '#111827', border: '#e5e7eb' }\n    }\n\n    const t = Math.min(1, Math.max(0, (n - min) / (max - min)))\n    return this.lerpAdrPillTone(t)\n  }\n\n  // Continuous mint \u2192 Forest Night so nearby ADRs still read as different.\n  lerpAdrPillTone(t) {\n    const stops = [\n      { t: 0, bg: [228, 240, 234], fg: [12, 26, 20], border: [197, 217, 206] },\n      { t: 0.35, bg: [184, 217, 201], fg: [12, 26, 20], border: [143, 203, 176] },\n      { t: 0.55, bg: [143, 203, 176], fg: [12, 26, 20], border: [31, 111, 84] },\n      { t: 0.75, bg: [31, 111, 84], fg: [242, 247, 244], border: [22, 99, 72] },\n      { t: 1, bg: [12, 26, 20], fg: [242, 247, 244], border: [12, 26, 20] }\n    ]\n\n    let i = 0\n    while (i < stops.length - 2 && t > stops[i + 1].t) i += 1\n    const a = stops[i]\n    const b = stops[i + 1]\n    const u = (t - a.t) / (b.t - a.t || 1)\n    const mix = (c0, c1) => Math.round(c0 + (c1 - c0) * u)\n    const rgb = (c) => `rgb(${c[0]}, ${c[1]}, ${c[2]})`\n    const bg = [0, 1, 2].map((k) => mix(a.bg[k], b.bg[k]))\n    const border = [0, 1, 2].map((k) => mix(a.border[k], b.border[k]))\n    const fg = this.pillForegroundForBackground(bg)\n    return { bg: rgb(bg), fg, border: rgb(border) }\n  }\n\n  pillForegroundForBackground([r, g, b]) {\n    const channel = (c) => {\n      const s = c / 255\n      return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4)\n    }\n    const luminance =\n      0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b)\n    return luminance > 0.42 ? 'rgb(12, 26, 20)' : 'rgb(242, 247, 244)'\n  }\n\n  applyAdrPillTone(marker) {\n    const el = marker.getElement()?.querySelector('.marker-morph, .marker-adr-label')\n    if (!el || !marker._listingData) return\n    const tone = this.adrPillTone(marker._listingData)\n    el.style.setProperty('--pill-bg', tone.bg)\n    el.style.setProperty('--pill-fg', tone.fg)\n    el.style.setProperty('--pill-border', tone.border)\n    const label = el.querySelector('.marker-morph__label')\n    if (label) label.style.color = tone.fg\n  }\n\n  reapplyAllMarkerTones() {\n    if (!this.apiMarkersById) return\n\n    this.apiMarkersById.forEach((marker) => {\n      if (!marker._listingData) return\n\n      const morphEl = marker.getElement()?.querySelector('.marker-morph')\n      if (morphEl) {\n        this.applyAdrPillTone(marker)\n        return\n      }\n\n      const tone = this.adrPillTone(marker._listingData)\n      if (marker.options?.icon?.options) marker.options.icon.options.pillBg = tone.bg\n      this.applyDotMarkerTone(marker)\n    })\n  }\n\n  // Cheap pin; color follows the same ADR scale as pills.\n  dotMarkerIcon(listing = null) {\n    const n = Number(listing?.adr_n)\n    const tone =\n      listing && Number.isFinite(n) && n > 0 ? this.adrPillTone(listing) : null\n    const bg = tone?.bg || '#1F6F54'\n    return L.divIcon({\n      className: 'marker',\n      html: '',\n      iconSize: [12, 12],\n      iconAnchor: [6, 6],\n      pillBg: bg\n    })\n  }\n\n  applyDotMarkerTone(marker) {\n    const el = marker.getElement()\n    if (!el) return\n    const bg = marker.options?.icon?.options?.pillBg\n    if (bg) el.style.setProperty('--pill-bg', bg)\n  }\n\n  // Morphable pins: auto-expand to ADR pills when they don't overlap on screen.\n  // Priority = selected, then higher `imp` (nights-booked score).\n  // Only top-N by imp get heavy morph DOM; the rest stay cheap dots.\n  // merge: true keeps existing pins and only inserts unseen listing ids (no flicker on pan/zoom).\n  addApiMarkers(listings, { merge = false } = {}) {\n    if (!this.apiMarkersById) this.apiMarkersById = new Map()\n\n    if (!merge) {\n      this.markersLayer.clearLayers()\n      this.apiMarkersById.clear()\n      this.selectedApiMarker = null\n    }\n\n    const valid = (listings || []).filter(\n      (listing) =>\n        listing?.id &&\n        listing.c &&\n        Array.isArray(listing.c) &&\n        listing.c.length === 2 &&\n        !this.apiMarkersById.has(listing.id)\n    )\n    if (valid.length === 0) {\n      this.ensurePillDeclutterListener()\n      requestAnimationFrame(() => this.syncMarkerPillsForOverlap())\n      return\n    }\n\n    const existingListings = []\n    this.apiMarkersById.forEach((marker) => {\n      if (marker._listingData) existingListings.push(marker._listingData)\n    })\n    this.refreshAdrPillRange([...existingListings, ...valid])\n    this.reapplyAllMarkerTones()\n\n    valid.forEach((listing) => {\n      const hasAdr = this.formattedListingAdr(listing)\n      const marker = L.marker(listing.c, {\n        icon: hasAdr ? this.buildMorphableMarkerIcon(listing) : this.dotMarkerIcon(listing),\n        zIndexOffset: 0\n      })\n      marker._listingData = listing\n      marker._canMorph = !!hasAdr\n      marker._eagerMorph = !!hasAdr\n      marker._pillPinned = false\n      marker._showingAdr = false\n      marker._hoverAdr = false\n      marker._selected = false\n\n      if (hasAdr) {\n        const bindMorphHover = () => {\n          const morph = marker.getElement()?.querySelector('.marker-morph')\n          if (!morph || morph.dataset.hoverBound === 'true') return\n          morph.dataset.hoverBound = 'true'\n\n          morph.addEventListener('mouseenter', () => {\n            if (marker._hideAdrTimeout) {\n              clearTimeout(marker._hideAdrTimeout)\n              marker._hideAdrTimeout = null\n            }\n            marker._hoverAdr = true\n            this.showApiMarkerAdr(marker)\n          })\n          morph.addEventListener('mouseleave', () => {\n            if (marker._selected || marker._pillPinned) return\n            if (marker._hideAdrTimeout) clearTimeout(marker._hideAdrTimeout)\n            marker._hideAdrTimeout = setTimeout(() => {\n              marker._hideAdrTimeout = null\n              const morphEl = marker.getElement()?.querySelector('.marker-morph')\n              if (morphEl?.matches(':hover')) {\n                marker._hoverAdr = true\n                return\n              }\n              marker._hoverAdr = false\n              if (!marker._selected && !marker._pillPinned) {\n                this.hideApiMarkerAdr(marker)\n              }\n            }, 120)\n          })\n        }\n\n        marker.on('add', bindMorphHover)\n        bindMorphHover()\n      }\n\n      marker.on('click', (e) => {\n        // Guest preview maps with fitListingPins stay pins-only (calculator SEO-style).\n        if (!this.isLoggedInValue && this.fitListingPinsValue) return\n        this.openApiMarkerPopup(marker, e.latlng)\n      })\n\n      this.markersLayer.addLayer(marker)\n      this.apiMarkersById.set(listing.id, marker)\n    })\n\n    this.applyAdrTierVisibility()\n    this.ensurePillDeclutterListener()\n    requestAnimationFrame(() => this.syncMarkerPillsForOverlap())\n  }\n\n  ensurePillDeclutterListener() {\n    if (!this.map || this._pillDeclutterBound) return\n    this._pillDeclutterBound = true\n    // Zoom changes relative spacing \u2192 full declutter. Pan does not (markers move together);\n    // addApiMarkers already syncs after bounds refetch on moveend.\n    this.map.on('zoomend', () => {\n      clearTimeout(this._pillDeclutterTimeout)\n      this._pillDeclutterTimeout = setTimeout(() => this.syncMarkerPillsForOverlap(), 120)\n    })\n  }\n\n  pillSizeForListing(listing) {\n    if (!listing) return null\n    if (listing._pillSize) return listing._pillSize\n    const adrLabel = this.formattedListingAdr(listing)\n    if (!adrLabel) return null\n    listing._pillSize = {\n      w: Math.ceil(adrLabel.length * 8.6) + 16,\n      h: 28\n    }\n    return listing._pillSize\n  }\n\n  pillScreenRect(marker, { inflate = 1 } = {}) {\n    const size = this.pillSizeForListing(marker._listingData)\n    if (!size || !this.map) return null\n    const w = size.w * inflate\n    const h = size.h * inflate\n    const pt = this.map.latLngToContainerPoint(marker.getLatLng())\n    return {\n      left: pt.x - w / 2,\n      top: pt.y - h / 2,\n      right: pt.x + w / 2,\n      bottom: pt.y + h / 2\n    }\n  }\n\n  pillRectsOverlap(a, b, pad = 12) {\n    return !(\n      a.right + pad <= b.left ||\n      b.right + pad <= a.left ||\n      a.bottom + pad <= b.top ||\n      b.bottom + pad <= a.top\n    )\n  }\n\n  pillRectInViewport(rect) {\n    if (!this.map || !rect) return false\n    const size = this.map.getSize()\n    return rect.right > 0 && rect.left < size.x && rect.bottom > 0 && rect.top < size.y\n  }\n\n  // Higher zoom \u2192 allow a larger share of non-colliding pills + tighter spacing.\n  pillDeclutterSettings() {\n    const zoom = this.map?.getZoom?.() ?? 13\n    const t = Math.min(1, Math.max(0, (zoom - 12) / 6)) // z12 \u2192 0, z18 \u2192 1\n    return {\n      ratio: 0.12 + t * 0.88, // ~12% \u2192 100% of non-colliding candidates\n      inflate: 1.75 - t * 0.55, // 1.75 \u2192 1.20\n      pad: Math.round(12 - t * 8) // 12 \u2192 4\n    }\n  }\n\n  // Greedy: pin highest-imp markers as pills while they fit without overlap.\n  // Density scales with zoom so zooming in reveals more ADR pills.\n  syncMarkerPillsForOverlap() {\n    if (!this.map || !this.markersLayer) return\n\n    const { ratio, inflate, pad } = this.pillDeclutterSettings()\n    const mapSize = this.map.getSize()\n    const candidates = []\n\n    this.markersLayer.eachLayer((marker) => {\n      if (!marker._listingData || !this.formattedListingAdr(marker._listingData)) return\n      // Cheap viewport cull before sorting / collision\n      const pt = this.map.latLngToContainerPoint(marker.getLatLng())\n      if (pt.x < -60 || pt.y < -60 || pt.x > mapSize.x + 60 || pt.y > mapSize.y + 60) {\n        if (marker._pillPinned && !marker._selected) {\n          marker._pillPinned = false\n          this.hideApiMarkerAdr(marker, { force: true })\n        }\n        return\n      }\n      candidates.push(marker)\n    })\n\n    candidates.sort((a, b) => {\n      if (a._selected !== b._selected) return a._selected ? -1 : 1\n      return (Number(b._listingData.imp) || 0) - (Number(a._listingData.imp) || 0)\n    })\n\n    const maxPills = Math.max(1, Math.floor(candidates.length * ratio))\n    const placed = []\n    let pinnedCount = 0\n\n    candidates.forEach((marker) => {\n      if (marker._hoverAdr) return\n\n      const rect = this.pillScreenRect(marker, { inflate })\n      const inView = !!(rect && this.pillRectInViewport(rect))\n      let shouldPin = false\n\n      if (inView) {\n        const atCap = !marker._selected && pinnedCount >= maxPills\n        const collides = placed.some((other) => this.pillRectsOverlap(rect, other, pad))\n        shouldPin = marker._selected || (!collides && !atCap)\n      }\n\n      if (shouldPin) {\n        marker._pillPinned = true\n        this.showApiMarkerAdr(marker)\n        placed.push(rect)\n        if (!marker._selected) pinnedCount += 1\n        return\n      }\n\n      if (marker._pillPinned) {\n        marker._pillPinned = false\n        if (!marker._selected && !marker._hoverAdr) this.hideApiMarkerAdr(marker, { force: true })\n      }\n    })\n  }\n\n  showApiMarkerAdr(marker) {\n    if (!marker?._listingData) return\n    if (!this.formattedListingAdr(marker._listingData)) return\n\n    const el = marker.getElement()?.querySelector('.marker-morph')\n    if (el) {\n      el.classList.add('is-expanded')\n      this.applyAdrPillTone(marker)\n    } else {\n      marker.setIcon(this.buildMorphableMarkerIcon(marker._listingData, { expanded: true }))\n      this.applyAdrPillTone(marker)\n    }\n\n    const z = marker._pillPinned && !marker._hoverAdr && !marker._selected ? 600 : 1000\n    if (marker.options.zIndexOffset !== z) marker.setZIndexOffset(z)\n    marker._showingAdr = true\n  }\n\n  hideApiMarkerAdr(marker, { force = false } = {}) {\n    if (!marker || marker._selected) return\n    if (marker._hoverAdr && !force) return\n    if (!force && marker._pillPinned) return\n    if (!marker._showingAdr && !marker._pillPinned) return\n\n    const el = marker.getElement()?.querySelector('.marker-morph')\n    if (marker._eagerMorph && el) {\n      el.classList.remove('is-expanded')\n    } else if (marker._listingData) {\n      marker.setIcon(this.dotMarkerIcon(marker._listingData))\n      requestAnimationFrame(() => this.applyDotMarkerTone(marker))\n    }\n    if (marker.options.zIndexOffset !== 0) marker.setZIndexOffset(0)\n    marker._showingAdr = false\n  }\n\n  openApiMarkerPopup(marker, latlng) {\n    const listing = marker._listingData\n    if (!listing) return\n\n    if (this.selectedApiMarker && this.selectedApiMarker !== marker) {\n      this.selectedApiMarker._selected = false\n      if (!this.selectedApiMarker._pillPinned) this.hideApiMarkerAdr(this.selectedApiMarker)\n    }\n\n    this.selectedApiMarker = marker\n    marker._selected = true\n    this.showApiMarkerAdr(marker)\n\n    const content = this.isLoggedInValue\n      ? this.getMarkerContent(listing)\n      : this.getGuestMarkerContentFromAPI(listing)\n\n    const popup = L.popup({\n      autoPan: true,\n      closeButton: false\n    })\n      .setContent(content)\n      .setLatLng(latlng)\n      .openOn(this.map)\n\n    popup.on('remove', () => {\n      marker._selected = false\n      if (!marker._pillPinned) this.hideApiMarkerAdr(marker)\n      if (this.selectedApiMarker === marker) this.selectedApiMarker = null\n      this.syncMarkerPillsForOverlap()\n    })\n  }\n\n  // Prefer server-formatted ADR (number_to_currency), same as listing popup cards.\n  formattedListingAdr(listing) {\n    const formatted = String(listing?.adr || '').trim()\n    if (formatted && formatted !== '-') return formatted\n    return null\n  }\n\n  escapeHtml(value) {\n    return String(value)\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#39;')\n  }\n\n  getMarkerContent(listing) {\n    return `\n      <div class=\"bg-white rounded-lg w-[300px]\">\n        <div class=\"overflow-hidden relative w-full h-[150px]\">\n          <a href=\"/listings/${listing.id}\" class=\"!text-black\" target=\"_blank\">\n              <div class=\"absolute top-2 right-2 flex items-center bg-white rounded-full px-2 py-1\">\n              <svg class=\"lucide lucide-star w-4 h-4 text-yellow-400 mr-1\" fill=\"none\" height=\"24\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n                <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"></polygon>\n              </svg>\n              <span class=\"text-sm font-medium\">${listing.r[0]}</span>\n              <span class=\"text-xs text-gray-500 ml-1\">(${listing.r[1]})</span>\n            </div>\n\n            <div class=\"absolute bottom-2 right-2 flex items-center space-x-2 font-medium\">\n              <div class=\"w-fit whitespace-nowrap rounded-full border text-xs border-transparent bg-white flex items-center px-2.5 py-0.5\">\n                <i class=\"fa fa-bed pr-1\"></i>\n                ${listing.bedrooms}\n              </div>\n              <div class=\"w-fit whitespace-nowrap rounded-full border text-xs border-transparent bg-white flex items-center px-2.5 py-0.5\">\n                <i class=\"fa fa-bath pr-1\"></i>\n                ${listing.bathrooms}\n              </div>\n              <div class=\"w-fit whitespace-nowrap rounded-full border text-xs border-transparent bg-white flex items-center px-2.5 py-0.5\">\n                <i class=\"fa fa-person-walking-luggage pr-1\"></i>\n                ${listing.capacity}\n              </div>\n            </div>\n\n            <div class=\"absolute top-2 left-2 flex flex-col gap-1\">\n              <div class=\"${listing.sh && (!listing.gf_bool && !listing.gf) ? 'block' : 'hidden'}\">\n                <div class=\"inline-flex w-fit items-center whitespace-nowrap rounded-full border text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-white px-2.5 py-0.5\">\n                  ${this.getTranslation('super_host')}\n                </div>\n              </div>\n              ${this.getGuestFavoriteBadge(listing)}\n            </div>\n\n            <img class=\"bg-gray-200 w-full h-full object-cover object-center rounded-t-lg\" src=\"${listing.photo}\">\n          </div>\n        </a>\n        <a href=\"/listings/${listing.id}\" class=\"!text-black\" target=\"_blank\">\n          <div class=\"px-3 py-2 text-sm font-medium\">\n            ${listing.name}\n          </div>\n        </a>\n        <div class=\"px-3 pb-3 grid grid-cols-2 grid-rows-2 gap-2 text-sm mx-auto w-full select-none\">\n          <div class=\"flex flex-col\">\n            <span class=\"text-gray-500\">${this.getTranslation('adr')}</span>\n            <span class=\"font-medium\">${listing.adr || '-'}</span>\n          </div>\n          <div class=\"flex flex-col\">\n            <span class=\"text-gray-500\">${this.getTranslation('revenue')}</span>\n            <span class=\"font-medium\">\n              ${listing.revenue === false ? this.getUnlockButton() : listing.revenue || '-'}\n            </span>\n          </div>\n          <div class=\"flex flex-col\">\n            <span class=\"text-gray-500\">${this.getTranslation('occupancy')}</span>\n            <span class=\"font-medium\">\n              ${listing.occupancy === false ? this.getUnlockButton() : listing.occupancy || '-'}\n            </span>\n          </div>\n          <div class=\"flex flex-col\">\n            <span class=\"text-gray-500\">${this.getTranslation('nights_available')}</span>\n            <span class=\"font-medium\">\n              ${listing.nights_available === false ? this.getUnlockButton() : listing.nights_available || '-'}\n            </span>\n          </div>\n        </div>\n      </div>\n    `\n  }\n\n  getUnlockButton() {\n    return `\n      <button data-action=\"application#openPricingModal\" class=\"text-xs bg-gray-200 text-gray-500 px-2 py-1 rounded-md hover:bg-gray-300\">\n        <i class=\"fa fa-lock\"></i> ${this.getTranslation('upgrade')}\n      </button>\n    `\n  }\n\n  getSignupButton() {\n    return `\n      <button data-action=\"click->insights-map#handleSignupClick\" data-application-auth-source-param=\"map\" class=\"text-xs bg-gray-200 text-gray-500 px-2 py-1 rounded-md hover:bg-gray-300\">\n        <i class=\"fa fa-lock\"></i> ${this.getTranslation('sign_up')}\n      </button>\n    `\n  }\n\n  renderCachedMarkers() {\n    if (!this.listingDataValue || this.listingDataValue.length === 0) return;\n\n    this.listingDataValue.forEach((listing, index) => {\n      const label = L.divIcon({\n        className: 'marker',\n        iconSize: [12, 12]\n      });\n\n      const marker = L.marker(listing.c.reverse(), { icon: label });\n\n      if (!this.isLoggedInValue) {\n        // For non-logged in users - use cached data popup\n        marker.on('click', (e) => {\n          const popup = L.popup({\n            autoPan: true,\n            closeButton: false\n          })\n            .setContent(() => this.getGuestMarkerContent(index))\n            .setLatLng(e.latlng)\n            .openOn(this.map)\n        });\n      } else {\n        // For logged in users - fetch full data when clicked\n        marker.on('click', (e) => {\n          const popup = L.popup({\n            autoPan: true,\n            closeButton: false\n          })\n            .setContent(() => this.getMarkerContent(listing))\n            .setLatLng(e.latlng)\n            .openOn(this.map)\n        });\n      }\n\n      this.markersLayer.addLayer(marker);\n    });\n  }\n\n  getGuestFavoriteBadge(listing) {\n    if (!listing.gf_bool && !listing.gf) return '';\n\n    let label = this.getTranslation('guest_favorite'); // Default\n    const p = listing.gf;\n\n    if (p === 1) label = 'Top 1%';\n    else if (p >= 2 && p <= 5) label = 'Top 5%';\n    else if (p >= 6 && p <= 10) label = 'Top 10%';\n\n    return `\n      <div class=\"inline-flex w-fit items-center whitespace-nowrap rounded-full border text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-yellow-50 text-yellow-800 border-yellow-200 px-2.5 py-0.5\">\n        <svg class=\"w-3 h-3 mr-1 text-yellow-500\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n          <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z\"></path>\n        </svg>\n        ${label}\n      </div>\n    `;\n  }\n\n  getGuestMarkerContentFromAPI(listing) {\n    return `\n    <div class=\"bg-white rounded-lg w-[300px]\">\n      <div class=\"overflow-hidden relative w-full h-[150px] cursor-pointer\" onclick=\"window.open('/listings/${listing.id}', '_blank')\">\n        <div class=\"absolute top-2 right-2 flex items-center bg-white rounded-full px-2 py-1 z-10\">\n          <svg class=\"lucide lucide-star w-4 h-4 text-yellow-400 mr-1\" fill=\"none\" height=\"24\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n            <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"></polygon>\n          </svg>\n          <span class=\"text-sm font-medium\">${listing.r[0]}</span>\n          <span class=\"text-xs text-gray-500 ml-1\">(${listing.r[1]})</span>\n        </div>\n\n        <div class=\"absolute top-2 left-2 flex flex-col gap-1 z-10\">\n          ${this.getGuestFavoriteBadge(listing)}\n        </div>\n\n        <div class=\"absolute bottom-2 right-2 flex items-center space-x-2 font-medium z-10\">\n          <div class=\"w-fit whitespace-nowrap rounded-full border text-xs border-transparent bg-white flex items-center px-2.5 py-0.5\">\n            <i class=\"fa fa-bed pr-1\"></i>\n            ${listing.bedrooms}\n          </div>\n          <div class=\"w-fit whitespace-nowrap rounded-full border text-xs border-transparent bg-white flex items-center px-2.5 py-0.5\">\n            <i class=\"fa fa-bath pr-1\"></i>\n            ${listing.bathrooms}\n          </div>\n          <div class=\"w-fit whitespace-nowrap rounded-full border text-xs border-transparent bg-white flex items-center px-2.5 py-0.5\">\n            <i class=\"fa fa-person-walking-luggage pr-1\"></i>\n            ${listing.capacity}\n          </div>\n        </div>\n\n        <img class=\"bg-gray-200 w-full h-full object-cover object-center rounded-t-lg\" src=\"${listing.photo}\" onerror=\"this.src='https://cdn.guestfavorites.com/assets/placeholder.jpg'\">\n      </div>\n\n      <div class=\"px-3 py-2 text-sm font-medium cursor-pointer\" onclick=\"window.open('/listings/${listing.id}', '_blank')\">\n        ${listing.name}\n      </div>\n      <div class=\"px-3 pb-3 grid grid-cols-2 grid-rows-2 gap-2 text-sm mx-auto w-full select-none\">\n        <div class=\"flex flex-col\">\n          <span class=\"text-gray-500\">${this.getTranslation('daily_rate')}</span>\n          <span class=\"font-medium\">\n            ${this.getSignupButton()}\n          </span>\n        </div>\n        <div class=\"flex flex-col\">\n          <span class=\"text-gray-500\">${this.getTranslation('revenue')}</span>\n          <span class=\"font-medium\">\n            ${this.getSignupButton()}\n          </span>\n        </div>\n        <div class=\"flex flex-col\">\n          <span class=\"text-gray-500\">${this.getTranslation('occupancy')}</span>\n          <span class=\"font-medium\">\n            ${this.getSignupButton()}\n          </span>\n        </div>\n        <div class=\"flex flex-col\">\n          <span class=\"text-gray-500\">${this.getTranslation('nights_available')}</span>\n          <span class=\"font-medium\">\n            ${this.getSignupButton()}\n          </span>\n        </div>\n      </div>\n    </div>`\n  }\n\n  // Add new method for guest marker popup content\n  getGuestMarkerContent(index) {\n    const listingData = this.hasListingDataValue ? this.listingDataValue : []\n    const listing = listingData[index] || {}\n\n    return `\n    <div class=\"bg-white rounded-lg w-[300px]\">\n      <div class=\"overflow-hidden relative w-full h-[150px] cursor-pointer\" data-action=\"click->insights-map#handleSignupClick\" data-application-auth-source-param=\"map\">\n        <div class=\"absolute top-2 right-2 flex items-center bg-white rounded-full px-2 py-1 z-10\">\n          <svg class=\"lucide lucide-star w-4 h-4 text-yellow-400 mr-1\" fill=\"none\" height=\"24\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n            <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"></polygon>\n          </svg>\n          <span class=\"text-sm font-medium\">${Array.isArray(listing.r) ? listing.r[0] : (listing.r || '-')}</span>\n          <span class=\"text-xs text-gray-500 ml-1\">(${Array.isArray(listing.r) ? listing.r[1] : (listing.v || '-')})</span>\n        </div>\n\n        <div class=\"absolute top-2 left-2 flex flex-col gap-1 z-10\">\n          ${this.getGuestFavoriteBadge(listing)}\n        </div>\n\n        <div class=\"absolute bottom-2 right-2 flex items-center space-x-2 font-medium z-10\">\n          <div class=\"w-fit whitespace-nowrap rounded-full border text-xs border-transparent bg-white flex items-center px-2.5 py-0.5\">\n            <i class=\"fa fa-bed pr-1\"></i>\n            ${listing.b || '-'}\n          </div>\n          <div class=\"w-fit whitespace-nowrap rounded-full border text-xs border-transparent bg-white flex items-center px-2.5 py-0.5\">\n            <i class=\"fa fa-bath pr-1\"></i>\n            ${listing.h || '-'}\n          </div>\n          <div class=\"w-fit whitespace-nowrap rounded-full border text-xs border-transparent bg-white flex items-center px-2.5 py-0.5\">\n            <i class=\"fa fa-person-walking-luggage pr-1\"></i>\n            ${listing.a || '-'}\n          </div>\n        </div>\n\n        <img class=\"bg-gray-200 w-full h-full object-cover object-center rounded-t-lg\" src=\"${listing.p || 'https://cdn.guestfavorites.com/assets/placeholder.jpg'}\" onerror=\"this.src='https://cdn.guestfavorites.com/assets/placeholder.jpg'\">\n      </div>\n\n      <div class=\"px-3 py-2 text-sm font-medium cursor-pointer\" data-action=\"click->insights-map#handleSignupClick\" data-application-auth-source-param=\"map\">\n        ${listing.n || '-'}\n      </div>\n      <div class=\"px-3 pb-3 grid grid-cols-2 grid-rows-2 gap-2 text-sm mx-auto w-full select-none\">\n        <div class=\"flex flex-col\">\n          <span class=\"text-gray-500\">${this.getTranslation('daily_rate')}</span>\n          <span class=\"font-medium\">\n            ${this.getSignupButton()}\n          </span>\n        </div>\n        <div class=\"flex flex-col\">\n          <span class=\"text-gray-500\">${this.getTranslation('revenue')}</span>\n          <span class=\"font-medium\">\n            ${this.getSignupButton()}\n          </span>\n        </div>\n        <div class=\"flex flex-col\">\n          <span class=\"text-gray-500\">${this.getTranslation('occupancy')}</span>\n          <span class=\"font-medium\">\n            ${this.getSignupButton()}\n          </span>\n        </div>\n        <div class=\"flex flex-col\">\n          <span class=\"text-gray-500\">${this.getTranslation('nights_available')}</span>\n          <span class=\"font-medium\">\n            ${this.getSignupButton()}\n          </span>\n        </div>\n      </div>\n    </div>`\n  }\n\n  // Toggle between insights and h3 layers\n  showInsightsLayer() {\n    if (this.h3LayerGroup && this.map.hasLayer(this.h3LayerGroup)) {\n      this.map.removeLayer(this.h3LayerGroup)\n    }\n    if (!this.map.hasLayer(this.insightsLayerGroup)) {\n      this.insightsLayerGroup.addTo(this.map)\n    }\n    this.activeLayerType = 'insights'\n    this.updateAdrLegend()\n\n    // Trigger marker loading if conditions are met (zoom >= 13, logged in)\n    // This ensures markers load when switching to insights tab\n    if (this.map.getZoom() >= 13 && this.isLoggedInValue && this.map.hasLayer(this.insightsLayerGroup)) {\n      // Trigger moveend event to load markers\n      this.map.fire('moveend')\n    }\n  }\n\n  showH3Layer() {\n    // Close any open popups when switching to heatmap\n    if (this.map) {\n      this.map.closePopup()\n    }\n\n    if (this.map.hasLayer(this.insightsLayerGroup)) {\n      this.map.removeLayer(this.insightsLayerGroup)\n    }\n    if (!this.h3LayerGroup && this.h3DataValue && this.h3DataValue.length > 0) {\n      this.initializeH3Layer()\n    }\n    if (this.h3LayerGroup && !this.map.hasLayer(this.h3LayerGroup)) {\n      this.h3LayerGroup.addTo(this.map)\n    }\n    this.activeLayerType = 'h3'\n    this.updateAdrLegend()\n  }\n\n  changeH3Attribute(newAttribute) {\n    if (!this.h3DataValue || this.h3DataValue.length === 0) return\n\n    // Update the attribute value\n    this.h3AttributeValue = newAttribute\n\n    // Remove existing H3 layer from map\n    if (this.h3LayerGroup && this.map.hasLayer(this.h3LayerGroup)) {\n      this.map.removeLayer(this.h3LayerGroup)\n    }\n\n    // Clear the layer group\n    if (this.h3LayerGroup) {\n      this.h3LayerGroup.clearLayers()\n      this.h3LayerGroup = null\n    }\n\n    // Re-initialize with new attribute\n    this.initializeH3Layer()\n\n    // Add the new layer to the map\n    if (this.h3LayerGroup && !this.map.hasLayer(this.h3LayerGroup)) {\n      this.h3LayerGroup.addTo(this.map)\n    }\n  }\n\n  initializeH3Layer() {\n    if (this.h3LayerGroup || !this.h3DataValue || this.h3DataValue.length === 0) return\n\n    // Use current attribute value or default\n    const attributeKey = this.h3AttributeValue || 'listing_count'\n\n    this.h3LayerGroup = L.layerGroup()\n    const map = this.map\n\n    // Function to calculate percentile\n    function percentile(arr, p) {\n      if (arr.length === 0) return 0\n      return quantile(arr, p / 100)\n    }\n\n    // Define percentiles and color palette\n    const percentiles = [10, 25, 50, 75, 85, 95].reverse()\n    const palette = [\n      '#03071e', '#370617', '#6a040f', '#9d0208', '#d00000',\n      '#dc2f02', '#e85d04', '#f48c06', '#faa307', '#ffba08'\n    ]\n\n    // Create bins based on percentiles\n    const bins = []\n    for (let i = 0; i < percentiles.length; i++) {\n      const end = percentile(this.h3DataValue.map(d => d[attributeKey] || 0), percentiles[i])\n      bins.push(end)\n    }\n\n    // Helper function to get color based on value\n    const getColor = (value) => {\n      return value > bins[0] ? palette[2] :\n             value > bins[1] ? palette[3] :\n             value > bins[2] ? palette[5] :\n             value > bins[3] ? palette[7] :\n             value > 0 ? palette[9] : 'none'\n    }\n\n    // Add hexagons\n    let lastTooltip = null\n    this.h3DataValue.forEach(cell => {\n      const boundary = cellToBoundary(cell.h3Index, false)\n      const latlngs = boundary.map(([lat, lng]) => [lat, lng])\n      const value = cell[attributeKey] || 0\n      const color = getColor(value)\n\n      if (color !== 'none') {\n        const hexagon = L.polygon(latlngs, {\n          color: 'none',\n          stroke: false,\n          fillColor: color,\n          fillOpacity: 0.4,\n          weight: 1\n        })\n\n        // Add popup with data\n        const translations = this.h3TranslationsValue || {}\n        const currencySymbol = this.h3CurrencySymbolValue || ''\n        // Map attribute key to display name for label\n        const displayKey = attributeKey === 'total_revenue' ? 'revenue' :\n                          attributeKey === 'total_net_adr' ? 'adr' :\n                          attributeKey === 'total_booking_count' ? 'booking_count' :\n                          attributeKey\n        const attributeLabel = translations[displayKey] || displayKey\n\n        // Format value based on attribute type\n        let formattedValue = ''\n        if (attributeKey === 'occupancy') {\n          formattedValue = `${value.toFixed(1)}%`\n        } else if (attributeKey === 'listing_count' || attributeKey === 'total_booking_count') {\n          formattedValue = value.toLocaleString()\n        } else {\n          formattedValue = `${currencySymbol}${value.toLocaleString()}`\n        }\n\n        hexagon.bindPopup(`\n          <div class=\"text-sm\">\n            <strong>${attributeLabel}</strong><br>\n            ${formattedValue}\n          </div>\n        `)\n\n        // Add hover effects\n        hexagon.on('mouseover', (e) => {\n          if (lastTooltip) {\n            lastTooltip.unbindTooltip()\n          }\n\n          hexagon.setStyle({\n            color: '#000',\n            weight: 1,\n            fillOpacity: 0.6\n          })\n\n          // Format value for tooltip\n          let tooltipValue = ''\n          if (attributeKey === 'occupancy') {\n            tooltipValue = `${value.toFixed(1)}%`\n          } else if (attributeKey === 'listing_count' || attributeKey === 'total_booking_count') {\n            tooltipValue = value.toLocaleString()\n          } else {\n            tooltipValue = `${currencySymbol}${value.toLocaleString()}`\n          }\n\n          // Create tooltip HTML\n          const tooltipHTML = `\n            <div class=\"custom-tooltip\">\n              <div class=\"tooltip-content\">\n                <div class=\"metric-value\">\n                  <strong>${attributeLabel}</strong><br>\n                  ${tooltipValue}\n                </div>\n              </div>\n            </div>\n          `\n\n          lastTooltip = hexagon.bindTooltip(tooltipHTML, {\n            permanent: false,\n            direction: 'top',\n            className: 'custom-tooltip-container',\n            offset: [0, -15]\n          }).openTooltip()\n        })\n\n        hexagon.on('mouseout', () => {\n          hexagon.setStyle({\n            color: 'none',\n            stroke: false,\n            weight: 2,\n            fillOpacity: 0.4\n          })\n\n          if (lastTooltip) {\n            lastTooltip.unbindTooltip()\n            lastTooltip = null\n          }\n        })\n\n        this.h3LayerGroup.addLayer(hexagon)\n      }\n    })\n  }\n\n  setupMoveEndListener() {\n    // Remove existing listener if any to prevent duplicates\n    this.removeMoveEndListener()\n\n    // Store handler reference so we can remove it when needed\n    this.moveEndHandler = async () => {\n      // Ignore moveend events that happen too soon after programmatic changes\n      const timeSinceProgrammaticChange = Date.now() - this.lastProgrammaticChange\n      if (timeSinceProgrammaticChange < 500) {\n        return // Ignore events within 500ms of programmatic change\n      }\n\n      if (this.map.getZoom() < 13 || !this.isLoggedInValue || !this.map.hasLayer(this.insightsLayerGroup)) {\n        return // Skip fetching for non-logged in users or low zoom, or if insights layer is not active\n      }\n\n      // Skip if markers URL is not set (e.g., on start page)\n      if (!this.markersUrlValue) {\n        return\n      }\n\n      const bounds = this.map.getBounds()\n      const boundsParam = `${bounds.getSouth()},${bounds.getWest()},${bounds.getNorth()},${bounds.getEast()}`\n\n      try {\n        // Merge new bounds markers into the local cache (don't replace \u2192 no flicker)\n        const markers = await this.getMarkers(boundsParam)\n        this.addApiMarkers(markers, { merge: true })\n\n        const coords = (markers || [])\n          .filter((listing) => listing.c && Array.isArray(listing.c) && listing.c.length === 2)\n          .map((listing) => listing.c)\n        if (coords.length > 0) {\n          this.loadedMarkerCoordinates = [\n            ...(this.loadedMarkerCoordinates || []),\n            ...coords\n          ]\n        }\n      } catch (e) {\n        // Ignore errors\n      }\n    }\n\n    // Attach the listener\n    this.map.on('moveend', this.moveEndHandler)\n  }\n\n  removeMoveEndListener() {\n    if (this.moveEndHandler) {\n      this.map.off('moveend', this.moveEndHandler)\n    }\n  }\n\n  applyPendingZoom() {\n    if (this.pendingZoom && this.map) {\n      // Mark programmatic change\n      this.lastProgrammaticChange = Date.now()\n      this.map.setZoom(this.pendingZoom)\n      this.pendingZoom = null\n    }\n  }\n\n  fitMapToListingPins() {\n    if (!this.map) return\n\n    const pinCoords = this.listingPinCoordinates()\n    const corePins = this.majorityPinCoordinates(pinCoords)\n    const searchCoords = this.searchCoordinates()\n    const coords = [...corePins]\n\n    // Include the searched location only when it sits near the core cluster.\n    if (searchCoords && corePins.length > 0) {\n      if (this.searchLocationNearPinCluster(searchCoords, corePins)) {\n        coords.push(searchCoords)\n      }\n    } else if (searchCoords && corePins.length === 0) {\n      coords.push(searchCoords)\n    }\n\n    if (coords.length === 0) return\n\n    this.lastProgrammaticChange = Date.now()\n    this.pendingZoom = null\n\n    if (coords.length === 1) {\n      this.map.setView(coords[0], this.zoomValue || 14, { animate: false })\n      this.updateFocusControl()\n      requestAnimationFrame(() => this.syncMarkerPillsForOverlap())\n      return\n    }\n\n    this.fitCoordinatesToMapWidth(coords)\n    this.updateFocusControl()\n    requestAnimationFrame(() => this.syncMarkerPillsForOverlap())\n  }\n\n  // Fit so the pin cluster spans most of the map width, in one non-animated jump.\n  fitCoordinatesToMapWidth(coords) {\n    const bounds = L.latLngBounds(coords)\n    const padding = L.point(28, 28)\n    let zoom = this.map.getBoundsZoom(bounds, false, padding)\n    if (!Number.isFinite(zoom)) zoom = this.zoomValue || 14\n\n    const mapSize = this.map.getSize()\n    if (mapSize?.x >= 80) {\n      const topLeft = this.map.project(bounds.getNorthWest(), zoom)\n      const bottomRight = this.map.project(bounds.getSouthEast(), zoom)\n      const pinWidth = Math.max(Math.abs(bottomRight.x - topLeft.x), 1)\n      const targetWidth = mapSize.x * 0.82\n\n      if (pinWidth < targetWidth) {\n        zoom += Math.log2(targetWidth / pinWidth)\n      }\n    }\n\n    this.map.setView(bounds.getCenter(), Math.min(zoom, 19), { animate: false })\n  }\n\n  listingPinCoordinates() {\n    const pinCoords = []\n    if (this.listingDataValue?.length) {\n      this.listingDataValue.forEach((listing) => {\n        if (listing.c?.length === 2) pinCoords.push(listing.c)\n      })\n    } else if (this.loadedMarkerCoordinates?.length) {\n      return [...this.loadedMarkerCoordinates]\n    }\n    return pinCoords\n  }\n\n  // Keep the densest majority of pins so distant outliers don't force a far zoom.\n  majorityPinCoordinates(pinCoords) {\n    if (pinCoords.length <= 3) return [...pinCoords]\n\n    const center = this.medianLatLng(pinCoords)\n    const ranked = pinCoords\n      .map((coord) => ({ coord, distance: center.distanceTo(coord) }))\n      .sort((a, b) => a.distance - b.distance)\n\n    const p75Index = Math.max(2, Math.ceil(ranked.length * 0.75) - 1)\n    const softMax = Math.max(ranked[p75Index].distance * 1.5, 300)\n\n    return ranked\n      .filter((entry) => entry.distance <= softMax)\n      .map((entry) => entry.coord)\n  }\n\n  medianLatLng(pinCoords) {\n    const lats = pinCoords.map((coord) => coord[0]).sort((a, b) => a - b)\n    const lngs = pinCoords.map((coord) => coord[1]).sort((a, b) => a - b)\n    const mid = Math.floor(pinCoords.length / 2)\n\n    if (pinCoords.length % 2 === 0) {\n      return L.latLng(\n        (lats[mid - 1] + lats[mid]) / 2,\n        (lngs[mid - 1] + lngs[mid]) / 2\n      )\n    }\n\n    return L.latLng(lats[mid], lngs[mid])\n  }\n\n  searchCoordinates() {\n    if (this.hasListingCoordinatesValue && this.listingCoordinatesValue?.length === 2) {\n      return this.listingCoordinatesValue\n    }\n    return null\n  }\n\n  // True when search point is within ~1.5x the cluster radius (min 400m slack).\n  searchLocationNearPinCluster(searchCoords, pinCoords) {\n    if (pinCoords.length === 0) return false\n\n    const center = this.medianLatLng(pinCoords)\n    const search = L.latLng(searchCoords)\n\n    let maxPinDistanceM = 0\n    pinCoords.forEach((coord) => {\n      maxPinDistanceM = Math.max(maxPinDistanceM, center.distanceTo(coord))\n    })\n\n    const thresholdM = Math.max(maxPinDistanceM * 1.5, 400)\n    return search.distanceTo(center) <= thresholdM\n  }\n\n  ensureFocusControl() {\n    if (!this.map || this.focusControl) return\n\n    const FocusControl = L.Control.extend({\n      onAdd: () => {\n        const button = L.DomUtil.create('button', 'map-focus-control')\n        button.type = 'button'\n        L.DomEvent.disableClickPropagation(button)\n        L.DomEvent.on(button, 'click', (event) => {\n          L.DomEvent.preventDefault(event)\n          this.handleFocusControlClick()\n        })\n        this.focusControlButton = button\n        return button\n      }\n    })\n\n    this.focusControl = new FocusControl({ position: 'bottomleft' })\n    this.focusControl.addTo(this.map)\n  }\n\n  updateFocusControl() {\n    if (!this.fitListingPinsValue || !this.map) return\n\n    const searchCoords = this.searchCoordinates()\n    if (!searchCoords) {\n      this.hideFocusControl()\n      return\n    }\n\n    const bounds = this.map.getBounds()\n    const searchInView = bounds.contains(L.latLng(searchCoords))\n    const pinCoords = this.listingPinCoordinates()\n    const anyPinInView = pinCoords.some((coord) => bounds.contains(L.latLng(coord)))\n\n    if (!searchInView) {\n      this.showFocusControl('property')\n    } else if (pinCoords.length > 0 && !anyPinInView) {\n      this.showFocusControl('comps')\n    } else {\n      this.hideFocusControl()\n    }\n  }\n\n  showFocusControl(mode) {\n    this.ensureFocusControl()\n    if (!this.focusControlButton) return\n\n    this.focusControlMode = mode\n    const label = mode === 'property' ? this.getTranslation('show_property') : this.getTranslation('show_comps')\n    if (mode === 'property') {\n      this.focusControlButton.innerHTML =\n        `<span class=\"iconify mdi--map-marker map-focus-control__icon\" aria-hidden=\"true\"></span><span>${label}</span>`\n    } else {\n      this.focusControlButton.textContent = label\n    }\n    this.focusControlButton.hidden = false\n    this.focusControlButton.classList.remove('is-hidden')\n  }\n\n  hideFocusControl() {\n    this.focusControlMode = null\n    if (!this.focusControlButton) return\n\n    this.focusControlButton.hidden = true\n    this.focusControlButton.classList.add('is-hidden')\n  }\n\n  handleFocusControlClick() {\n    if (!this.map) return\n\n    this.lastProgrammaticChange = Date.now()\n\n    if (this.focusControlMode === 'property') {\n      const searchCoords = this.searchCoordinates()\n      if (!searchCoords) return\n      this.map.setView(searchCoords, Math.max(this.map.getZoom(), 15), { animate: false })\n      return\n    }\n\n    if (this.focusControlMode === 'comps') {\n      this.fitMapToListingPins()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"bedrooms\", \"capacity\", \"addressStatus\", \"addressError\", \"bedroomsError\", \"capacityError\", \"submitButton\", \"submitIcon\", \"submitSpinner\"]\n  static values = {\n    resultsUrl: String,\n    addressRequiredMessage: String,\n    bedroomsRequiredMessage: String,\n    capacityRequiredMessage: String,\n    initialLat: Number,\n    initialLng: Number,\n    initialAddress: String,\n    initialCountry: String\n  }\n\n  connect() {\n    this.pendingLocation = null\n    this.onPlacesSelect = (event) => this.storeAddress(event)\n    this.element.addEventListener(\"google-places:select\", this.onPlacesSelect)\n    this.restoreInitialLocation()\n  }\n\n  restoreInitialLocation() {\n    if (!this.hasInitialLatValue || !this.hasInitialLngValue) return\n\n    const lat = this.initialLatValue\n    const lng = this.initialLngValue\n    if (!Number.isFinite(lat) || !Number.isFinite(lng)) return\n\n    const label = this.hasInitialAddressValue ? this.initialAddressValue : \"\"\n    const country = this.hasInitialCountryValue ? this.initialCountryValue : null\n    this.pendingLocation = { lat, lng, label, country }\n    this.clearAddressError()\n\n    if (label && this.hasAddressStatusTarget) {\n      this.addressStatusTarget.textContent = label\n      this.addressStatusTarget.classList.remove(\"hidden\")\n    }\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"google-places:select\", this.onPlacesSelect)\n  }\n\n  /** @param {CustomEvent} event */\n  storeAddress(event) {\n    const { lat, lng, label, country } = event.detail || {}\n    if (typeof lat !== \"number\" || typeof lng !== \"number\") return\n\n    this.pendingLocation = { lat, lng, label, country: country || null }\n    this.clearAddressError()\n\n    if (this.hasAddressStatusTarget && label) {\n      this.addressStatusTarget.textContent = label\n      this.addressStatusTarget.classList.remove(\"hidden\")\n    }\n  }\n\n  submit(event) {\n    event.preventDefault()\n\n    this.clearBedroomsError()\n    this.clearCapacityError()\n\n    if (!this.pendingLocation) {\n      this.showAddressError()\n      return\n    }\n\n    if (!this.hasRequiredFilterValue(this.bedroomsTarget)) {\n      this.showBedroomsError()\n      return\n    }\n\n    if (!this.hasRequiredFilterValue(this.capacityTarget)) {\n      this.showCapacityError()\n      return\n    }\n\n    const params = new URLSearchParams({\n      lat: String(this.pendingLocation.lat),\n      lng: String(this.pendingLocation.lng)\n    })\n\n    if (this.pendingLocation.label) {\n      params.set(\"address\", this.pendingLocation.label)\n    }\n\n    params.set(\"bedrooms\", this.bedroomsTarget.value)\n    params.set(\"capacity\", this.capacityTarget.value)\n    // Hint only \u2014 server resolves UK nations etc. from lat/lng polygons.\n    if (this.pendingLocation.country) {\n      params.set(\"country\", this.pendingLocation.country)\n    }\n\n    this.setLoading()\n    window.location.assign(`${this.resultsUrlValue}?${params.toString()}`)\n  }\n\n  hasRequiredFilterValue(select) {\n    const value = select?.value\n    return value != null && value !== \"\" && value !== \"all\"\n  }\n\n  setLoading() {\n    if (!this.hasSubmitButtonTarget) return\n\n    this.submitButtonTarget.disabled = true\n    this.submitButtonTarget.setAttribute(\"aria-busy\", \"true\")\n    this.submitButtonTarget.classList.add(\"opacity-90\", \"cursor-not-allowed\")\n    this.submitButtonTarget.classList.remove(\"hover:bg-[#166348]\", \"hover:shadow-xl\")\n\n    if (this.hasSubmitIconTarget) this.submitIconTarget.classList.add(\"hidden\")\n    if (this.hasSubmitSpinnerTarget) this.submitSpinnerTarget.classList.remove(\"hidden\")\n  }\n\n  showAddressError() {\n    if (!this.hasAddressErrorTarget) return\n    this.addressErrorTarget.textContent = this.addressRequiredMessageValue\n    this.addressErrorTarget.classList.remove(\"hidden\")\n  }\n\n  clearAddressError() {\n    if (!this.hasAddressErrorTarget) return\n    this.addressErrorTarget.textContent = \"\"\n    this.addressErrorTarget.classList.add(\"hidden\")\n  }\n\n  showBedroomsError() {\n    if (!this.hasBedroomsErrorTarget) return\n    this.bedroomsErrorTarget.textContent = this.bedroomsRequiredMessageValue\n    this.bedroomsErrorTarget.classList.remove(\"hidden\")\n  }\n\n  clearBedroomsError() {\n    if (!this.hasBedroomsErrorTarget) return\n    this.bedroomsErrorTarget.textContent = \"\"\n    this.bedroomsErrorTarget.classList.add(\"hidden\")\n  }\n\n  showCapacityError() {\n    if (!this.hasCapacityErrorTarget) return\n    this.capacityErrorTarget.textContent = this.capacityRequiredMessageValue\n    this.capacityErrorTarget.classList.remove(\"hidden\")\n  }\n\n  clearCapacityError() {\n    if (!this.hasCapacityErrorTarget) return\n    this.capacityErrorTarget.textContent = \"\"\n    this.capacityErrorTarget.classList.add(\"hidden\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    eventProperties: String,\n    trackDismiss: { type: Boolean, default: true }\n  }\n\n  connect() {\n    this.trackPageView()\n\n    if (this.trackDismissValue) {\n      this.onKeyDown = this.handleKeyDown.bind(this)\n      this.onModalClick = this.handleModalClick.bind(this)\n      this.onCloseClick = this.handleCloseClick.bind(this)\n\n      document.addEventListener(\"keydown\", this.onKeyDown, true)\n      this.modalElement = document.getElementById(\"hs-modal-signup\")\n      this.modalElement?.addEventListener(\"click\", this.onModalClick, true)\n      this.closeButton = this.modalElement?.querySelector('[data-hs-overlay=\"#hs-modal-signup\"]')\n      this.closeButton?.addEventListener(\"click\", this.onCloseClick)\n    }\n  }\n\n  disconnect() {\n    document.removeEventListener(\"keydown\", this.onKeyDown, true)\n    this.modalElement?.removeEventListener(\"click\", this.onModalClick, true)\n    this.closeButton?.removeEventListener(\"click\", this.onCloseClick)\n  }\n\n  trackPageView() {\n    const properties = this.eventPropertiesValue ? JSON.parse(this.eventPropertiesValue) : {}\n    this.trackEvent(\"Calculator Results Preview Viewed\", properties)\n  }\n\n  handleKeyDown(event) {\n    if (event.key !== \"Escape\") return\n    this.trackDismissAttempt(\"escape_key\")\n  }\n\n  handleModalClick(event) {\n    if (event.target !== this.modalElement) return\n    this.trackDismissAttempt(\"backdrop_click\")\n  }\n\n  handleCloseClick() {\n    this.trackDismissAttempt(\"close_button\")\n  }\n\n  trackDismissAttempt(dismissMethod) {\n    if (!this.isModalOpen()) return\n\n    this.trackEvent(\"Signup Modal Dismiss Attempted\", {\n      dismiss_method: dismissMethod,\n      source: sessionStorage.getItem(\"signup_modal_source\"),\n      page_type: \"calculator_results_preview\"\n    })\n  }\n\n  isModalOpen() {\n    if (!this.modalElement) return false\n\n    return this.modalElement.classList.contains(\"open\") ||\n      this.modalElement.classList.contains(\"hs-overlay-open\")\n  }\n\n  trackEvent(name, properties = {}) {\n    this.dispatch(\"trackEvent\", {\n      prefix: null,\n      detail: { name, properties }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { loadGoogleMaps, resolvedGoogleMapsApiKey } from \"../lib/google_maps\"\n\nexport default class extends Controller {\n  static targets = [\"newSearchModal\", \"newSearchBackdrop\", \"newSearchToggle\"]\n\n  connect() {\n    this.modalOpen = false\n    this.prefetchGoogleMaps()\n  }\n\n  prefetchGoogleMaps() {\n    const apiKey = resolvedGoogleMapsApiKey()\n    if (!apiKey) return\n\n    const lang = (document.documentElement.lang || \"en\").split(\"-\")[0] || \"en\"\n    loadGoogleMaps(apiKey, lang).catch(() => {})\n  }\n\n  openNewSearch(event) {\n    event.preventDefault()\n    if (!this.hasNewSearchModalTarget) return\n\n    this.newSearchModalTarget.classList.remove(\"hidden\")\n    this.newSearchModalTarget.classList.add(\"flex\")\n    document.body.style.overflow = \"hidden\"\n    this.modalOpen = true\n\n    if (this.hasNewSearchToggleTarget) {\n      this.newSearchToggleTarget.setAttribute(\"aria-expanded\", \"true\")\n    }\n\n    requestAnimationFrame(() => {\n      const widget = this.newSearchModalTarget.querySelector(\"gmp-place-autocomplete\")\n      widget?.focus?.()\n    })\n  }\n\n  closeNewSearch(event) {\n    if (event) event.preventDefault()\n    if (!this.hasNewSearchModalTarget || !this.modalOpen) return\n\n    this.newSearchModalTarget.classList.add(\"hidden\")\n    this.newSearchModalTarget.classList.remove(\"flex\")\n    document.body.style.overflow = \"\"\n    this.modalOpen = false\n\n    if (this.hasNewSearchToggleTarget) {\n      this.newSearchToggleTarget.setAttribute(\"aria-expanded\", \"false\")\n    }\n  }\n\n  stopPropagation(event) {\n    event.stopPropagation()\n  }\n\n  keydown(event) {\n    if (event.key === \"Escape\" && this.modalOpen) {\n      this.closeNewSearch()\n    }\n  }\n\n  disconnect() {\n    if (this.modalOpen) {\n      document.body.style.overflow = \"\"\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    eventName: String,\n    eventProperties: String\n  }\n\n  connect() {\n    // Dispatch event to amplitude controller\n    const properties = this.eventPropertiesValue ? JSON.parse(this.eventPropertiesValue) : {}\n\n    const event = new CustomEvent('trackEvent', {\n      detail: {\n        name: this.eventNameValue,\n        properties: properties\n      },\n      bubbles: true\n    })\n\n    this.element.dispatchEvent(event)\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  intercept(event) {\n    const link = event.target.closest('a')\n    if (!link) return\n\n    const startUrl = link.dataset.startUrl\n    if (startUrl) {\n      event.preventDefault()\n      if (link.dataset.sameTab === 'true') {\n        window.location.href = startUrl\n      } else {\n        window.open(startUrl)\n      }\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    labels: Array,\n    listingData: { type: Array, default: [] },\n    compData: Array,\n    barColor: { type: String, default: \"#546463\" },\n    lineColors: Array,\n    maxValue: Number,\n    percentageScale: Boolean,\n    listingLabel: { type: String, default: \"\" },\n    top50Label: { type: String, default: \"\" },\n    top25Label: { type: String, default: \"\" },\n    top10Label: { type: String, default: \"\" },\n    showBars: { type: Boolean, default: true }\n  }\n\n  connect() {\n    Chart.defaults.color = 'rgb(120, 113, 108)'\n\n    this.initChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  initChart() {\n    const ctx = this.element.getContext('2d')\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: this.labelsValue,\n        datasets: this.buildDatasets()\n      },\n      options: this.getChartOptions(),\n      plugins: [this.legendMargin()]\n    })\n  }\n\n  buildDatasets() {\n    const lineLabel = (fallback, value) => {\n      if (typeof value === \"string\" && value.trim()) return value.trim()\n      return fallback\n    }\n\n    const lines = [\n      {\n        type: 'line',\n        fill: true,\n        label: lineLabel('Top 50%', this.top50LabelValue),\n        data: this.getPercentileData(0),\n        backgroundColor: this.lineColorsValue[0],\n        borderDash: [5, 5],\n        tension: 0.5,\n        borderWidth: 0\n      },\n      {\n        type: 'line',\n        fill: true,\n        label: lineLabel('Top 25%', this.top25LabelValue),\n        data: this.getPercentileData(1),\n        backgroundColor: this.lineColorsValue[1],\n        tension: 0.5,\n        borderWidth: 0\n      },\n      {\n        type: 'line',\n        fill: true,\n        label: lineLabel('Top 10%', this.top10LabelValue),\n        data: this.getPercentileData(2),\n        backgroundColor: this.lineColorsValue[2],\n        tension: 0.5,\n        borderWidth: 0\n      }\n    ]\n\n    if (!this.showBarsValue) {\n      return lines\n    }\n\n    return [\n      {\n        type: 'bar',\n        label: this.listingLabelValue,\n        data: this.listingDataValue,\n        backgroundColor: this.barColorValue,\n        barPercentage: 0.3,\n        borderRadius: 3,\n        borderWidth: 0\n      },\n      ...lines\n    ]\n  }\n\n  getPercentileData(index) {\n    const data = this.compDataValue.map(item => item[index])\n\n    // For percentage scale, multiply by 100\n    if (this.hasPercentageScaleValue && this.percentageScaleValue) {\n      return data.map(value => value * 100)\n    }\n\n    return data\n  }\n\n  getChartOptions() {\n    const baseOptions = {\n      maintainAspectRatio: false,\n      interaction: {\n        mode: 'index',\n      },\n      plugins: {\n        legend: {\n          align: 'start',\n          labels: {\n            usePointStyle: true,\n            padding: 8,\n            font: {\n              size: 10\n            }\n          }\n        }\n      },\n      scales: {\n        x: {\n          grid: {\n            display: false\n          }\n        },\n        y: {\n          beginAtZero: true,\n          grid: {\n            drawOnChartArea: true\n          }\n        }\n      }\n    }\n\n    // Add max value if specified\n    if (this.hasMaxValueValue && this.maxValueValue > 0) {\n      baseOptions.scales.y.max = this.maxValueValue\n    }\n\n    // Add percentage scale options if needed\n    if (this.hasPercentageScaleValue && this.percentageScaleValue) {\n      baseOptions.scales.y.ticks = {\n        callback: function (value, index, values) {\n          if (value <= 100) {\n            return value\n          } else {\n            return ''\n          }\n        }\n      }\n    }\n\n    return baseOptions\n  }\n\n  legendMargin() {\n    return {\n      id: 'legendMargin',\n      beforeInit(chart, legend, options) {\n        const fitValue = chart.legend.fit\n        chart.legend.fit = function fit() {\n          fitValue.bind(chart.legend)()\n          return this.height += 24\n        }\n      }\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"mapContainer\", \"overlay\", \"openTrigger\", \"closeTrigger\"]\n\n  connect() {\n    this.expanded = false\n    this.boundEscape = (e) => {\n      if (e.key === \"Escape\" && this.expanded) this.toggle()\n    }\n    document.addEventListener(\"keydown\", this.boundEscape)\n  }\n\n  backdropDismiss(event) {\n    if (!this.expanded || !this.hasOverlayTarget) return\n    if (event.target !== this.overlayTarget) return\n    this.toggle()\n  }\n\n  toggle() {\n    this.expanded = !this.expanded\n    const leafletContainer = this.mapContainerTarget.querySelector(\".leaflet-container\")\n\n    if (this.expanded) {\n      this.mapContainerTarget.classList.add(\"map-expanded-panel\")\n      this.mapContainerTarget.classList.remove(\"col-span-2\", \"min-h-96\", \"h-96\", \"flex-1\")\n\n      leafletContainer?.classList.add(\"rounded-lg\")\n\n      if (this.hasOverlayTarget) this.overlayTarget.classList.remove(\"hidden\")\n      if (this.hasOpenTriggerTarget) this.openTriggerTarget.classList.add(\"hidden\")\n      if (this.hasCloseTriggerTarget) this.closeTriggerTarget.classList.remove(\"hidden\")\n\n      document.body.style.overflow = \"hidden\"\n    } else {\n      this.mapContainerTarget.classList.remove(\"map-expanded-panel\")\n      this.mapContainerTarget.classList.add(\"col-span-2\", \"min-h-96\")\n      if (this.mapContainerTarget.classList.contains(\"flex-1\") || this.element.classList.contains(\"flex-1\")) {\n        this.mapContainerTarget.classList.add(\"flex-1\")\n      } else {\n        this.mapContainerTarget.classList.add(\"h-96\")\n      }\n\n      leafletContainer?.classList.remove(\"rounded-lg\")\n\n      if (this.hasOverlayTarget) this.overlayTarget.classList.add(\"hidden\")\n      if (this.hasOpenTriggerTarget) this.openTriggerTarget.classList.remove(\"hidden\")\n      if (this.hasCloseTriggerTarget) this.closeTriggerTarget.classList.add(\"hidden\")\n\n      document.body.style.overflow = \"\"\n    }\n\n    this.dispatch(this.expanded ? \"expand\" : \"collapse\")\n\n    setTimeout(() => {\n      window.dispatchEvent(new Event(\"resize\"))\n    }, 200)\n  }\n\n  disconnect() {\n    document.removeEventListener(\"keydown\", this.boundEscape)\n    document.body.style.overflow = \"\"\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"modalMapContainer\", \"loadingIndicator\"]\n\n  connect() {\n    this.boundHandleOpen = this.handleOpen.bind(this)\n    this.boundHandleClose = this.handleClose.bind(this)\n    this.boundHandleFrameLoad = this.handleFrameLoad.bind(this)\n\n    // Try to find the map container initially (may not exist if overview hasn't loaded)\n    this.findMapContainer()\n\n    // Listen for turbo-frame loads to update map container reference\n    document.addEventListener('turbo:frame-load', this.boundHandleFrameLoad)\n\n    // Listen for Turbo Stream updates to refresh map container reference if DOM changed\n    this.boundHandleStreamRender = this.handleStreamRender.bind(this)\n    document.addEventListener('turbo:after-stream-render', this.boundHandleStreamRender)\n\n    // Wait for Preline to be ready (scripts load asynchronously)\n    this.waitForPreline(() => {\n      const result = HSOverlay.getInstance(this.element, true)\n      // const { element } = HSOverlay.getInstance(this.element, true)\n      const element = result.element\n      this.overlayElement = element\n      element.on('open', this.boundHandleOpen)\n      element.on('close', this.boundHandleClose)\n    })\n  }\n\n  disconnect() {\n    document.removeEventListener('turbo:frame-load', this.boundHandleFrameLoad)\n    document.removeEventListener('turbo:after-stream-render', this.boundHandleStreamRender)\n  }\n\n  findMapContainer() {\n    // Find the overview map container (the one we'll move)\n    this.overviewMapContainer = document.querySelector('#map-overview-container')\n\n    // Store original position if map container exists\n    if (this.overviewMapContainer) {\n      this.storeOriginalPosition()\n    }\n\n    return this.overviewMapContainer\n  }\n\n  handleFrameLoad(event) {\n    // If the market-overview frame loaded, try to find the map container\n    if (event.target && event.target.id === 'market-overview') {\n      // Wait a bit for the map to be rendered inside the frame\n      setTimeout(() => {\n        if (!this.overviewMapContainer || !this.overviewMapContainer.isConnected) {\n          this.findMapContainer()\n        }\n      }, 100)\n    }\n  }\n\n  handleStreamRender(event) {\n    // If Turbo Streams updated the DOM, check if our map container reference is still valid\n    if (this.overviewMapContainer && !this.overviewMapContainer.isConnected) {\n      // Map container was replaced by Turbo Streams, re-find it\n      this.findMapContainer()\n    }\n  }\n\n  storeOriginalPosition() {\n    if (!this.overviewMapContainer) return\n\n    // Verify the container is still connected to the DOM\n    if (!this.overviewMapContainer.isConnected || !this.overviewMapContainer.parentNode) {\n      // Map container was removed from DOM (e.g., by Turbo Streams), re-find it\n      this.findMapContainer()\n      if (!this.overviewMapContainer) return\n    }\n\n    this.originalParent = this.overviewMapContainer.parentNode\n    this.originalNextSibling = this.overviewMapContainer.nextSibling\n\n    // Also find the heading that comes before the map (for reliable restoration)\n    const parent = this.originalParent\n    if (parent) {\n      const mapIndex = Array.from(parent.children).indexOf(this.overviewMapContainer)\n      this.originalHeading = mapIndex > 0 ? parent.children[mapIndex - 1] : null\n    } else {\n      this.originalHeading = null\n    }\n\n    // Store the overview frame reference for later use\n    const overviewFrame = document.getElementById('market-overview')\n    if (overviewFrame && overviewFrame.contains(this.overviewMapContainer)) {\n      this.originalFrame = overviewFrame\n    } else {\n      this.originalFrame = null\n    }\n  }\n\n  waitForPreline(callback) {\n    const checkReady = () => {\n      if (typeof HSOverlay !== 'undefined' && window.$hsOverlayCollection) {\n        // Check if this element is in the overlay collection\n        const instance = HSOverlay.getInstance(this.element, true)\n        if (instance && instance.element) {\n          return true\n        }\n      }\n      return false\n    }\n\n    if (checkReady()) {\n      callback()\n    } else {\n      // Check every 50ms, up to 2 seconds\n      let attempts = 0\n      const checkInterval = setInterval(() => {\n        attempts++\n        if (checkReady()) {\n          clearInterval(checkInterval)\n          callback()\n        } else if (attempts >= 40) {\n          clearInterval(checkInterval)\n          console.warn('Preline overlay not initialized for element after waiting')\n        }\n      }, 50)\n    }\n  }\n\n  handleOpen() {\n    // Try to find the map container if we don't have it yet\n    if (!this.overviewMapContainer) {\n      this.findMapContainer()\n    }\n\n    // Verify the container is still connected to the DOM (might have been replaced by Turbo Streams)\n    if (this.overviewMapContainer && !this.overviewMapContainer.isConnected) {\n      // Map container reference is stale, re-find it\n      this.findMapContainer()\n    }\n\n    // If still not found, show loading indicator and ensure overview section loads first\n    if (!this.overviewMapContainer) {\n      this.showLoading()\n      const overviewFrame = document.getElementById('market-overview')\n\n      if (overviewFrame) {\n        // Check if frame has src but hasn't loaded yet (lazy-loaded)\n        if (overviewFrame.hasAttribute('src') && !overviewFrame.hasAttribute('complete')) {\n          // Overview frame exists but hasn't loaded, trigger it to load\n          // Remove lazy loading and force eager load\n          overviewFrame.removeAttribute('loading')\n          overviewFrame.setAttribute('loading', 'eager')\n\n          // Also listen for the frame load event\n          const onFrameLoad = () => {\n            // Wait a bit for the map to render inside the frame\n            setTimeout(() => {\n              this.findMapContainer()\n              if (this.overviewMapContainer) {\n                this.proceedWithOpen()\n              } else {\n                // Still not found, keep loading indicator\n                this.showLoading()\n              }\n            }, 150)\n            overviewFrame.removeEventListener('turbo:frame-load', onFrameLoad)\n          }\n          overviewFrame.addEventListener('turbo:frame-load', onFrameLoad)\n\n          // Trigger the frame to load\n          overviewFrame.reload()\n        } else if (!overviewFrame.hasAttribute('src')) {\n          // Frame exists but has no src - might be server-rendered but map not found\n          // This shouldn't happen, but handle it anyway\n          console.warn('[MapModal] Overview frame exists but has no src attribute')\n        }\n      }\n\n      // Wait for map container with retries (fallback if frame load event doesn't fire)\n      let attempts = 0\n      const maxAttempts = 30 // 3 seconds max wait\n      const waitForMap = () => {\n        attempts++\n        this.findMapContainer()\n        if (this.overviewMapContainer) {\n          // Found it, continue with opening\n          this.proceedWithOpen()\n        } else if (attempts < maxAttempts) {\n          setTimeout(waitForMap, 100)\n        } else {\n          console.warn('[MapModal] Map container not found after waiting, cannot open modal')\n          this.hideLoading()\n        }\n      }\n      waitForMap()\n      return // Exit early, will proceed when map is found\n    }\n\n    this.proceedWithOpen()\n  }\n\n  showLoading() {\n    if (this.hasLoadingIndicatorTarget) {\n      this.loadingIndicatorTarget.classList.remove('hidden')\n    }\n  }\n\n  hideLoading() {\n    if (this.hasLoadingIndicatorTarget) {\n      this.loadingIndicatorTarget.classList.add('hidden')\n    }\n  }\n\n  proceedWithOpen() {\n    if (!this.overviewMapContainer) return\n\n    // Verify the container is still connected to the DOM\n    if (!this.overviewMapContainer.isConnected || !this.overviewMapContainer.parentNode) {\n      // Map container was removed from DOM, re-find it\n      this.findMapContainer()\n      if (!this.overviewMapContainer) {\n        console.warn('[MapModal] Map container not found, cannot open modal')\n        this.hideLoading()\n        return\n      }\n    }\n\n    // Clean up any existing placeholder first (in case of previous incomplete close)\n    this.cleanupPlaceholder()\n\n    // Re-store position in case DOM changed\n    this.storeOriginalPosition()\n    this.hadFixedHeight = this.overviewMapContainer.classList.contains('h-[600px]')\n    this.hadFullHeight = this.overviewMapContainer.classList.contains('h-full')\n\n    // Get computed dimensions before moving\n    const rect = this.overviewMapContainer.getBoundingClientRect()\n    const computedStyle = window.getComputedStyle(this.overviewMapContainer)\n\n    // Store original dimensions\n    this.originalWidth = rect.width\n    this.originalHeight = rect.height\n    this.originalMarginBottom = computedStyle.marginBottom\n    this.originalMarginTop = computedStyle.marginTop\n\n    // Create placeholder to preserve space (also used as restore anchor on close)\n    this.placeholder = document.createElement('div')\n    this.placeholder.id = 'map-overview-placeholder'\n    this.placeholder.style.width = `${this.originalWidth}px`\n    this.placeholder.style.height = `${this.originalHeight}px`\n    this.placeholder.style.marginTop = this.originalMarginTop\n    this.placeholder.style.marginBottom = this.originalMarginBottom\n    this.placeholder.style.visibility = 'hidden'\n    this.placeholder.style.pointerEvents = 'none'\n\n    // Insert placeholder where map container was\n    if (this.originalNextSibling && this.originalNextSibling.parentNode === this.originalParent) {\n      this.originalParent.insertBefore(this.placeholder, this.originalNextSibling)\n    } else if (this.originalHeading && this.originalHeading.parentNode === this.originalParent) {\n      if (this.originalHeading.nextSibling) {\n        this.originalParent.insertBefore(this.placeholder, this.originalHeading.nextSibling)\n      } else {\n        this.originalParent.appendChild(this.placeholder)\n      }\n    } else {\n      this.originalParent.appendChild(this.placeholder)\n    }\n\n    // Modal needs a fill-height map; story stage already uses h-full\n    this.overviewMapContainer.classList.remove('h-[600px]')\n    this.overviewMapContainer.classList.add('h-full')\n\n    // Move map container to modal\n    const modalMapContainer = this.modalMapContainerTarget\n\n    // Clean up any existing content in modal container (shouldn't happen, but just in case)\n    const existingPlaceholder = modalMapContainer.querySelector('#map-overview-placeholder')\n    if (existingPlaceholder) {\n      existingPlaceholder.remove()\n    }\n\n    modalMapContainer.appendChild(this.overviewMapContainer)\n\n    // Hide loading indicator now that map is loaded\n    this.hideLoading()\n\n    // Dispatch event for map to resize\n    setTimeout(() => {\n      const mapElement = this.overviewMapContainer.querySelector('#map-overview')\n      if (mapElement) {\n        mapElement.dispatchEvent(new CustomEvent('map:invalidate-size'))\n      }\n      this.dispatch('modalOpened', { detail: { modal: this.element } })\n    }, 100)\n  }\n\n  cleanupPlaceholder() {\n    // Remove placeholder if it exists anywhere in the DOM\n    if (this.placeholder && this.placeholder.parentNode) {\n      this.placeholder.parentNode.removeChild(this.placeholder)\n      this.placeholder = null\n    }\n\n    // Also check for any orphaned placeholders by ID\n    const orphanedPlaceholder = document.getElementById('map-overview-placeholder')\n    if (orphanedPlaceholder) {\n      orphanedPlaceholder.remove()\n    }\n  }\n\n  handleClose() {\n    if (!this.overviewMapContainer) return\n\n    // Restore into the placeholder slot first (keeps story stage wrapper + sizing)\n    const placeholder =\n      (this.placeholder && this.placeholder.parentNode && this.placeholder) ||\n      document.getElementById('map-overview-placeholder')\n\n    if (placeholder && placeholder.parentNode) {\n      placeholder.parentNode.insertBefore(this.overviewMapContainer, placeholder)\n      this.originalParent = placeholder.parentNode\n      placeholder.remove()\n      this.placeholder = null\n    } else {\n      this.cleanupPlaceholder()\n\n      let targetParent = this.originalParent\n      if (!targetParent || !targetParent.isConnected) {\n        const stage = document.getElementById('map-overview-stage')\n        const overviewFrame = document.getElementById('market-overview')\n        targetParent = stage || overviewFrame || document.body\n      }\n\n      if (this.originalNextSibling && this.originalNextSibling.parentNode === targetParent) {\n        targetParent.insertBefore(this.overviewMapContainer, this.originalNextSibling)\n      } else {\n        targetParent.appendChild(this.overviewMapContainer)\n      }\n      this.originalParent = targetParent\n    }\n\n    // Restore the height class the map had before opening (stage = h-full, legacy = h-[600px])\n    this.overviewMapContainer.classList.remove('h-full', 'h-[600px]')\n    if (this.hadFixedHeight) {\n      this.overviewMapContainer.classList.add('h-[600px]')\n    } else {\n      this.overviewMapContainer.classList.add('h-full')\n    }\n\n    // Ensure container is visible\n    this.overviewMapContainer.style.display = ''\n    this.overviewMapContainer.style.visibility = ''\n\n    // Dispatch event for map to resize\n    setTimeout(() => {\n      const mapElement = this.overviewMapContainer.querySelector('#map-overview')\n      if (mapElement) {\n        mapElement.dispatchEvent(new CustomEvent('map:invalidate-size'))\n      }\n\n      window.dispatchEvent(new Event('resize'))\n      if (mapElement) {\n        mapElement.dispatchEvent(new CustomEvent('map:invalidate-size'))\n      }\n    }, 150)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"map\", \"insightsTab\", \"h3Tab\", \"attributeSelect\", \"toggleButtons\"]\n  static values = {\n    isSubscribed: Boolean\n  }\n\n  connect() {\n    // Read preference from localStorage or default to 'insights'\n    const savedType = localStorage.getItem('mapModalType') || 'insights'\n    this.activeType = null\n\n    // Get the map controller (with retry in case it's not ready yet)\n    this.getMapController()\n\n    // Set initial active tab\n    setTimeout(() => {\n      this.switchToMapType(savedType, false)\n    }, 100)\n  }\n\n  getMapController() {\n    this.mapController = this.application.getControllerForElementAndIdentifier(\n      this.mapTarget,\n      'insights-map'\n    )\n    if (!this.mapController) {\n      // Retry after a short delay\n      setTimeout(() => {\n        this.getMapController()\n      }, 50)\n    }\n  }\n\n  switchToInsights() {\n    this.switchToMapType('insights', true)\n  }\n\n  switchToH3() {\n    this.switchToMapType('h3', true)\n  }\n\n  switchToMapType(type, savePreference = true) {\n    if (this.activeType === type || !this.mapController) return\n\n    // Update active type\n    this.activeType = type\n\n    // Save preference\n    if (savePreference) {\n      localStorage.setItem('mapModalType', type)\n    }\n\n    // Toggle layers\n    if (type === 'insights') {\n      this.mapController.showInsightsLayer()\n      this.insightsTabTarget.classList.add('active')\n      this.insightsTabTarget.classList.remove('text-gray-700')\n      this.insightsTabTarget.style.backgroundColor = '#E4F0EA'\n      this.insightsTabTarget.style.color = '#1F6F54'\n      if (this.hasH3TabTarget) {\n        this.h3TabTarget.classList.remove('active', 'bg-blue-50', 'text-blue-600')\n        this.h3TabTarget.classList.add('text-gray-700')\n        this.h3TabTarget.style.backgroundColor = ''\n        this.h3TabTarget.style.color = ''\n      }\n      // Hide attribute selector\n      if (this.hasAttributeSelectTarget) {\n        this.attributeSelectTarget.classList.add('hidden')\n      }\n    } else if (type === 'h3') {\n      // Only switch to h3 if h3 data is available\n      if (!this.mapController.h3DataValue || this.mapController.h3DataValue.length === 0) {\n        console.warn('H3 map data not available')\n        return\n      }\n      this.mapController.showH3Layer()\n      this.insightsTabTarget.classList.remove('active', 'bg-blue-50', 'text-blue-600')\n      this.insightsTabTarget.classList.add('text-gray-700')\n      this.insightsTabTarget.style.backgroundColor = ''\n      this.insightsTabTarget.style.color = ''\n      if (this.hasH3TabTarget) {\n        this.h3TabTarget.classList.add('active')\n        this.h3TabTarget.classList.remove('text-gray-700')\n        this.h3TabTarget.style.backgroundColor = '#E4F0EA'\n        this.h3TabTarget.style.color = '#1F6F54'\n      }\n      // Show attribute selector\n      if (this.hasAttributeSelectTarget) {\n        this.attributeSelectTarget.classList.remove('hidden')\n      }\n    }\n\n    // Trigger resize\n    setTimeout(() => {\n      this.mapTarget.dispatchEvent(new CustomEvent('map:invalidate-size'))\n    }, 100)\n  }\n\n  switchAttribute(event) {\n    if (!this.mapController || this.activeType !== 'h3') return\n\n    const newAttribute = event.target.value\n\n    // Check if attribute is locked for unsubscribed users\n    const lockedAttributes = ['total_revenue', 'total_net_adr', 'occupancy', 'total_booking_count']\n    if (!this.isSubscribedValue && lockedAttributes.includes(newAttribute)) {\n      event.preventDefault()\n      // Prevent the radio button from being checked\n      event.target.checked = false\n      return\n    }\n\n    this.mapController.changeH3Attribute(newAttribute)\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nString.prototype.capitalize = function() {\n  return this.replace(/(?:^|\\s)\\S/g, function(a) { return a.toUpperCase(); });\n};\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    durationData: Array,\n    leadDaysData: Array,\n    locale: String,\n    today: Number,\n    dataType: { type: String, default: 'days' },\n    tension: { type: Number, default: 0 }\n  }\n\n  connect() {\n    this.chart = null\n    // Default to duration if available, otherwise lead_days\n    this.currentMetric = this.hasDurationDataValue && this.durationDataValue.length > 0 ? 'duration' : 'lead_days'\n    this.initializeChart()\n  }\n\n  switchChart(event) {\n    const metric = event.currentTarget.dataset.metric\n    if (metric === this.currentMetric) return\n\n    this.currentMetric = metric\n    this.updateActiveCard()\n    this.updateChart()\n  }\n\n  updateActiveCard() {\n    const cards = this.element.querySelectorAll('.metric-chart-switcher-metric-card')\n    cards.forEach(card => {\n      const cardMetric = card.dataset.metric\n      if (cardMetric === this.currentMetric) {\n        card.classList.add('border-primary', 'bg-[#E4F0EA]')\n        card.classList.remove('border-gray-200', 'bg-gradient-to-br')\n      } else {\n        card.classList.remove('border-primary', 'bg-[#E4F0EA]')\n        card.classList.add('border-gray-200', 'bg-gradient-to-br')\n      }\n    })\n  }\n\n  updateChart() {\n    const chartData = this.currentMetric === 'duration' ? this.durationDataValue : this.leadDaysDataValue\n    const dates = chartData.map(([date]) => new Date(date))\n\n    // Update chart data\n    this.chart.data.labels = chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(this.localeValue, { month: 'short', timeZone: 'UTC' }).capitalize())\n    this.chart.data.datasets[0].data = chartData.map(([, value]) => value)\n\n    // Update tooltip title based on metric\n    this.chart.options.plugins.tooltip.callbacks.title = (tooltipItems) => {\n      const dataIndex = tooltipItems[0].dataIndex\n      const dateString = chartData[dataIndex][0]\n      const date = new Date(dateString + 'T00:00:00Z')\n      return date.toLocaleString(this.localeValue, {\n        month: 'long',\n        year: 'numeric',\n        timeZone: 'UTC'\n      })\n    }\n\n    this.chart.update()\n  }\n\n  initializeChart() {\n    const canvasElement = this.canvasTarget\n    const ctx = canvasElement.getContext('2d')\n    const chartData = this.currentMetric === 'duration' ? this.durationDataValue : this.leadDaysDataValue\n    const dates = chartData.map(([date]) => new Date(date))\n    const todayValue = this.todayValue\n    const localeValue = this.localeValue\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(localeValue, { month: 'short', timeZone: 'UTC' }).capitalize()),\n        datasets: [{\n          type: 'line',\n          data: chartData.map(([, value]) => value),\n          tension: this.tensionValue,\n          segment: {\n            borderDash: ctx => {\n              const currentDate = dates[ctx.p1DataIndex]\n              const now = new Date(todayValue)\n              return currentDate >= now ? [5, 5] : []\n            }\n          },\n          borderColor: function(context) {\n            const chart = context.chart\n            const {ctx, chartArea} = chart\n            if (!chartArea) {\n              return\n            }\n            return getGradient(ctx, chartArea)\n          },\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const {ctx, chartArea} = chart\n            if (!chartArea) {\n              return\n            }\n            const gradient = getGradient(ctx, chartArea)\n            const currentDate = dates[context.dataIndex]\n            const now = new Date(todayValue)\n            if (currentDate >= now) {\n              return 'rgba(31, 111, 84, 0.3)'\n            }\n            return gradient\n          },\n          pointBackgroundColor: '#8FCBB0',\n          pointRadius: 2,\n          pointHoverRadius: 4\n        }]\n      },\n      options: {\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: false\n          },\n          tooltip: {\n            callbacks: {\n              title: (tooltipItems) => {\n                const dataIndex = tooltipItems[0].dataIndex\n                const dateString = chartData[dataIndex][0]\n                const date = new Date(dateString + 'T00:00:00Z')\n                return date.toLocaleString(this.localeValue, {\n                  month: 'long',\n                  year: 'numeric',\n                  timeZone: 'UTC'\n                })\n              },\n              label: (context) => {\n                const value = context.raw\n                if (this.dataTypeValue === 'days') {\n                  return `${new Intl.NumberFormat(this.localeValue, {\n                    minimumFractionDigits: 1,\n                    maximumFractionDigits: 1\n                  }).format(value)} days`\n                }\n                return value\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            grid: {\n              display: false\n            }\n          },\n          y: {\n            grid: {\n              drawOnChartArea: true\n            }\n          }\n        }\n      }\n    })\n\n    // Set initial active card\n    this.updateActiveCard()\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    chartData: Array,\n    locale: String,\n    dataType: { type: String, default: 'number' },\n    currencyCode: { type: String, default: 'USD' },\n    lineColor: { type: String, default: 'rgba(59, 130, 246, 0.6)' }, // Subtle blue\n    chartType: { type: String, default: 'line' },\n    showXAxis: { type: Boolean, default: false },\n    showYAxis: { type: Boolean, default: false },\n    unitLabel: { type: String, default: '' } // Optional unit label to append to values (e.g., \"listings\", \"bookings\")\n  }\n\n  connect() {\n    this.chart = null\n    this.initializeChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  initializeChart() {\n    const ctx = this.element.getContext('2d')\n    const chartData = this.chartDataValue\n\n    if (!chartData || chartData.length === 0) return\n\n    // Store dates for tooltip formatting\n    const dates = chartData.map(([date]) => date)\n\n    // Format labels for x-axis if enabled\n    const labels = this.showXAxisValue\n      ? chartData.map(([date]) => {\n          const dateObj = new Date(date + 'T00:00:00Z')\n          return dateObj.toLocaleString(this.localeValue, {\n            month: 'short',\n            timeZone: 'UTC'\n          })\n        })\n      : chartData.map(() => '') // Empty labels when x-axis is hidden\n\n    const isBarChart = this.chartTypeValue === 'bar'\n    const dataset = isBarChart ? {\n      type: 'bar',\n      data: chartData.map(([, value]) => value),\n      backgroundColor: this.lineColorValue,\n      borderColor: this.lineColorValue,\n      borderWidth: 0,\n      borderRadius: 3,\n      barPercentage: 0.7\n    } : {\n      type: 'line',\n      data: chartData.map(([, value]) => value),\n      tension: 0.4,\n      cubicInterpolationMode: 'monotone',\n      borderColor: this.lineColorValue,\n      backgroundColor: 'transparent',\n      pointRadius: 0,\n      pointHoverRadius: 3,\n      borderWidth: 2.5,\n      fill: false\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: labels,\n        datasets: [dataset]\n      },\n      options: {\n        maintainAspectRatio: false,\n        responsive: true,\n        plugins: {\n          legend: {\n            display: false\n          },\n          tooltip: {\n            enabled: true,\n            backgroundColor: 'rgba(0, 0, 0, 0.8)',\n            padding: 8,\n            cornerRadius: 4,\n            displayColors: false,\n            callbacks: {\n              title: (tooltipItems) => {\n                const dataIndex = tooltipItems[0].dataIndex\n                const dateString = dates[dataIndex]\n                const date = new Date(dateString + 'T00:00:00Z')\n\n                // Format as \"Month Year\" (e.g., \"January 2024\")\n                const formattedDate = date.toLocaleString(this.localeValue, {\n                  month: 'long',\n                  year: 'numeric',\n                  timeZone: 'UTC'\n                })\n\n                // Capitalize first letter\n                return formattedDate.charAt(0).toUpperCase() + formattedDate.slice(1)\n              },\n              label: (context) => {\n                const value = context.raw\n                let formattedValue\n\n                switch (this.dataTypeValue) {\n                  case 'currency':\n                    formattedValue = new Intl.NumberFormat(this.localeValue, {\n                      style: 'currency',\n                      currency: this.currencyCodeValue,\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0\n                    }).format(value)\n                    break\n                  case 'percentage':\n                    formattedValue = `${Math.round(value)}%`\n                    break\n                  case 'number':\n                  default:\n                    formattedValue = new Intl.NumberFormat(this.localeValue, {\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0\n                    }).format(value)\n                }\n\n                // Append unit label if provided\n                if (this.unitLabelValue && this.unitLabelValue.trim() !== '') {\n                  formattedValue = `${formattedValue} ${this.unitLabelValue}`\n                }\n\n                return formattedValue\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            display: this.showXAxisValue,\n            grid: {\n              display: false\n            },\n            ticks: {\n              display: this.showXAxisValue,\n              maxRotation: 0,\n              minRotation: 0,\n              font: {\n                size: 10\n              },\n              color: 'rgba(107, 114, 128, 0.6)',\n              callback: (value, index) => {\n                if (!this.showXAxisValue) return ''\n                const dateString = dates[index]\n                if (!dateString) return ''\n                const date = new Date(dateString + 'T00:00:00Z')\n                // Format as \"MMM\" (e.g., \"Jan\", \"Feb\")\n                return date.toLocaleString(this.localeValue, {\n                  month: 'short',\n                  timeZone: 'UTC'\n                })\n              }\n            }\n          },\n          y: {\n            display: this.showYAxisValue,\n            position: 'right',\n            grid: {\n              display: false\n            },\n            ticks: {\n              display: this.showYAxisValue,\n              font: {\n                size: 10\n              },\n              color: 'rgba(107, 114, 128, 0.6)',\n              callback: (value) => {\n                if (!this.showYAxisValue) return ''\n                // Format based on data type\n                switch (this.dataTypeValue) {\n                  case 'currency':\n                    return new Intl.NumberFormat(this.localeValue, {\n                      style: 'currency',\n                      currency: this.currencyCodeValue,\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0,\n                      notation: 'compact'\n                    }).format(value)\n                  case 'percentage':\n                    return `${Math.round(value)}%`\n                  case 'number':\n                  default:\n                    return new Intl.NumberFormat(this.localeValue, {\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0,\n                      notation: 'compact'\n                    }).format(value)\n                }\n              }\n            }\n          }\n        },\n        interaction: {\n          intersect: false,\n          mode: 'index',\n          axis: 'x'\n        },\n        onHover: (event, activeElements) => {\n          event.native.target.style.cursor = activeElements.length > 0 ? 'pointer' : 'default'\n        }\n      }\n    })\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n\n  applyFilters(event) {\n    event.preventDefault()\n    const form = event.target.closest('form')\n    const formData = new FormData(form)\n\n    const compSet = formData.get('comp_set')\n    const bedrooms = formData.get('bedrooms')\n    const capacity = formData.get('capacity')\n\n    let params = new URLSearchParams(window.location.search)\n\n    if (compSet.startsWith('nearby_')) {\n      params.set('comp_set', 'nearby')\n      params.set('radius', compSet.split('_')[1])\n    } else {\n      params.set('comp_set', compSet)\n      params.delete('radius')\n    }\n\n    params.set('bedrooms', bedrooms || 'all')\n\n    if (capacity) {\n      params.set('capacity', capacity)\n    }\n\n    window.location.search = params.toString()\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"amenities\", \"showMoreButton\"];\n\n  connect() {\n    this.selectedAmenities = [];\n\n    const urlParams = new URLSearchParams(window.location.search);\n\n    // Move selected amenities HTML elements to the beginning\n    const amenitiesContainer = this.amenitiesTarget;\n\n    const selectedButtons = Array.from(amenitiesContainer.querySelectorAll('button'))\n      .filter(button => urlParams.get(button.name));\n\n    selectedButtons.forEach(button => {\n      amenitiesContainer.prepend(button)\n      $(button).removeClass('hidden');\n    });\n\n    for (const [key, value] of urlParams.entries()) {\n      if (value === '1' && key.startsWith('has_')) {\n        this.selectedAmenities.push(key);\n      }\n    }\n  }\n\n  toggleExtraAmenities() {\n    $('button', this.amenitiesTarget).show()\n    $(this.showMoreButtonTarget).hide()\n  }\n\n  toggleAmenity(event) {\n    const amenity = event.target.name;\n\n    const isSelected = this.selectedAmenities.includes(amenity);\n    if (!isSelected) {\n      this.selectedAmenities.push(amenity);\n    } else {\n      this.selectedAmenities = this.selectedAmenities.filter(item => item !== amenity);\n    }\n\n    $(event.target).toggleClass('bg-gray-600 bg-gray-200 text-white text-gray-700');\n  }\n\n  applyFilters(event) {\n    event.preventDefault()\n    const form = $(event.currentTarget).parents('form');\n\n    // dont submit empty select fields\n    $('select', form).each(function() {\n      if ($(this).val() === '') {\n        $(this).attr('disabled', true);\n      }\n    });\n\n    // Add selected amenities to the form\n    if (this.selectedAmenities.length > 0) {\n      // Remove any existing hidden inputs for amenities\n      $('input[name=\"amenities[]\"]', form).remove();\n\n      // Add new hidden inputs for each selected amenity\n      this.selectedAmenities.forEach(amenity => {\n        $('<input>').attr({\n          type: 'hidden',\n          name: amenity,\n          value: 1\n        }).appendTo(form);\n      });\n    }\n\n    form.submit();\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\n//TODO: dont refresh paddle checkout when there are changes\n\nexport default class extends Controller {\n  static values = {\n    userEmail: String,\n    accountId: Number,\n    pricingConfig: Object,\n    locale: String,\n    currencyCode: String,\n    billingType: String\n  }\n\n  static targets = [\n    \"amountDisplay\",\n    \"amountDueDisplay\",\n    \"priceDisplay\",\n    \"planNameDisplay\",\n    \"totalDisplay\",\n    \"disclaimer\",\n    \"discountDisplay\",\n    \"subtotalDisplay\",\n    \"taxDisplay\",\n    \"priceBreakdown\",\n    \"loadingIndicator\"\n  ];\n\n  connect() {\n    if (window.Paddle === undefined) {\n      return\n    }\n\n    // Initialize values - will be updated from setValues/openCheckout to prevent double invocation\n    this.currencyCode = null\n    this.countryCode = null\n\n    Paddle.Update({\n      eventCallback: function({name, data}) {\n        const billingType = this.billingTypeValue || 'monthly'\n\n        switch(name) {\n          case 'checkout.customer.updated':\n            const newCountryCode = data.customer.address?.country_code\n            const newCurrencyCode = data.currency_code\n\n            // Only update if values actually changed\n            // Compare using == to handle null/undefined equality, but !== to detect actual changes\n            const countryChanged = this.countryCode != newCountryCode\n            const currencyChanged = this.currencyCode != newCurrencyCode\n\n            if (countryChanged || currencyChanged) {\n              this.countryCode = newCountryCode\n              this.currencyCode = newCurrencyCode\n\n              this.setValues({\n                params: {\n                  planId: this.planId,\n                  billingType,\n                  discountId: this.discountId,\n                  countryCode: this.countryCode,\n                  currencyCode: this.currencyCode\n                }\n              })\n            }\n            break\n          case 'checkout.discount.applied':\n            this.discountId = data.discount.id\n            this.setValues({\n              params: {\n                planId: this.planId,\n                billingType,\n                discountId: this.discountId,\n                countryCode: this.countryCode,\n                currencyCode: this.currencyCode\n              }\n            })\n            break\n          case 'checkout.discount.removed':\n            this.discountId = null\n            this.setValues({\n              params: {\n                planId: this.planId,\n                billingType,\n                discountId: null,\n                countryCode: this.countryCode,\n                currencyCode: this.currencyCode\n              }\n            })\n            break\n          case 'checkout.completed':\n            this.dispatch('checkoutCompleted', {\n              detail: {\n                data\n              }\n            })\n\n            this.dispatch('trackEvent', {\n              prefix: null,\n              detail: {\n                name: 'Checkout Completed',\n                properties: {\n                  plan_id: this.planId,\n                  billing_type: billingType,\n                  discount_id: this.discountId,\n                  total: data.totals.total\n                }\n              }\n            })\n\n            setTimeout(() => {\n              window.location.href = window.sessionStorage.getItem('returnToPage') || this.getCookie('returnToPage') || 'https://app.guestfavorites.com/'\n            }, 2000)\n            break\n        }\n      }.bind(this)\n    });\n\n    const urlParams = new URLSearchParams(window.location.search);\n    if (urlParams.get('paddle-action') === 'pay') {\n      // Get currency code from URL if available\n      if (urlParams.get('currencyCode')) {\n        this.currencyCode = urlParams.get('currencyCode');\n      }\n\n      const event = new Event('click');\n      event.params = {\n        planId: urlParams.get('planId'),\n        billingType: urlParams.get('billingType'),\n        discountId: urlParams.get('discountId'),\n        currencyCode: this.currencyCode\n      };\n      this.openCheckout(event);\n    }\n  }\n\n  getPriceOptions(event) {\n    const { planId, billingType } = event.params;\n    const discountId = this.resolveDiscountId(planId, billingType, event.params.discountId);\n    const items = [{\n      priceId: this.getPaddleProductId(planId, billingType),\n      quantity: 1\n    }]\n\n    return {\n      items,\n      discountId,\n      customData: {\n        account_id: this.accountIdValue,\n        email: this.userEmailValue\n      },\n      customer: {\n        email: this.userEmailValue\n      },\n      currencyCode: this.currencyCode || this.currencyCodeValue || 'USD'\n    }\n  }\n\n  async setValues(event) {\n    const { planId, billingType, currencyCode } = event.params;\n    const discountId = this.resolveDiscountId(planId, billingType, event.params.discountId);\n    const price = this.pricingConfigValue[planId][billingType];\n\n    // Use the currency from params, or fallback to the controller value\n    const currentCurrency = currencyCode || this.currencyCodeValue || 'USD';\n\n    // Get price information from the pricing config\n    const priceAmount = price['prices'][currentCurrency] || price['prices']['USD'];\n    let formattedPrice = this.formatCurrency(priceAmount, currentCurrency);\n\n    // Show loading indicator\n    $(this.loadingIndicatorTargets).removeClass('hidden');\n\n    // Fetch accurate pricing information from Paddle including tax and discount\n    let subtotal = formattedPrice;\n    let taxAmount = 0;\n    let taxFormatted = '';\n    let totalAmount = priceAmount;\n    let taxInclusive = true;\n    let discount = null;\n    let discountAmount = 0;\n\n    try {\n      const priceOptions = await Paddle.PricePreview(this.getPriceOptions(event));\n      const lineItem = priceOptions.data.details.lineItems[0];\n      const totals = lineItem.totals;\n      const formattedTotals = lineItem.formattedTotals;\n\n      // Store currency and country codes from Paddle PricePreview response\n      // This prevents double invocation when checkout.customer.updated fires\n\n      this.currencyCode = priceOptions.data.currencyCode;\n      this.countryCode = priceOptions.data.address?.countryCode;\n\n      // Check if tax is included in the price\n      // taxMode: \"external\" means tax is excluded, \"internal\" means tax is included\n      taxInclusive = lineItem.price.taxMode === 'internal';\n      taxAmount = totals.tax ? parseFloat(totals.tax) / 100 : 0;\n      taxFormatted = formattedTotals.tax || '';\n\n      // Get subtotal (price before tax)\n      subtotal = formattedTotals.subtotal || formattedPrice;\n      const subtotalAmount = totals.subtotal ? parseFloat(totals.subtotal) / 100 : priceAmount;\n\n      // Calculate unit price: if tax is inclusive, show total; otherwise show subtotal\n      let unitPriceDisplay = subtotal;\n      if (taxInclusive && totals.total) {\n        // Tax is included, so unit price should show the total (which includes tax)\n        unitPriceDisplay = formattedTotals.total || subtotal;\n      }\n\n      // Set plan name and price display using Paddle's data\n      $(this.planNameDisplayTargets).text(price['name']);\n      let priceText = unitPriceDisplay + price['suffix'];\n      if (currentCurrency == 'USD') {\n        priceText += ` (${currentCurrency})`;\n      }\n      $(this.priceDisplayTargets).text(priceText);\n\n      // Get discount if applicable\n      if (discountId && lineItem.discounts && lineItem.discounts.length > 0) {\n        discount = formattedTotals.discount;\n        discountAmount = lineItem.discounts[0].discount.amount;\n        subtotal = formattedTotals.subtotal || formattedPrice;\n      }\n\n      // Calculate total: if tax is excluded, add tax to subtotal; otherwise use the total from Paddle\n      if (taxInclusive) {\n        // Tax is included in the price, so total is the subtotal\n        totalAmount = subtotalAmount;\n      } else {\n        // Tax is excluded, so total is subtotal + tax\n        totalAmount = subtotalAmount + taxAmount;\n      }\n\n      // Use Paddle's total if available (it's always accurate)\n      if (totals.total) {\n        totalAmount = parseFloat(totals.total) / 100;\n      }\n\n    } catch (error) {\n      console.error('Error getting price options:', error);\n      // Fallback to basic calculation if API call fails\n      totalAmount = priceAmount;\n      // Set plan name and price display with fallback price\n      $(this.planNameDisplayTargets).text(price['name']);\n      let priceText = formattedPrice + price['suffix'];\n      if (currentCurrency == 'USD') {\n        priceText += ` (${currentCurrency})`;\n      }\n      $(this.priceDisplayTargets).text(priceText);\n\n      // Set amount due with USD if applicable\n      let amountDueText = this.formatCurrency(totalAmount, currentCurrency);\n      if (currentCurrency == 'USD') {\n        amountDueText += ` (${currentCurrency})`;\n      }\n      $(this.amountDueDisplayTargets).text(amountDueText);\n    }\n\n    // Handle discount display\n    if (discount) {\n      $(this.discountDisplayTargets).text(`-${discount}`).parent().removeClass('hidden');\n    } else {\n      $(this.discountDisplayTargets).parent().addClass('hidden');\n    }\n\n    // Handle tax display\n    if (taxAmount > 0) {\n      // Tax is excluded, show it separately\n      $(this.taxDisplayTargets).text(taxFormatted || this.formatCurrency(taxAmount, currentCurrency));\n      $(this.taxDisplayTargets).parent().removeClass('hidden');\n    } else {\n      // Tax is included or zero, hide the tax row\n      $(this.taxDisplayTargets).parent().addClass('hidden');\n    }\n\n    // Set subtotal and total\n    $(this.subtotalDisplayTargets).text(subtotal);\n    let totalText = this.formatCurrency(totalAmount, currentCurrency);\n    $(this.totalDisplayTargets).text(totalText);\n\n    // Set amount due (big number) with USD if applicable\n    let amountDueText = this.formatCurrency(totalAmount, currentCurrency);\n    if (currentCurrency == 'USD') {\n      amountDueText += ` (${currentCurrency})`;\n    }\n    $(this.amountDueDisplayTargets).text(amountDueText);\n\n    // Set price breakdown text\n    $(this.disclaimerTargets).children().addClass('hidden');\n    $(this.disclaimerTargets).find(`#${billingType}-disclaimer`).removeClass('hidden');\n\n    // Hide loading indicator\n    $(this.loadingIndicatorTargets).addClass('hidden');\n  }\n\n  // Helper method to format currency\n  formatCurrency(amount, currencyCode = 'USD') {\n    return new Intl.NumberFormat('en-US', {\n      style: 'currency',\n      currency: currencyCode,\n      minimumFractionDigits: 2\n    }).format(amount);\n  }\n\n  async checkForActiveSubscription() {\n    const response = await fetch('/payments/check_subscription_status')\n    if (response.status === 200) {\n      return false\n    }\n    return true\n  }\n\n  goToCheckoutPage(event) {\n    event.preventDefault();\n\n    let { planId, billingType } = event.params;\n\n    // Use billingType from params if provided, otherwise fall back to value\n    if (!billingType && this.hasBillingTypeValue) {\n      billingType = this.billingTypeValue;\n    }\n\n    // Store current page URL for later use after checkout\n    window.sessionStorage.setItem('returnToPage', window.location.href);\n    this.setCookie('returnToPage', window.location.href, 7); // Store for 7 days\n\n    window.location.href = `/checkout?planId=${planId}&billingType=${billingType}&paddle-action=pay`\n  }\n\n  async toggleBillingType(event) {\n    // This method is no longer used since checkbox was removed\n    // Keeping for backward compatibility but it won't be called\n    event.params = {\n      billingType: this.billingTypeValue || 'monthly',\n      planId: this.planId,\n      discountId: this.discountId,\n      countryCode: this.countryCode,\n      currencyCode: this.currencyCode || this.currencyCodeValue\n    }\n\n    await this.setValues(event)\n\n    this.openCheckout(event)\n  }\n\n  async openCheckout(event) {\n    event.preventDefault()\n\n    let { planId, billingType, currencyCode } = event.params;\n    const discountId = this.resolveDiscountId(planId, billingType, event.params.discountId);\n\n    // billingType is now passed as a value, no checkbox to update\n\n    // Store the planId and discountId for later use\n    this.planId = planId\n    this.discountId = discountId\n\n    // Update the displayed values\n    // setValues will extract and store currency/country codes from Paddle PricePreview\n    await this.setValues(event)\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Checkout Opened',\n        properties: {\n          planId,\n          billingType\n        }\n      }\n    })\n\n    // if (await this.checkForActiveSubscription()) {\n    //   alert('You already have an active subscription')\n    //   return\n    // }\n\n    try {\n      const items = [{\n        priceId: this.getPaddleProductId(planId, billingType),\n        quantity: 1\n      }]\n\n      const paddleOptions = {\n        items,\n        customData: {\n          account_id: this.accountIdValue,\n          email: this.userEmailValue\n        },\n        customer: {\n          email: this.userEmailValue\n        },\n        currencyCode: this.currencyCode || this.currencyCodeValue || 'USD',\n        theme: 'light',\n        settings: {\n          locale: this.localeValue,\n          displayMode: 'inline',\n          variant: 'one-page',\n          frameTarget: 'checkout-container',\n          frameInitialHeight: \"450\",\n          frameStyle: \"width: 100%; min-width: 312px; background-color: transparent; border: none;\",\n          showAddTaxId: false,\n          showAddDiscounts: !discountId\n        },\n        discountId\n      }\n\n      const checkout = await Paddle.Checkout.open(paddleOptions)\n    } catch (error) {\n      console.error('Error opening Paddle checkout:', error)\n    }\n  }\n\n  getPaddleProductId(planId, billingType) {\n    return this.pricingConfigValue[planId][billingType]['paddle_id']\n  }\n\n  resolveDiscountId(planId, billingType, explicitDiscountId) {\n    if (explicitDiscountId) return explicitDiscountId\n\n    return this.pricingConfigValue[planId]?.[billingType]?.discount_id || null\n  }\n\n  // Cookie helper methods\n  setCookie(name, value, days) {\n    const expires = new Date();\n    expires.setTime(expires.getTime() + (days * 24 * 60 * 60 * 1000));\n    document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/;domain=${window.location.hostname.split('.').slice(-2).join('.')};SameSite=Lax`;\n  }\n\n  getCookie(name) {\n    const nameEQ = name + \"=\";\n    const ca = document.cookie.split(';');\n    for(let i = 0; i < ca.length; i++) {\n      let c = ca[i];\n      while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n    }\n    return null;\n  }\n\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"modal\"]\n\n  connect() {\n    this.scrollThreshold = document.documentElement.scrollHeight * 0.3;\n    window.addEventListener('scroll', this.handleScroll.bind(this))\n  }\n\n  disconnect() {\n    window.removeEventListener('scroll', this.handleScroll.bind(this))\n  }\n\n  handleScroll() {\n    if (!this.modalShown && window.scrollY >= this.scrollThreshold) {\n      this.modalShown = true;\n      this.showModal();\n    }\n  }\n\n  showModal() {\n    new HSOverlay(this.modalTarget).open();\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\nimport Wkt from 'wicket'\nimport 'wicket-leaflet'\n\nexport default class extends Controller {\n  static targets = [\"container\", \"wktInput\"]\n  static values = {\n    wkt: String,\n    countryBounds: String\n  }\n\n  connect() {\n    this.map = null\n    this.editablePolygon = null\n    this.countryBoundsLayer = null\n    this.markers = []\n\n    // Wait for container to be ready\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        this.initializeMap()\n      })\n    })\n  }\n\n  disconnect() {\n    // Remove map event listeners\n    if (this.map) {\n      if (this.polygonDragHandlers) {\n        this.map.off('mousemove', this.polygonDragHandlers.mousemove)\n        this.map.off('mouseup', this.polygonDragHandlers.mouseup)\n      }\n      // Remove drawing event listeners\n      this.map.off('click')\n      this.map.off('mousemove')\n      this.map.off('dblclick')\n\n      // Remove preview line if it exists\n      if (this.previewLine) {\n        this.map?.removeLayer(this.previewLine)\n      }\n      // Re-enable map dragging if it was disabled\n      if (this.map.dragging) {\n        this.map.dragging.enable()\n      }\n      this.map.remove()\n    }\n\n    // Remove polygon event listeners\n    if (this.editablePolygon) {\n      this.editablePolygon.off('mousedown')\n    }\n\n    // Remove drawing polyline if it exists\n    if (this.drawingPolyline) {\n      this.map?.removeLayer(this.drawingPolyline)\n    }\n  }\n\n  initializeMap() {\n    const container = this.containerTarget\n    if (!container) return\n\n    // Create Leaflet map\n    this.map = L.map(container, {\n      zoomControl: true,\n      attributionControl: true\n    })\n\n    // Add tile layer\n    L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {\n      maxZoom: 19,\n      attribution: '&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>'\n    }).addTo(this.map)\n\n    // Load and display country bounds if available\n    if (this.hasCountryBoundsValue && this.countryBoundsValue) {\n      this.loadCountryBounds()\n    }\n\n    // Load and display current polygon, or allow drawing new one\n    if (this.hasWktValue && this.wktValue && this.wktValue.trim() !== '') {\n      this.loadPolygon()\n    } else {\n      // For new polygons, enable drawing mode\n      this.enableDrawingMode()\n    }\n  }\n\n  enableDrawingMode() {\n    // Set a default view\n    this.map.setView([40.4168, -3.7038], 6) // Default to Spain/Europe area\n\n    // Track drawing state\n    this.isDrawing = false\n    this.drawingVertices = []\n    this.drawingPolyline = null\n    this.previewLine = null\n    this.currentMousePos = null\n\n    // Add click handler to start/continue drawing\n    this.map.on('click', (e) => {\n      if (!this.isDrawing) {\n        // Start new polygon\n        this.startDrawing(e.latlng)\n      } else {\n        // Add vertex to existing polygon\n        this.addDrawingVertex(e.latlng)\n      }\n    })\n\n    // Track mouse movement for preview line\n    this.map.on('mousemove', (e) => {\n      if (this.isDrawing) {\n        this.currentMousePos = e.latlng\n        this.updatePreviewLine()\n      }\n    })\n\n    // Add double-click to finish polygon\n    this.map.on('dblclick', () => {\n      if (this.isDrawing && this.drawingVertices.length >= 3) {\n        this.finishDrawing()\n      }\n    })\n  }\n\n  startDrawing(firstPoint) {\n    this.isDrawing = true\n    this.drawingVertices = [firstPoint]\n\n    // Create a polyline to show the polygon being drawn\n    this.drawingPolyline = L.polyline([firstPoint], {\n      color: '#1D4ED8',\n      weight: 3\n    }).addTo(this.map)\n\n    // Create preview line that follows mouse\n    this.previewLine = L.polyline([firstPoint, firstPoint], {\n      color: '#1D4ED8',\n      weight: 2,\n      dashArray: '5, 5',\n      opacity: 0.7\n    }).addTo(this.map)\n  }\n\n  addDrawingVertex(latlng) {\n    this.drawingVertices.push(latlng)\n    this.drawingPolyline.setLatLngs(this.drawingVertices)\n    this.updatePreviewLine()\n  }\n\n  updatePreviewLine() {\n    if (!this.isDrawing || !this.previewLine || this.drawingVertices.length === 0) return\n\n    if (this.currentMousePos) {\n      // Update preview line from last vertex to current mouse position\n      const lastVertex = this.drawingVertices[this.drawingVertices.length - 1]\n      this.previewLine.setLatLngs([lastVertex, this.currentMousePos])\n    }\n  }\n\n  finishDrawing() {\n    if (this.drawingVertices.length < 3) {\n      alert('A polygon needs at least 3 vertices')\n      return\n    }\n\n    // Close the polygon\n    const closedVertices = [...this.drawingVertices, this.drawingVertices[0]]\n\n    // Create the polygon\n    this.editablePolygon = L.polygon(closedVertices, {\n      color: '#1D4ED8',\n      weight: 3,\n      fillColor: '#3B82F6',\n      fillOpacity: 0.3\n    }).addTo(this.map)\n\n    // Remove drawing polyline and preview line\n    if (this.drawingPolyline) {\n      this.map.removeLayer(this.drawingPolyline)\n      this.drawingPolyline = null\n    }\n    if (this.previewLine) {\n      this.map.removeLayer(this.previewLine)\n      this.previewLine = null\n    }\n\n    // Disable drawing mode\n    this.isDrawing = false\n    this.currentMousePos = null\n    this.map.off('click')\n    this.map.off('mousemove')\n    this.map.off('dblclick')\n\n    // Make polygon editable and draggable\n    this.makePolygonDraggable()\n    this.makePolygonEditable()\n\n    // Update WKT\n    this.updateWktFromPolygon()\n\n    // Fit map to polygon\n    this.map.fitBounds(this.editablePolygon.getBounds(), { padding: [50, 50] })\n  }\n\n  loadCountryBounds() {\n    try {\n      const wkt = new Wkt.Wkt()\n      wkt.read(this.countryBoundsValue)\n      const bounds = wkt.toObject({\n        color: '#9ca3af',\n        weight: 2,\n        fillColor: '#e5e7eb',\n        fillOpacity: 0.1,\n        dashArray: '5, 5'\n      })\n      bounds.addTo(this.map)\n      this.countryBoundsLayer = bounds\n\n      // Fit map to country bounds initially\n      if (!this.hasWktValue || !this.wktValue) {\n        this.map.fitBounds(bounds.getBounds(), { padding: [50, 50] })\n      }\n    } catch (error) {\n      console.error('Failed to load country bounds:', error)\n    }\n  }\n\n  loadPolygon() {\n    if (!this.map || !this.wktValue) return\n\n    try {\n      const wkt = new Wkt.Wkt()\n      wkt.read(this.wktValue)\n\n      // Create polygon\n      this.editablePolygon = wkt.toObject({\n        color: '#1D4ED8',\n        weight: 3,\n        fillColor: '#3B82F6',\n        fillOpacity: 0.3\n      })\n\n      // Make polygon interactive so we can detect clicks/drags on it\n      this.editablePolygon.setStyle({ interactive: true })\n\n      this.editablePolygon.addTo(this.map)\n\n      // Make polygon draggable\n      this.makePolygonDraggable()\n\n      // Make polygon editable by adding markers at vertices\n      this.makePolygonEditable()\n\n      // Fit map to polygon bounds\n      this.map.fitBounds(this.editablePolygon.getBounds(), { padding: [50, 50] })\n\n      // Update WKT input with initial value\n      this.updateWktFromPolygon()\n    } catch (error) {\n      console.error('Failed to load polygon:', error)\n    }\n  }\n\n  makePolygonDraggable() {\n    if (!this.editablePolygon) return\n\n    // Store initial positions for calculating offset\n    this.isDraggingPolygon = false\n    this.dragStartLatlngs = null\n    this.dragStartMarkerPositions = null\n    this.dragStartMousePos = null\n\n    // Handle mouse down on polygon - prevent map dragging\n    this.editablePolygon.on('mousedown', (e) => {\n      // Check if clicking on polygon path (not on markers)\n      const target = e.originalEvent.target\n      const isMarker = target.closest('.leaflet-marker-icon') ||\n                       target.closest('.polygon-vertex-marker') ||\n                       target.closest('.polygon-middle-marker')\n\n      if (!isMarker && (target === this.editablePolygon._path || target.closest('.leaflet-interactive'))) {\n        this.isDraggingPolygon = true\n        this.dragStartMousePos = this.map.mouseEventToLatLng(e.originalEvent)\n        this.dragStartLatlngs = this.editablePolygon.getLatLngs()[0].map(ll => L.latLng(ll.lat, ll.lng))\n        this.dragStartMarkerPositions = {\n          vertex: this.vertexMarkers ? this.vertexMarkers.map(m => m.getLatLng()) : [],\n          middle: this.middleMarkers ? this.middleMarkers.map(m => m.getLatLng()) : []\n        }\n\n        // Prevent map dragging\n        this.map.dragging.disable()\n        L.DomEvent.stop(e.originalEvent)\n      }\n    })\n\n    // Handle mouse move\n    const handleMouseMove = (e) => {\n      if (this.isDraggingPolygon && this.dragStartMousePos && this.dragStartLatlngs) {\n        const currentMousePos = this.map.mouseEventToLatLng(e.originalEvent)\n\n        // Calculate offset\n        const offset = {\n          lat: currentMousePos.lat - this.dragStartMousePos.lat,\n          lng: currentMousePos.lng - this.dragStartMousePos.lng\n        }\n\n        // Update polygon vertices\n        const newLatlngs = this.dragStartLatlngs.map(ll =>\n          L.latLng(ll.lat + offset.lat, ll.lng + offset.lng)\n        )\n        this.editablePolygon.setLatLngs([newLatlngs])\n\n        // Update all vertex markers\n        if (this.vertexMarkers && this.dragStartMarkerPositions.vertex.length === this.vertexMarkers.length) {\n          this.vertexMarkers.forEach((marker, index) => {\n            const startPos = this.dragStartMarkerPositions.vertex[index]\n            marker.setLatLng([startPos.lat + offset.lat, startPos.lng + offset.lng])\n          })\n        }\n\n        // Update all middle markers\n        if (this.middleMarkers && this.dragStartMarkerPositions.middle.length === this.middleMarkers.length) {\n          this.middleMarkers.forEach((marker, index) => {\n            const startPos = this.dragStartMarkerPositions.middle[index]\n            marker.setLatLng([startPos.lat + offset.lat, startPos.lng + offset.lng])\n          })\n        }\n\n        // Update WKT in real-time\n        this.updateWktFromPolygon()\n\n        // Prevent map dragging during polygon drag\n        L.DomEvent.stop(e)\n      }\n    }\n\n    // Handle mouse up\n    const handleMouseUp = () => {\n      if (this.isDraggingPolygon) {\n        this.isDraggingPolygon = false\n\n        // Re-enable map dragging\n        this.map.dragging.enable()\n\n        // Final update - ensure all markers are in sync\n        const currentLatlngs = this.editablePolygon.getLatLngs()[0]\n\n        // Update vertex markers to match polygon vertices exactly\n        if (this.vertexMarkers && currentLatlngs.length === this.vertexMarkers.length) {\n          this.vertexMarkers.forEach((marker, index) => {\n            marker.setLatLng(currentLatlngs[index])\n          })\n        }\n\n        // Recalculate middle markers\n        this.updateMiddleMarkers(currentLatlngs)\n\n        // Clear drag state\n        this.dragStartLatlngs = null\n        this.dragStartMarkerPositions = null\n        this.dragStartMousePos = null\n\n        this.updateWktFromPolygon()\n      }\n    }\n\n    // Bind event handlers\n    this.map.on('mousemove', handleMouseMove)\n    this.map.on('mouseup', handleMouseUp)\n\n    // Store handlers for cleanup\n    this.polygonDragHandlers = {\n      mousemove: handleMouseMove,\n      mouseup: handleMouseUp\n    }\n  }\n\n  makePolygonEditable() {\n    if (!this.editablePolygon) return\n\n    // Get polygon coordinates\n    const latlngs = this.editablePolygon.getLatLngs()[0]\n\n    // Clear existing markers\n    this.clearMarkers()\n\n    // Store vertex markers separately from middle markers\n    this.vertexMarkers = []\n\n    // Create draggable markers at each vertex\n    latlngs.forEach((latlng, index) => {\n      const marker = L.marker(latlng, {\n        draggable: true,\n        icon: L.divIcon({\n          className: 'polygon-vertex-marker',\n          html: '<div class=\"w-4 h-4 bg-blue-600 border-2 border-white rounded-full shadow-lg cursor-move\"></div>',\n          iconSize: [16, 16],\n          iconAnchor: [8, 8]\n        })\n      })\n\n      marker.on('drag', () => {\n        // Update polygon vertex position\n        const newLatlng = marker.getLatLng()\n        latlngs[index] = newLatlng\n        this.editablePolygon.setLatLngs([latlngs])\n        // Update middle markers positions\n        this.updateMiddleMarkers(latlngs)\n        this.updateWktFromPolygon()\n      })\n\n      marker.on('dragend', () => {\n        // Ensure polygon is updated after drag ends\n        const currentLatlngs = this.editablePolygon.getLatLngs()[0]\n        this.updateMiddleMarkers(currentLatlngs)\n        this.updateWktFromPolygon()\n      })\n\n      marker.addTo(this.map)\n      this.markers.push(marker)\n      this.vertexMarkers.push(marker)\n    })\n\n    // Add middle markers for adding new vertices\n    this.addMiddleMarkers(latlngs)\n  }\n\n  addMiddleMarkers(latlngs) {\n    // Store middle markers separately for easy updates\n    if (!this.middleMarkers) {\n      this.middleMarkers = []\n    }\n\n    // Remove existing middle markers\n    this.middleMarkers.forEach(marker => {\n      this.map.removeLayer(marker)\n      const index = this.markers.indexOf(marker)\n      if (index > -1) {\n        this.markers.splice(index, 1)\n      }\n    })\n    this.middleMarkers = []\n\n    for (let i = 0; i < latlngs.length; i++) {\n      const nextIndex = (i + 1) % latlngs.length\n      const midLat = (latlngs[i].lat + latlngs[nextIndex].lat) / 2\n      const midLng = (latlngs[i].lng + latlngs[nextIndex].lng) / 2\n\n      const marker = L.marker([midLat, midLng], {\n        draggable: true,\n        icon: L.divIcon({\n          className: 'polygon-middle-marker',\n          html: '<div class=\"w-4 h-4 bg-blue-600 border-2 border-white rounded-full shadow-lg cursor-move\"></div>',\n          iconSize: [16, 16],\n          iconAnchor: [8, 8]\n        })\n      })\n\n      // Store the index where this marker should insert a vertex\n      marker._insertIndex = i + 1\n      marker._isMiddleMarker = true\n      marker._vertexInserted = false\n\n      marker.on('dragstart', () => {\n        // Create vertex immediately when dragging starts\n        if (!marker._vertexInserted) {\n          const currentLatlngs = this.editablePolygon.getLatLngs()[0]\n          currentLatlngs.splice(marker._insertIndex, 0, marker.getLatLng())\n          this.editablePolygon.setLatLngs([currentLatlngs])\n          marker._vertexInserted = true\n          // Remove this marker from middle markers array since it's now a vertex\n          const middleIndex = this.middleMarkers.indexOf(marker)\n          if (middleIndex > -1) {\n            this.middleMarkers.splice(middleIndex, 1)\n          }\n        }\n      })\n\n      marker.on('drag', () => {\n        // Update vertex position in real-time as marker is dragged\n        if (marker._vertexInserted) {\n          const currentLatlngs = this.editablePolygon.getLatLngs()[0]\n          currentLatlngs[marker._insertIndex] = marker.getLatLng()\n          this.editablePolygon.setLatLngs([currentLatlngs])\n          // Update middle markers positions in real-time\n          this.updateMiddleMarkers(currentLatlngs)\n          this.updateWktFromPolygon()\n        }\n      })\n\n      marker.on('dragend', () => {\n        // Final update and recreate all markers\n        if (marker._vertexInserted) {\n          this.makePolygonEditable() // Recreate all markers\n          this.updateWktFromPolygon()\n        }\n      })\n\n      marker.addTo(this.map)\n      this.markers.push(marker)\n      this.middleMarkers.push(marker)\n    }\n  }\n\n  updateMiddleMarkers(latlngs) {\n    // Update positions of existing middle markers without recreating them\n    if (!this.middleMarkers || this.middleMarkers.length === 0) {\n      this.addMiddleMarkers(latlngs)\n      return\n    }\n\n    for (let i = 0; i < latlngs.length; i++) {\n      const nextIndex = (i + 1) % latlngs.length\n      const midLat = (latlngs[i].lat + latlngs[nextIndex].lat) / 2\n      const midLng = (latlngs[i].lng + latlngs[nextIndex].lng) / 2\n\n      if (this.middleMarkers[i]) {\n        this.middleMarkers[i].setLatLng([midLat, midLng])\n      } else {\n        // If we have more vertices than middle markers, add new ones\n        const marker = L.marker([midLat, midLng], {\n          draggable: true,\n          icon: L.divIcon({\n            className: 'polygon-middle-marker',\n            html: '<div class=\"w-4 h-4 bg-blue-600 border-2 border-white rounded-full shadow-lg cursor-move\"></div>',\n            iconSize: [16, 16],\n            iconAnchor: [8, 8]\n          })\n        })\n\n        // Store the index where this marker should insert a vertex\n        marker._insertIndex = i + 1\n        marker._isMiddleMarker = true\n        marker._vertexInserted = false\n\n        marker.on('dragstart', () => {\n          // Create vertex immediately when dragging starts\n          if (!marker._vertexInserted) {\n            const currentLatlngs = this.editablePolygon.getLatLngs()[0]\n            currentLatlngs.splice(marker._insertIndex, 0, marker.getLatLng())\n            this.editablePolygon.setLatLngs([currentLatlngs])\n            marker._vertexInserted = true\n            // Remove this marker from middle markers array since it's now a vertex\n            const middleIndex = this.middleMarkers.indexOf(marker)\n            if (middleIndex > -1) {\n              this.middleMarkers.splice(middleIndex, 1)\n            }\n          }\n        })\n\n        marker.on('drag', () => {\n          // Update vertex position in real-time as marker is dragged\n          if (marker._vertexInserted) {\n            const currentLatlngs = this.editablePolygon.getLatLngs()[0]\n            currentLatlngs[marker._insertIndex] = marker.getLatLng()\n            this.editablePolygon.setLatLngs([currentLatlngs])\n            // Update middle markers positions in real-time\n            this.updateMiddleMarkers(currentLatlngs)\n            this.updateWktFromPolygon()\n          }\n        })\n\n        marker.on('dragend', () => {\n          // Final update and recreate all markers\n          if (marker._vertexInserted) {\n            this.makePolygonEditable() // Recreate all markers\n            this.updateWktFromPolygon()\n          }\n        })\n\n        marker.addTo(this.map)\n        this.markers.push(marker)\n        this.middleMarkers.push(marker)\n      }\n    }\n\n    // Remove extra middle markers if vertices were removed\n    while (this.middleMarkers.length > latlngs.length) {\n      const marker = this.middleMarkers.pop()\n      this.map.removeLayer(marker)\n      const index = this.markers.indexOf(marker)\n      if (index > -1) {\n        this.markers.splice(index, 1)\n      }\n    }\n  }\n\n  clearMarkers() {\n    this.markers.forEach(marker => {\n      this.map.removeLayer(marker)\n    })\n    this.markers = []\n  }\n\n  updateWktFromPolygon() {\n    if (!this.editablePolygon) return\n\n    // Check if wktInput target exists\n    if (!this.hasWktInputTarget) {\n      console.warn('wktInput target not found')\n      return\n    }\n\n    try {\n      const latlngs = this.editablePolygon.getLatLngs()[0]\n      const coordinates = latlngs.map(ll => [ll.lng, ll.lat])\n\n      // Close the polygon if not already closed\n      if (coordinates.length > 0) {\n        const first = coordinates[0]\n        const last = coordinates[coordinates.length - 1]\n        if (first[0] !== last[0] || first[1] !== last[1]) {\n          coordinates.push([first[0], first[1]])\n        }\n      }\n\n      // Create WKT polygon string\n      const coordsString = coordinates.map(c => `${c[0]} ${c[1]}`).join(', ')\n      const wktString = `POLYGON((${coordsString}))`\n\n      // Update hidden input\n      this.wktInputTarget.value = wktString\n\n      // Dispatch event for form validation if needed\n      this.dispatch('polygon-updated', { detail: { wkt: wktString } })\n    } catch (error) {\n      console.error('Failed to update WKT:', error)\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    pageType: String,\n    defaultPolygon: String,\n    defaultPolygonSlug: String,\n    defaultPolygonName: String\n  }\n\n  polygonClicked(event) {\n    let { polygonUuid, polygonSlug, polygonName } = event.detail\n\n    polygonUuid = polygonUuid || this.defaultPolygonValue\n\n    if (polygonUuid) {\n      // Track Start Link Clicked via a bubbling event consumed by amplitude controller\n      this.dispatch('trackEvent', {\n        prefix: null,\n        detail: {\n          name: 'Start Link Clicked',\n          properties: {\n            button_location: 'map_polygon',\n            page_type: this.pageTypeValue,\n            market_id: polygonUuid,\n            polygon_slug: polygonSlug,\n            polygon_name: polygonName\n          }\n        }\n      })\n\n      // Construct the URL for the child polygon's occupancy landing page\n      const childUrl = `/start?market_id=${polygonUuid}`\n\n      // Open in a new tab\n      window.open(childUrl)\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { quantile } from 'simple-statistics'\nimport Wkt from 'wicket'\nimport 'wicket-leaflet'\nimport geostats from 'geostats'\n\nexport default class extends Controller {\n  static targets = [\"container\"]\n  static values = {\n    polygonsData: Array,\n    dataUrl: String,\n    parentPolygon: String,\n    padding: { type: Number, default: 10 },\n    openInSameTab: Boolean\n  }\n\n  connect() {\n    this.initializeMap()\n\n    if (this.hasDataUrlValue && this.dataUrlValue) {\n      this.fetchPolygonsData()\n    } else if (this.polygonsDataValue && this.polygonsDataValue.length > 0) {\n      this.addPolygons(this.polygonsDataValue)\n    }\n  }\n\n  async fetchPolygonsData() {\n    try {\n      const response = await fetch(this.dataUrlValue)\n      if (!response.ok) {\n        throw new Error(`HTTP error! status: ${response.status}`)\n      }\n      const data = await response.json()\n      const polygons = Array.isArray(data.polygons) ? data.polygons : []\n      if (polygons.length > 0) {\n        this.polygonsDataValue = polygons\n        this.addPolygons(polygons)\n      }\n    } catch (error) {\n      console.error('Failed to fetch polygon data:', error)\n    }\n  }\n\n  disconnect() {\n    if (this.map) {\n      this.map.remove()\n    }\n  }\n\n  initializeMap() {\n    const container = this.containerTarget\n\n    this.map = L.map(container, {\n      zoomControl: false,\n      attributionControl: false,\n      dragging: true,\n      touchZoom: true,\n      doubleClickZoom: true,\n      scrollWheelZoom: true,\n      boxZoom: false,\n      keyboard: false\n    })\n\n    L.tileLayer('https://tiles.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png', {\n      attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors &copy; <a href=\"https://carto.com/attributions\">CARTO</a>',\n      maxZoom: 19,\n      opacity: 1,\n      retina: '@2x',\n      detectRetina: true\n    }).addTo(this.map)\n\n    if (this.parentPolygonValue) {\n      const parentWkt = new Wkt.Wkt()\n      parentWkt.read(this.parentPolygonValue)\n\n      const parentPolygon = parentWkt.toObject({\n        color: '#6b7280',\n        weight: 2,\n        fillColor: '#e5e7eb',\n        fillOpacity: 0.1,\n        dashArray: '5, 5'\n      })\n\n      parentPolygon.addTo(this.map)\n    }\n\n    this.polygonLayer = L.layerGroup().addTo(this.map)\n    this.legendControl = null\n  }\n\n  addPolygons(polygonsData) {\n    const polygons = Array.isArray(polygonsData) ? polygonsData : []\n    if (polygons.length === 0 || !this.map) return\n\n    this.polygonsDataValue = polygons\n    this.polygonLayer.clearLayers()\n\n    const availableListingsValues = polygons\n      .map(p => p.available_listings || 0)\n      .filter(val => val > 0)\n\n    const colorRanges = this.buildColorRanges(availableListingsValues)\n    const allBounds = L.latLngBounds()\n    let hasValidBounds = false\n\n    polygons.forEach(polygonData => {\n      if (!polygonData.simplified_geom) return\n\n      const wkt = new Wkt.Wkt()\n      try {\n        wkt.read(polygonData.simplified_geom)\n\n        const availableListings = polygonData.available_listings || 0\n        const colorRange = this.getColorRange(availableListings, colorRanges)\n        const fillColor = colorRange?.color || '#e5e7eb'\n        const strokeColor = availableListings > 0 ? '#374151' : '#9ca3af'\n\n        const polygon = wkt.toObject({\n          color: strokeColor,\n          weight: 2,\n          fillColor: fillColor,\n          fillOpacity: 0.4\n        })\n\n        polygon.on('mouseover', () => {\n          polygon.setStyle({\n            weight: 3,\n            fillOpacity: 0.6\n          })\n        })\n\n        polygon.on('mouseout', () => {\n          polygon.setStyle({\n            weight: 2,\n            fillOpacity: 0.4\n          })\n        })\n\n        const formattedListings = availableListings.toLocaleString()\n        const tooltipContent = `\n          <div class=\"text-center\">\n            <div class=\"font-semibold\">${polygonData.name}</div>\n            <div class=\"text-xs mt-1\">${formattedListings} listings</div>\n          </div>\n        `\n        polygon.bindTooltip(tooltipContent, {\n          permanent: false,\n          direction: 'center',\n          className: 'polygon-tooltip'\n        })\n\n        polygon.on('click', () => {\n          if (polygonData.insights_url) {\n            if (this.openInSameTabValue) {\n              window.location.href = polygonData.insights_url\n            } else {\n              window.open(polygonData.insights_url)\n            }\n            return\n          }\n\n          this.dispatch('polygonClicked', {\n            detail: {\n              polygonUuid: polygonData.uuid,\n              polygonSlug: polygonData.slug,\n              polygonName: polygonData.name\n            }\n          })\n        })\n\n        polygon.addTo(this.polygonLayer)\n\n        const bounds = polygon.getBounds()\n        if (bounds.isValid()) {\n          allBounds.extend(bounds)\n          hasValidBounds = true\n        }\n      } catch (error) {\n        console.warn('Failed to parse polygon WKT:', error, polygonData)\n      }\n    })\n\n    if (colorRanges.length > 0) {\n      this.updateLegend(colorRanges, polygons)\n    } else if (this.legendControl) {\n      this.map.removeControl(this.legendControl)\n      this.legendControl = null\n    }\n\n    if (hasValidBounds) {\n      this.map.fitBounds(allBounds, { padding: [this.paddingValue, this.paddingValue] })\n    }\n  }\n\n  buildColorRanges(availableListingsValues) {\n    if (!availableListingsValues.length) return []\n\n    const palette = [\n      '#9d0208',\n      '#d00000',\n      '#dc2f02',\n      '#f48c06',\n      '#ffba08'\n    ]\n\n    const classifier = new geostats(availableListingsValues)\n    const breaks = classifier.getClassJenks2(availableListingsValues.length > 5 ? 4 : availableListingsValues.length - 1)\n\n    const colorRanges = []\n\n    for (let i = 0; i < breaks.length; i++) {\n      let min, max\n\n      if (i === 0) {\n        min = breaks[0] === 1 ? 0 : 1\n        max = breaks[0]\n      } else {\n        min = breaks[i - 1]\n        max = breaks[i]\n      }\n\n      let label\n      if (max === Infinity) {\n        label = `${min.toLocaleString()}+`\n      } else if (min === max) {\n        label = min.toLocaleString()\n      } else {\n        label = `${min.toLocaleString()} - ${max.toLocaleString()}`\n      }\n\n      colorRanges.push({\n        min,\n        max,\n        color: palette[4 - i] || palette[0],\n        label\n      })\n    }\n\n    return colorRanges\n  }\n\n  getColorRange(value, colorRanges) {\n    if (!colorRanges || colorRanges.length === 0) return null\n\n    for (const range of colorRanges) {\n      if (value >= range.min && value <= range.max) {\n        return range\n      }\n    }\n\n    return colorRanges[colorRanges.length - 1]\n  }\n\n  updateLegend(colorRanges, polygons) {\n    if (this.legendControl) {\n      this.map.removeControl(this.legendControl)\n      this.legendControl = null\n    }\n\n    const legend = L.control({ position: 'bottomleft' })\n\n    legend.onAdd = () => {\n      const div = L.DomUtil.create('div', 'legend')\n      div.style.cssText = `\n        background: white;\n        padding: 8px 12px;\n        border-radius: 6px;\n        box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n        font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n        font-size: 12px;\n        line-height: 1.4;\n      `\n\n      div.innerHTML = '<div style=\"font-weight: 600; margin-bottom: 6px; color: #374151;\">Listings</div>'\n\n      const legendItems = colorRanges.map(range => ({\n        color: range.color,\n        label: range.label,\n        min: range.min,\n        max: range.max\n      }))\n\n      legendItems.forEach(item => {\n        const hasPolygons = polygons.some(polygon => {\n          const listings = polygon.available_listings || 0\n          if (item.max === undefined || item.max === Infinity) {\n            return listings > item.min\n          }\n          if (item.min === 0 && item.max === 0) {\n            return listings === 0\n          }\n          return listings > item.min && listings <= item.max\n        })\n\n        if (!hasPolygons) return\n\n        div.innerHTML += `\n          <div style=\"display: flex; align-items: center; margin-bottom: 3px;\">\n            <div style=\"width: 16px; height: 12px; background: ${item.color}; margin-right: 6px; border: 1px solid #d1d5db; border-radius: 2px;\"></div>\n            <span style=\"color: #6b7280; font-size: 11px;\">${item.label}</span>\n          </div>\n        `\n      })\n\n      return div\n    }\n\n    legend.addTo(this.map)\n    this.legendControl = legend\n  }\n\n  addLegend(colorRanges) {\n    const legend = L.control({ position: 'bottomleft' })\n\n    legend.onAdd = () => {\n      const div = L.DomUtil.create('div', 'legend')\n      div.style.cssText = `\n        background: white;\n        padding: 8px 12px;\n        border-radius: 6px;\n        box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n        font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n        font-size: 12px;\n        line-height: 1.4;\n      `\n\n      // Title\n      div.innerHTML = '<div style=\"font-weight: 600; margin-bottom: 6px; color: #374151;\">Listings</div>'\n\n      // Helper function to create label, avoiding identical ranges\n      const createLabel = (min, max) => {\n        const roundedMin = Math.round(min)\n        const roundedMax = Math.round(max)\n        if (roundedMin === roundedMax) {\n          return roundedMin.toLocaleString()\n        }\n        return `${roundedMin.toLocaleString()} - ${roundedMax.toLocaleString()}`\n      }\n\n      // Helper function to check if any polygon falls within a range\n      const hasPolygonsInRange = (min, max = null, isHighestTier = false) => {\n        return polygonsData.some(polygon => {\n          const listings = polygon.available_listings || 0\n          if (max === null || isHighestTier) {\n            // For the highest tier (X+)\n            return listings > min\n          } else if (min === 0 && max === 0) {\n            // For zero tier\n            return listings === 0\n          } else {\n            // For range tiers: min < listings <= max (exclusive min, inclusive max)\n            // This avoids double-counting boundary values\n            return listings > min && listings <= max\n          }\n        })\n      }\n\n      // Create legend items directly from colorRanges object\n      const legendItems = colorRanges.map(range => ({\n        color: range.color,\n        label: range.label,\n        min: range.min,\n        max: range.max\n      }))\n\n      // Legend items are created directly from colorRanges - no additional logic needed\n\n      legendItems.forEach(item => {\n        div.innerHTML += `\n          <div style=\"display: flex; align-items: center; margin-bottom: 3px;\">\n            <div style=\"width: 16px; height: 12px; background: ${item.color}; margin-right: 6px; border: 1px solid #d1d5db; border-radius: 2px;\"></div>\n            <span style=\"color: #6b7280; font-size: 11px;\">${item.label}</span>\n          </div>\n        `\n      })\n\n      return div\n    }\n\n    legend.addTo(this.map)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"userIdsContainer\", \"userIdRow\", \"userIdInput\", \"readOnlyView\", \"editMode\", \"detailsRow\", \"expandButton\", \"listingRow\"]\n\n  connect() {\n    // Add input event listeners to each user ID input for URL parsing\n    this.userIdInputTargets.forEach(input => {\n      input.addEventListener('blur', this.parseUrlInput.bind(this))\n    })\n\n    // Track the currently expanded listing\n    this.currentlyExpandedId = null\n  }\n\n  // Parse Airbnb URL to extract user ID when input loses focus\n  parseUrlInput(event) {\n    const input = event.target\n    const value = input.value.trim()\n\n    if (value.includes('airbnb.com/users/show/') || value.includes('airbnb.com/users/')) {\n      try {\n        // Extract the numeric ID from the URL using a more flexible regex pattern\n        // This will handle multiple formats like:\n        // - https://www.airbnb.com/users/show/74885919\n        // - http://airbnb.com/users/show/74885919\n        // - airbnb.com/users/show/74885919\n        // - www.airbnb.com/users/show/74885919?s=abc\n        const matches = value.match(/airbnb\\.com\\/users(?:\\/show)?\\/(\\d+)(?:[?#].*)?$/)\n        if (matches && matches[1]) {\n          const userId = matches[1]\n          input.value = userId\n          console.log(`URL parsed: Extracted user ID ${userId} from ${value}`)\n        }\n      } catch (error) {\n        console.error(\"Error parsing Airbnb URL:\", error)\n      }\n    }\n  }\n\n  toggleEditMode(event) {\n    event.preventDefault()\n\n    if (this.readOnlyViewTarget.classList.contains('hidden')) {\n      // Switch to read-only mode\n      this.readOnlyViewTarget.classList.remove('hidden')\n      this.editModeTarget.classList.add('hidden')\n    } else {\n      // Switch to edit mode\n      this.readOnlyViewTarget.classList.add('hidden')\n      this.editModeTarget.classList.remove('hidden')\n    }\n  }\n\n  addUserId(event) {\n    event.preventDefault()\n\n    // Clone the first user ID row as a template\n    const template = this.userIdRowTargets[0].cloneNode(true)\n\n    // Clear the input value in the cloned template\n    template.querySelector('input').value = \"\"\n\n    // Append the new row to the container\n    this.userIdsContainerTarget.appendChild(template)\n\n    // Add event listener to the new input\n    const newInput = template.querySelector('input')\n    newInput.addEventListener('blur', this.parseUrlInput.bind(this))\n  }\n\n  removeUserId(event) {\n    event.preventDefault()\n\n    // Don't remove if it's the last row\n    if (this.userIdRowTargets.length <= 1) {\n      // Just clear the input instead\n      event.target.closest('[data-portfolio-target=\"userIdRow\"]').querySelector('input').value = \"\"\n      return\n    }\n\n    // Remove the row containing the clicked button\n    event.target.closest('[data-portfolio-target=\"userIdRow\"]').remove()\n  }\n\n  saveConfiguration(event) {\n    event.preventDefault()\n\n    // Process all inputs to ensure URLs are parsed\n    this.userIdInputTargets.forEach(input => {\n      const event = { target: input }\n      this.parseUrlInput(event)\n    })\n\n    // Gather all user IDs from the inputs\n    const userIds = this.userIdInputTargets.map(input => input.value.trim()).filter(id => id !== \"\")\n\n    // Get the form element\n    const form = event.target.closest('form')\n    const url = form.action\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').content\n\n    // Disable the submit button to prevent multiple submissions\n    const submitButton = form.querySelector('input[type=\"submit\"]')\n    if (submitButton) {\n      submitButton.disabled = true\n      submitButton.value = \"Saving...\"\n    }\n\n    // Send the data to the server\n    fetch(url, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'X-CSRF-Token': csrfToken\n      },\n      body: JSON.stringify({ airbnb_user_ids: userIds })\n    })\n    .then(response => response.json())\n    .then(data => {\n      if (data.success) {\n        // Show success message\n        this.showNotification('Configuration saved successfully!', 'success')\n\n        // Close the modal using Preline's API\n        HSOverlay.close(document.querySelector('#configuration-modal'))\n      } else {\n        // Handle errors\n        this.showNotification(`Error: ${data.errors.join(', ')}`, 'error')\n\n        // Re-enable the submit button\n        if (submitButton) {\n          submitButton.disabled = false\n          submitButton.value = \"Save Configuration\"\n        }\n      }\n    })\n    .catch(error => {\n      console.error(\"Error saving configuration:\", error)\n      this.showNotification('An error occurred while saving the configuration.', 'error')\n\n      // Re-enable the submit button\n      if (submitButton) {\n        submitButton.disabled = false\n        submitButton.value = \"Save Configuration\"\n      }\n    })\n  }\n\n  showNotification(message, type = 'success') {\n    // Create notification element\n    const notification = document.createElement('div')\n    notification.className = `fixed top-4 right-4 px-4 py-3 rounded-md shadow-md ${type === 'success' ? 'bg-green-500' : 'bg-red-500'} text-white z-50`\n    notification.textContent = message\n\n    // Append to body\n    document.body.appendChild(notification)\n\n    // Remove after 3 seconds\n    setTimeout(() => {\n      notification.classList.add('opacity-0', 'transition-opacity', 'duration-500')\n      setTimeout(() => {\n        notification.remove()\n      }, 500)\n    }, 3000)\n  }\n\n  toggleDetails(event) {\n    event.preventDefault()\n\n    const button = event.currentTarget\n    const listingId = button.dataset.listingId\n    const detailsRow = this.detailsRowTargets.find(row => row.dataset.listingId === listingId)\n    const listingRow = this.listingRowTargets.find(row => row.dataset.listingId === listingId)\n\n    if (detailsRow) {\n      // Check if we're expanding a new row\n      const isExpanding = detailsRow.classList.contains('hidden')\n\n      // If expanding a new row and another row is already expanded, collapse the current one first\n      if (isExpanding && this.currentlyExpandedId && this.currentlyExpandedId !== listingId) {\n        this.collapseRow(this.currentlyExpandedId)\n      }\n\n      // Toggle visibility of the clicked row\n      if (isExpanding) {\n        // Show details\n        detailsRow.classList.remove('hidden')\n        button.querySelector('.expand-icon').classList.add('hidden')\n        button.querySelector('.collapse-icon').classList.remove('hidden')\n        button.setAttribute('aria-expanded', 'true')\n        this.currentlyExpandedId = listingId\n\n        // Highlight the listing row\n        if (listingRow) {\n          listingRow.classList.add('bg-indigo-50', 'border-l-4', 'border-indigo-500', 'shadow-sm')\n          listingRow.classList.remove('hover:bg-gray-50')\n\n          // Scroll to make sure the expanded content is visible with the listing row at the top\n          setTimeout(() => {\n            // Get the position of the listing row relative to the viewport\n            const rect = listingRow.getBoundingClientRect()\n            const scrollTop = window.pageYOffset || document.documentElement.scrollTop\n\n            // Calculate the target scroll position (position of the element + current scroll - desired offset)\n            // Use a smaller offset on mobile devices\n            const offset = window.innerWidth < 768 ? 10 : 20\n            const targetScrollPosition = rect.top + scrollTop - offset\n\n            // Scroll to the target position\n            window.scrollTo({\n              top: targetScrollPosition,\n              behavior: 'smooth'\n            })\n          }, 100)\n        }\n\n        // Get the turbo frame\n        const frame = detailsRow.querySelector('turbo-frame')\n\n        // If the frame hasn't loaded yet, trigger the load and show loading state\n        if (frame && !frame.hasAttribute('complete')) {\n          // Add loading state to button\n          button.classList.add('animate-pulse')\n          button.querySelector('.collapse-icon').textContent = 'Loading...'\n\n          // Listen for turbo:frame-load event to remove loading state\n          frame.addEventListener('turbo:frame-load', () => {\n            button.classList.remove('animate-pulse')\n            button.querySelector('.collapse-icon').textContent = 'Hide Details'\n          }, { once: true })\n\n          frame.setAttribute('loading', 'eager') // Force immediate loading\n          frame.reload()\n        }\n      } else {\n        // Hide details\n        detailsRow.classList.add('hidden')\n        button.querySelector('.expand-icon').classList.remove('hidden')\n        button.querySelector('.collapse-icon').classList.add('hidden')\n        button.setAttribute('aria-expanded', 'false')\n        this.currentlyExpandedId = null\n\n        // Remove highlight from the listing row\n        if (listingRow) {\n          listingRow.classList.remove('bg-indigo-50', 'border-l-4', 'border-indigo-500', 'shadow-sm')\n          listingRow.classList.add('hover:bg-gray-50')\n        }\n      }\n    }\n  }\n\n  collapseRow(listingId) {\n    const detailsRow = this.detailsRowTargets.find(row => row.dataset.listingId === listingId)\n    const button = this.expandButtonTargets.find(btn => btn.dataset.listingId === listingId)\n    const listingRow = this.listingRowTargets.find(row => row.dataset.listingId === listingId)\n\n    if (detailsRow && button) {\n      detailsRow.classList.add('hidden')\n      button.querySelector('.expand-icon').classList.remove('hidden')\n      button.querySelector('.collapse-icon').classList.add('hidden')\n      button.setAttribute('aria-expanded', 'false')\n\n      // Remove highlight from the listing row\n      if (listingRow) {\n        listingRow.classList.remove('bg-indigo-50', 'border-l-4', 'border-indigo-500', 'shadow-sm')\n        listingRow.classList.add('hover:bg-gray-50')\n      }\n    }\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nconst plans = [\"free\", \"pro\", \"custom\"];\nexport default class extends Controller {\n  static targets = [\"switch\", \"annually\", \"monthly\"];\n\n  connect() {\n    this.updatePrices()\n  }\n\n  toggle() {\n    this.dispatch(\"toggleBillingType\", { detail: { billingType: this.switchTarget.checked ? 'yearly' : 'monthly' } });\n    this.dispatch(\"trackEvent\", {\n      prefix: null,\n      detail: {\n        name: \"Billing Type Changed\",\n        properties: {\n          billing_type: this.switchTarget.checked ? 'yearly' : 'monthly'\n        }\n      }\n    });\n    this.updatePrices()\n  }\n\n  updatePrices() {\n    if (!this.hasSwitchTarget) return;\n    const displayAnnually = this.switchTarget.checked;\n\n    this.annuallyTargets.forEach((annuallyTarget) => {\n      annuallyTarget.classList.toggle(\"hidden\", !displayAnnually);\n    })\n\n    this.monthlyTargets.forEach((monthlyTarget) => {\n      monthlyTarget.classList.toggle(\"hidden\", displayAnnually);\n    })\n\n    if (this.billingTypeTarget) {\n      this.billingTypeTarget.dataset.authBillingTypeParam = displayAnnually ? 'yearly' : 'monthly';\n    }\n\n    $(this.element).find(\"#access-until\").toggleClass(\"hidden\", !displayAnnually)\n  }\n\n  selectPlan(event) {\n    plans.forEach((plan) => {\n      $(`.pricing-${plan}`).addClass(\"hidden\");\n      $(`#plan-${plan}`).removeClass('ring-2 ring-offset-2 ring-violet-500');\n    });\n\n    $(`#plan-${event.params.plan}`).addClass('ring-2 ring-offset-2 ring-violet-500');\n\n    $(`.pricing-${event.params.plan}`).removeClass(\"hidden\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Simple controller to handle contextual title/subtitle for the pricing modal\nexport default class extends Controller {\n  static targets = [\"title\", \"subtitle\"]\n  static values = {\n    defaultTitle: String\n  }\n\n  connect() {\n    // Listen for context updates\n    document.addEventListener('pricing-modal:set-context', this.setContext.bind(this))\n    \n    // Reset when modal closes\n    const modal = this.element.closest('.hs-overlay')\n    if (modal) {\n      modal.addEventListener('close.hs.overlay', this.resetContext.bind(this))\n    }\n  }\n\n  disconnect() {\n    document.removeEventListener('pricing-modal:set-context', this.setContext.bind(this))\n  }\n\n  setContext(event) {\n    const { title, subtitle } = event.detail || {}\n    \n    if (title && this.hasTitleTarget) {\n      this.titleTarget.textContent = title\n    }\n    \n    if (subtitle && this.hasSubtitleTarget) {\n      this.subtitleTarget.textContent = subtitle\n      this.subtitleTarget.classList.remove('hidden')\n    }\n  }\n\n  resetContext() {\n    if (this.hasTitleTarget) {\n      this.titleTarget.textContent = this.defaultTitleValue\n    }\n    \n    if (this.hasSubtitleTarget) {\n      this.subtitleTarget.textContent = ''\n      this.subtitleTarget.classList.add('hidden')\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\n    \"option\", \"step1\", \"step2\", \"step3\",\n    \"exploreOption\", \"otherInput\", \"backButton\",\n    \"step3BackButton\", \"step3DoneButton\"\n  ]\n  static values = {\n    updateUrl: String,\n    intentSet: Boolean,\n    showExploreFollowUpFirst: Boolean\n  }\n\n  static STORAGE_KEY = 'gf_primary_intent'\n\n  connect() {\n    // Check localStorage first as a safeguard\n    const storedIntent = this.getStoredIntent()\n\n    // Show modal only if intent is not set in backend AND not in localStorage\n    if (!this.intentSetValue && !storedIntent) {\n      this.show()\n      if (this.showExploreFollowUpFirstValue) {\n        this.showStep2()\n      }\n    }\n  }\n\n  show() {\n    this.element.classList.remove('hidden')\n    document.body.style.overflow = 'hidden'\n  }\n\n  hide() {\n    this.element.classList.add('hidden')\n    document.body.style.overflow = 'auto'\n  }\n\n  getStoredIntent() {\n    try {\n      return localStorage.getItem(this.constructor.STORAGE_KEY)\n    } catch (e) {\n      // localStorage might be unavailable (private browsing, etc.)\n      console.warn('localStorage unavailable:', e)\n      return null\n    }\n  }\n\n  storeIntent(intent) {\n    try {\n      localStorage.setItem(this.constructor.STORAGE_KEY, intent)\n    } catch (e) {\n      console.warn('Failed to store intent in localStorage:', e)\n    }\n  }\n\n  async selectIntent(event) {\n    const button = event.currentTarget\n    const intent = button.dataset.intent\n\n    // Store in localStorage immediately as safeguard\n    this.storeIntent(intent)\n\n    // Track the intent as a user property in Amplitude\n    this.trackUserProperty(intent)\n\n    // Hide modal immediately for better UX\n    this.hide()\n\n    // Add loading state to button (visual feedback before hiding)\n    button.disabled = true\n    button.classList.add('opacity-75')\n\n    // Attempt to save to backend (fire and forget - localStorage is our safeguard)\n    try {\n      const csrfToken = document.querySelector('meta[name=\"csrf-token\"]')?.content\n\n      const response = await fetch(this.updateUrlValue, {\n        method: 'PATCH',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRF-Token': csrfToken,\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({ primary_intent: intent })\n      })\n\n      if (!response.ok) {\n        const data = await response.json()\n        console.error('Failed to save intent to backend:', data.error)\n        // Intent is still saved in localStorage, so user won't be prompted again\n      }\n    } catch (error) {\n      console.error('Error saving intent to backend:', error)\n      // Intent is still saved in localStorage, so user won't be prompted again\n    }\n  }\n\n  trackUserProperty(intent, exploreMarketsIntent = null, exploreMarketsIntentOther = null) {\n    // Map intent keys to user-friendly values for Amplitude\n    const intentLabels = {\n      'buy_property': 'Buy an Airbnb property',\n      'list_property': 'List my property on Airbnb',\n      'explore_markets': 'Explore Airbnb markets'\n    }\n\n    // Dispatch to amplitude controller to set user property\n    this.dispatch('trackUserProperty', {\n      prefix: null,\n      detail: {\n        name: 'user_primary_intent',\n        value: intent\n      }\n    })\n\n    // Also set a more readable version\n    this.dispatch('trackUserProperty', {\n      prefix: null,\n      detail: {\n        name: 'user_primary_intent_label',\n        value: intentLabels[intent] || intent\n      }\n    })\n\n    if (exploreMarketsIntent) {\n      this.dispatch('trackUserProperty', {\n        prefix: null,\n        detail: {\n          name: 'user_explore_markets_intent',\n          value: exploreMarketsIntent\n        }\n      })\n    }\n\n    if (exploreMarketsIntentOther) {\n      this.dispatch('trackUserProperty', {\n        prefix: null,\n        detail: {\n          name: 'user_explore_markets_intent_other',\n          value: exploreMarketsIntentOther\n        }\n      })\n    }\n  }\n\n  showStep2() {\n    if (this.hasStep1Target) this.step1Target.classList.add('hidden')\n    if (this.hasStep2Target) this.step2Target.classList.remove('hidden')\n    if (this.hasStep3Target) this.step3Target.classList.add('hidden')\n  }\n\n  showStep3() {\n    if (this.hasStep1Target) this.step1Target.classList.add('hidden')\n    if (this.hasStep2Target) this.step2Target.classList.add('hidden')\n    if (this.hasStep3Target) {\n      this.step3Target.classList.remove('hidden')\n      if (this.hasOtherInputTarget) {\n        this.otherInputTarget.value = ''\n        this.otherInputTarget.focus()\n      }\n    }\n  }\n\n  hideStep2() {\n    if (this.hasStep1Target) this.step1Target.classList.remove('hidden')\n    if (this.hasStep2Target) this.step2Target.classList.add('hidden')\n    if (this.hasStep3Target) this.step3Target.classList.add('hidden')\n    if (this.hasOtherInputTarget) this.otherInputTarget.value = ''\n  }\n\n  showExploreMarketsFollowUp(event) {\n    event.preventDefault()\n    this.showStep2()\n  }\n\n  async submitExploreMarketsIntent(event) {\n    const button = event.currentTarget\n    const intent = button.dataset.exploreIntent\n    button.disabled = true\n    button.classList.add('opacity-75')\n    await this.submitExploreMarketsPayload(intent, null)\n  }\n\n  showOtherStep(event) {\n    event.preventDefault()\n    this.showStep3()\n  }\n\n  backToStep1() {\n    this.hideStep2()\n  }\n\n  backToStep2() {\n    if (this.hasStep2Target) this.step2Target.classList.remove('hidden')\n    if (this.hasStep3Target) this.step3Target.classList.add('hidden')\n    if (this.hasOtherInputTarget) this.otherInputTarget.value = ''\n  }\n\n  updateOtherDoneButton() {\n    if (!this.hasStep3DoneButtonTarget || !this.hasOtherInputTarget) return\n    const hasText = this.otherInputTarget.value.trim().length > 0\n    this.step3DoneButtonTarget.disabled = !hasText\n  }\n\n  submitOtherOnEnter(event) {\n    if (event.key === 'Enter') {\n      event.preventDefault()\n      this.submitOther(event)\n    }\n  }\n\n  async submitOther(event) {\n    event.preventDefault()\n    const text = this.hasOtherInputTarget ? this.otherInputTarget.value.trim() : ''\n    if (!text) return\n    if (this.hasStep3DoneButtonTarget) {\n      this.step3DoneButtonTarget.disabled = true\n      this.step3DoneButtonTarget.classList.add('opacity-75')\n    }\n    await this.submitExploreMarketsPayload('other', text)\n  }\n\n  async submitExploreMarketsPayload(exploreIntent, otherText = null) {\n    const payload = {\n      primary_intent: 'explore_markets',\n      explore_markets_intent: exploreIntent\n    }\n    if (exploreIntent === 'other' && otherText) {\n      payload.explore_markets_intent_other = otherText\n    }\n\n    this.storeIntent('explore_markets')\n    this.trackUserProperty('explore_markets', exploreIntent, exploreIntent === 'other' ? otherText : null)\n\n    try {\n      const csrfToken = document.querySelector('meta[name=\"csrf-token\"]')?.content\n      const response = await fetch(this.updateUrlValue, {\n        method: 'PATCH',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRF-Token': csrfToken,\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify(payload)\n      })\n\n      if (response.ok) {\n        this.hide()\n      } else {\n        const data = await response.json()\n        console.error('Failed to save explore markets intent:', data.error)\n        this.exploreOptionTargets?.forEach((el) => {\n          el.disabled = false\n          el.classList.remove('opacity-75')\n        })\n        if (this.hasStep3DoneButtonTarget) {\n          this.step3DoneButtonTarget.disabled = false\n          this.step3DoneButtonTarget.classList.remove('opacity-75')\n        }\n      }\n    } catch (error) {\n      console.error('Error saving explore markets intent:', error)\n      this.exploreOptionTargets?.forEach((el) => {\n        el.disabled = false\n        el.classList.remove('opacity-75')\n      })\n      if (this.hasStep3DoneButtonTarget) {\n        this.step3DoneButtonTarget.disabled = false\n        this.step3DoneButtonTarget.classList.remove('opacity-75')\n      }\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    labels: Array,\n    percentages: Array\n  }\n\n  connect() {\n    this.chart = null\n    this.initializeChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  initializeChart() {\n    const canvas = this.hasCanvasTarget ? this.canvasTarget : this.element\n    const ctx = canvas.getContext('2d')\n\n    // Ensure percentages are numbers\n    const percentages = this.percentagesValue.map(val => parseFloat(val))\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: this.labelsValue,\n        datasets: [{\n          type: 'bar',\n          data: percentages,\n          barThickness: 8,\n          borderRadius: 4,\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const { ctx, chartArea } = chart\n\n            if (!chartArea) {\n              return\n            }\n            return getGradient(ctx, chartArea)\n          }\n        }]\n      },\n      options: {\n        indexAxis: 'y',\n        maintainAspectRatio: false,\n        plugins: {\n          legend: { display: false },\n          tooltip: {\n            callbacks: {\n              label: function(context) {\n                return context.parsed.x.toFixed(1) + '%'\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            display: true,\n            grid: {\n              display: false\n            },\n            ticks: {\n              callback: function(value) {\n                return value + '%'\n              }\n            }\n          },\n          y: {\n            grid: {\n              display: false\n            }\n          }\n        }\n      }\n    })\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    labels: Array,\n    baseData: Array,\n    detailedRatings: Array\n  }\n\n  connect() {\n    this.chart = null\n    this.initializeChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  initializeChart() {\n    const canvas = this.hasCanvasTarget ? this.canvasTarget : this.element\n    const ctx = canvas.getContext('2d')\n\n    // Stacked 4.x segments: same primary as other stars \u2192 progressively lighter\n    const colors = ['#1F6F54', '#3D8A6E', '#5FA88A', '#8FCBB0', '#B5DEC9', '#D6EEE3']\n\n    // Create main dataset - ensure percentages are numbers\n    const datasets = [\n      {\n        label: 'Main',\n        data: this.baseDataValue.map(val => parseFloat(val)),\n        barThickness: 16,\n        borderRadius: 4,\n        backgroundColor: '#1F6F54'\n      }\n    ]\n\n    // Add detailed rating datasets (for 4.x star ratings)\n    this.detailedRatingsValue.forEach((ratingData, index) => {\n      const data = []\n      // The detailed ratings stack on the second label (index 1, which is the 4-star rating)\n      data[1] = parseFloat(ratingData.percentage)\n\n      datasets.push({\n        label: ratingData.rating.toString(),\n        data: data,\n        barThickness: 16,\n        borderRadius: 4,\n        backgroundColor: colors[Math.min(index + 1, colors.length - 1)]\n      })\n    })\n\n    this.chart = new Chart(ctx, {\n      type: 'bar',\n      data: {\n        labels: this.labelsValue,\n        datasets: datasets\n      },\n      options: {\n        indexAxis: 'y',\n        maintainAspectRatio: false,\n        plugins: {\n          legend: { display: false },\n          tooltip: {\n            callbacks: {\n              title: function([context]) {\n                if (context.label.startsWith('4')) {\n                  const stars = context.label.split(' ')[1]\n                  return context.datasetIndex === 0\n                    ? context.label\n                    : `${context.dataset.label} ${stars}`\n                } else {\n                  return context.label\n                }\n              },\n              label: function(context) {\n                return context.formattedValue + '%'\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            stacked: true,\n            grid: {\n              display: false\n            },\n            ticks: {\n              callback: function(value) {\n                return value + '%'\n              }\n            }\n          },\n          y: {\n            stacked: true,\n            grid: {\n              display: false\n            }\n          }\n        }\n      }\n    })\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\nimport AutocompleteController from \"controllers/autocomplete_controller\"\nimport { mergeRecentSearches } from \"../lib/merge_recent_searches\"\n\nexport default class extends Controller {\n  static targets = [\"container\", \"empty\", \"clearButton\", \"calculatorPayload\"]\n  static values = {\n    calculator: { type: Array, default: [] }\n  }\n\n  connect() {\n    this.displayRecentSearches()\n\n    this.boundRefresh = this.refresh.bind(this)\n    window.addEventListener(\"recentSearchesUpdated\", this.boundRefresh)\n  }\n\n  disconnect() {\n    window.removeEventListener(\"recentSearchesUpdated\", this.boundRefresh)\n  }\n\n  calculatorItems() {\n    if (this.hasCalculatorPayloadTarget) {\n      try {\n        const parsed = JSON.parse(this.calculatorPayloadTarget.textContent)\n        if (Array.isArray(parsed)) return parsed\n      } catch {\n        // fall through\n      }\n    }\n\n    const value = this.calculatorValue\n    if (Array.isArray(value)) return value\n    if (typeof value === \"string\" && value.length > 0) {\n      try {\n        const parsed = JSON.parse(value)\n        return Array.isArray(parsed) ? parsed : []\n      } catch {\n        return []\n      }\n    }\n    return []\n  }\n\n  displayRecentSearches() {\n    const insights = AutocompleteController.getRecentActivity()\n    const calculator = this.calculatorItems()\n    const recentSearches = mergeRecentSearches({\n      insights,\n      calculator,\n      limit: 5\n    })\n\n    if (recentSearches.length === 0) {\n      if (this.hasEmptyTarget) {\n        this.emptyTarget.classList.remove(\"hidden\")\n      }\n      if (this.hasContainerTarget) {\n        this.containerTarget.classList.add(\"hidden\")\n      }\n      if (this.hasClearButtonTarget) {\n        this.clearButtonTarget.classList.add(\"hidden\")\n      }\n      return\n    }\n\n    if (this.hasEmptyTarget) {\n      this.emptyTarget.classList.add(\"hidden\")\n    }\n    if (this.hasClearButtonTarget) {\n      this.clearButtonTarget.classList.toggle(\"hidden\", insights.length === 0)\n    }\n    if (this.hasContainerTarget) {\n      this.containerTarget.classList.remove(\"hidden\")\n      this.containerTarget.innerHTML = \"\"\n\n      recentSearches.forEach((search, index) => {\n        const itemHtml = this.createSearchItemHtml(search, index === recentSearches.length - 1)\n        this.containerTarget.insertAdjacentHTML(\"beforeend\", itemHtml)\n      })\n    }\n  }\n\n  createSearchItemHtml(search, isLast) {\n    const borderClass = isLast ? \"\" : \"border-b border-gray-100\"\n    const rowClass = `flex items-center justify-between py-2.5 px-4 rounded-lg hover:bg-gray-50 transition-colors ${borderClass}`\n\n    if (search.type === \"calculator\") {\n      return `\n        <a href=\"${search.url}\" class=\"${rowClass}\" data-turbo=\"false\">\n          <div class=\"flex items-center flex-1 min-w-0\">\n            <div class=\"flex-shrink-0 w-7 h-7 bg-[#E4F0EA] rounded-lg flex items-center justify-center mr-2.5\">\n              <span class=\"iconify mdi--calculator text-primary w-3.5 h-3.5\"></span>\n            </div>\n            <div class=\"flex-1 min-w-0\">\n              <div class=\"text-sm font-medium text-gray-900 truncate\">${this.escapeHtml(search.name)}</div>\n              ${search.subtitle ? `<div class=\"text-xs text-gray-500 truncate\">${this.escapeHtml(search.subtitle)}</div>` : \"\"}\n            </div>\n          </div>\n          <span class=\"iconify mdi--chevron-right text-slate-400 flex-shrink-0 w-4 h-4\"></span>\n        </a>\n      `\n    }\n\n    let locationName = search.name\n    if (search.t === \"n\" && search.locality_name) {\n      locationName = `${search.name}, ${search.locality_name}`\n    } else if (search.region_name) {\n      locationName = `${search.name}, ${search.region_name}`\n    }\n\n    let subtitle = \"\"\n    if (search.t === \"n\") {\n      subtitle = search.region_name\n      if (search.country_name) {\n        subtitle += `, ${search.country_name}`\n      }\n    } else {\n      if (search.crawling_area_name) {\n        subtitle = search.crawling_area_name\n      }\n      if (search.country_name) {\n        subtitle = subtitle ? `${subtitle}, ${search.country_name}` : search.country_name\n      }\n    }\n\n    const icon = this.getPolygonTypeIcon(search.t)\n    const currentHost = window.location.host\n    let targetHost\n    if (currentHost.includes(\".\")) {\n      targetHost = currentHost.replace(/^[^.]*\\./, \"app.\")\n    } else {\n      targetHost = `app.${currentHost}`\n    }\n    const protocol = window.location.protocol\n    const targetUrl = `${protocol}//${targetHost}/insights/${search.slug}`\n\n    return `\n      <a href=\"${targetUrl}\" class=\"${rowClass}\">\n        <div class=\"flex items-center flex-1 min-w-0\">\n          <div class=\"flex-shrink-0 w-7 h-7 bg-[#E4F0EA] rounded-lg flex items-center justify-center mr-2.5\">\n            <span class=\"iconify ${icon} text-primary w-3.5 h-3.5\"></span>\n          </div>\n          <div class=\"flex-1 min-w-0\">\n            <div class=\"text-sm font-medium text-gray-900 truncate\">${this.escapeHtml(locationName)}</div>\n            ${subtitle ? `<div class=\"text-xs text-gray-500 truncate\">${this.escapeHtml(subtitle)}</div>` : \"\"}\n          </div>\n        </div>\n        <span class=\"iconify mdi--chevron-right text-slate-400 flex-shrink-0 w-4 h-4\"></span>\n      </a>\n    `\n  }\n\n  getPolygonTypeIcon(type) {\n    const icons = {\n      n: \"mdi--home-city-outline\",\n      l: \"mdi--map-marker-outline\",\n      ca: \"mdi--map-outline\",\n      r: \"mdi--earth\"\n    }\n    return icons[type] || \"mdi--map-marker-outline\"\n  }\n\n  escapeHtml(text) {\n    const div = document.createElement(\"div\")\n    div.textContent = text || \"\"\n    return div.innerHTML\n  }\n\n  refresh() {\n    this.displayRecentSearches()\n  }\n\n  clearAll(event) {\n    event.preventDefault()\n\n    if (confirm(\"Clear all recent searches?\")) {\n      AutocompleteController.clearRecentActivity()\n      this.displayRecentSearches()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    buckets: Array,\n    listingRevenue: Number,\n    color: String,\n    currencySymbol: String\n  }\n\n  connect() {\n    this.initChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n    }\n  }\n\n  initChart() {\n    const ctx = this.element.getContext('2d')\n\n    // Format bucket data for Chart.js\n    const buckets = this.bucketsValue\n    const data = []\n\n    // Create data points with x value as bucket center\n    buckets.forEach(bucket => {\n      data.push({\n        x: (bucket[0] + bucket[1]) / 2,\n        y: bucket[2],\n        min: bucket[0],\n        max: bucket[1]\n      })\n    })\n\n    const bucketSize = buckets[1][0] - buckets[0][0]\n\n    // Find which bucket contains our listing\n    const listingRevenue = this.listingRevenueValue\n\n    let highlightColors = Array(buckets.length).fill(this.colorValue + '80') // Default transparency\n\n    // Find which bucket this listing belongs to\n    const listingBucketIndex = buckets.findIndex(bucket =>\n      listingRevenue >= bucket[0] && listingRevenue < bucket[1]\n    )\n\n    // Highlight the bucket containing the current listing\n    if (listingBucketIndex >= 0) {\n      highlightColors[listingBucketIndex] = this.colorValue\n    }\n\n    const currencySymbol = this.currencySymbolValue\n\n    this.chart = new Chart(ctx, {\n      type: 'bar',\n      data: {\n        datasets: [{\n          label: 'Number of Listings',\n          data: data,\n          backgroundColor: highlightColors,\n          borderColor: this.colorValue,\n          borderWidth: 1,\n          barPercentage: 1,\n          categoryPercentage: 1,\n          borderRadius: 5\n        }]\n      },\n      options: {\n        responsive: true,\n        maintainAspectRatio: false,\n        interaction: {\n          intersect: false,\n          mode: 'index',\n        },\n        scales: {\n          y: {\n            beginAtZero: true,\n            title: {\n              display: true,\n              text: 'Number of Listings'\n            },\n            ticks: {\n              precision: 0 // Only show whole numbers\n            }\n          },\n          x: {\n            type: 'linear',\n            offset: false,\n            grid: {\n              offset: false\n            },\n            title: {\n              display: true,\n              text: 'Revenue Range'\n            },\n            ticks: {\n              stepSize: bucketSize\n            }\n          }\n        },\n        plugins: {\n          legend: {\n            display: false\n          },\n          tooltip: {\n            callbacks: {\n              title: function(tooltipItems) {\n                const item = tooltipItems[0]\n                const datapoint = item.dataset.data[item.dataIndex]\n                return `Revenue: ${currencySymbol}${datapoint.min} - ${currencySymbol}${datapoint.max}`\n              },\n              label: function(context) {\n                return `Listings: ${context.raw.y}`\n              },\n              afterLabel: function(context) {\n                const bucketIndex = context.dataIndex\n                return listingBucketIndex === bucketIndex ?\n                  `Your listing: ${currencySymbol}${listingRevenue}` : ''\n              }\n            }\n          }\n        }\n      }\n    })\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nString.prototype.capitalize = function() {\n  return this.replace(/(?:^|\\s)\\S/g, function(a) { return a.toUpperCase(); });\n};\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    chartDataSeries: Object, // Object with multiple series { top_performers: [[date, value]], strong_performers: [[date, value]], ... }\n    locale: String,\n    today: Number,\n    currencyCode: { type: String, default: 'USD' },\n    selectedTier: { type: String, default: 'market_average' },\n    sortByCalendarMonth: { type: Boolean, default: false },\n    tooltipMonthOnly: { type: Boolean, default: false },\n    accentTheme: { type: String, default: 'blue' }\n  }\n\n  static accentClasses = {\n    blue: {\n      active: ['bg-[#E4F0EA]', 'border-[#1F6F54]', 'text-[#0C1A14]', 'shadow-sm'],\n      inactive: ['bg-gray-50', 'border-gray-200', 'text-gray-500', 'shadow-sm', 'hover:shadow-md']\n    },\n    teal: {\n      active: ['bg-secondary-light', 'border-slate-200', 'text-secondary-dark', 'shadow-sm'],\n      inactive: ['bg-gray-50', 'border-gray-200', 'text-gray-500', 'shadow-sm', 'hover:shadow-md']\n    }\n  }\n\n  static chartAccents = {\n    blue: { start: '#1F6F54', end: '#8FCBB0', border: '#1F6F54', future: 'rgba(31, 111, 84, 0.3)' },\n    teal: { start: '#0d9488', end: '#2dd4bf', border: '#14b8a6', future: 'rgba(45, 212, 191, 0.3)' }\n  }\n\n  connect() {\n    this.chart = null\n    this.chartDataSeries = this.buildChartDataSeries()\n    // Calculate global min/max across all tiers for fixed scale\n    this.calculateGlobalScale()\n    this.initializeChart()\n  }\n\n  buildChartDataSeries() {\n    const series = {}\n    Object.entries(this.chartDataSeriesValue).forEach(([key, data]) => {\n      series[key] = this.sortChartDataByCalendarMonth(data)\n    })\n    return series\n  }\n\n  sortChartDataByCalendarMonth(data) {\n    if (!this.sortByCalendarMonthValue || !Array.isArray(data)) return data\n    return [...data].sort((a, b) => {\n      return new Date(a[0] + 'T00:00:00Z').getUTCMonth() - new Date(b[0] + 'T00:00:00Z').getUTCMonth()\n    })\n  }\n\n  formatTooltipTitle(dateString) {\n    const date = new Date(dateString + 'T00:00:00Z')\n    const options = { month: 'long', timeZone: 'UTC' }\n    if (!this.tooltipMonthOnlyValue) {\n      options.year = 'numeric'\n    }\n    return date.toLocaleString(this.localeValue, options)\n  }\n\n  calculateGlobalScale() {\n    let globalMax = -Infinity\n\n    // Iterate through all tier data series to find the maximum value\n    Object.values(this.chartDataSeries).forEach(seriesData => {\n      if (Array.isArray(seriesData)) {\n        seriesData.forEach(([date, value]) => {\n          if (typeof value === 'number') {\n            globalMax = Math.max(globalMax, value)\n          }\n        })\n      }\n    })\n\n    // Always start at 0, add padding (5%) to the max\n    this.globalMin = 0\n    this.globalMax = globalMax * 1.05\n  }\n\n  selectTier(event) {\n    const tier = event.currentTarget.dataset.tier\n    if (tier === this.selectedTierValue) return\n\n    this.selectedTierValue = tier\n    this.updateActiveButton()\n    this.updateChart()\n  }\n\n  updateActiveButton() {\n    const theme = this.constructor.accentClasses[this.accentThemeValue] || this.constructor.accentClasses.blue\n    const buttons = this.element.querySelectorAll('.revenue-tier-selector')\n    buttons.forEach(button => {\n      const buttonTier = button.dataset.tier\n      button.classList.remove(...theme.active, ...theme.inactive)\n      if (buttonTier === this.selectedTierValue) {\n        button.classList.add(...theme.active)\n      } else {\n        button.classList.add(...theme.inactive)\n      }\n    })\n  }\n\n  updateChart() {\n    const chartData = this.chartDataSeries[this.selectedTierValue]\n    if (!chartData || !this.chart) return\n\n    // Update chart data\n    this.chart.data.labels = chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(this.localeValue, { month: 'short', timeZone: 'UTC' }).capitalize())\n    this.chart.data.datasets[0].data = chartData.map(([, value]) => value)\n\n    // Update tooltip title\n    this.chart.options.plugins.tooltip.callbacks.title = (tooltipItems) => {\n      const dataIndex = tooltipItems[0].dataIndex\n      const dateString = chartData[dataIndex][0]\n      return this.formatTooltipTitle(dateString)\n    }\n\n    this.chart.update()\n  }\n\n  initializeChart() {\n    const canvasElement = this.canvasTarget\n    const ctx = canvasElement.getContext('2d')\n    const chartData = this.chartDataSeries[this.selectedTierValue] || this.chartDataSeries['market_average']\n    const dates = chartData.map(([date]) => new Date(date))\n    const todayValue = this.todayValue\n    const localeValue = this.localeValue\n    const currencyCodeValue = this.currencyCodeValue\n\n    let width, height, gradient\n\n    const accent = this.constructor.chartAccents[this.accentThemeValue] || this.constructor.chartAccents.blue\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, accent.start)\n        gradient.addColorStop(1, accent.end)\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(localeValue, { month: 'short', timeZone: 'UTC' }).capitalize()),\n        datasets: [{\n          type: 'bar',\n          data: chartData.map(([, value]) => value),\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const {ctx, chartArea} = chart\n            if (!chartArea) {\n              return accent.end\n            }\n            const gradient = getGradient(ctx, chartArea)\n            const currentDate = dates[context.dataIndex]\n            const now = new Date(todayValue)\n            if (currentDate >= now) {\n              return accent.future\n            }\n            return gradient\n          },\n          borderColor: accent.border,\n          borderWidth: 0,\n          borderRadius: 4,\n          borderSkipped: false\n        }]\n      },\n      options: {\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: false\n          },\n          tooltip: {\n            callbacks: {\n              title: (tooltipItems) => {\n                const dataIndex = tooltipItems[0].dataIndex\n                const dateString = chartData[dataIndex][0]\n                return this.formatTooltipTitle(dateString)\n              },\n              label: (context) => {\n                const value = context.raw\n                return new Intl.NumberFormat(localeValue, {\n                  style: 'currency',\n                  currency: currencyCodeValue,\n                  minimumFractionDigits: 0,\n                  maximumFractionDigits: 0\n                }).format(value)\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            grid: {\n              display: false\n            }\n          },\n          y: {\n            min: this.globalMin,\n            max: this.globalMax,\n            grid: {\n              drawOnChartArea: true\n            },\n            ticks: {\n              callback: (value) => {\n                return new Intl.NumberFormat(localeValue, {\n                  style: 'currency',\n                  currency: currencyCodeValue,\n                  minimumFractionDigits: 0,\n                  maximumFractionDigits: 0,\n                  notation: 'compact'\n                }).format(value)\n              }\n            }\n          }\n        }\n      }\n    })\n\n    // Set initial active button\n    this.updateActiveButton()\n  }\n}\n", " import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    threshold: { type: Number, default: 0.1 },\n    rootMargin: { type: String, default: \"0px 0px -20px 0px\" }\n  }\n\n  connect() {\n    this.observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            entry.target.classList.add(\"sr-visible\")\n            this.observer.unobserve(entry.target)\n          }\n        })\n      },\n      { threshold: this.thresholdValue, rootMargin: this.rootMarginValue }\n    )\n\n    this.revealElements = this.element.querySelectorAll(\"[data-sr]\")\n    this.revealElements.forEach((el) => this.observer.observe(el))\n  }\n\n  disconnect() {\n    if (this.observer) this.observer.disconnect()\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"submitButton\", \"emailInput\", \"passwordInput\", \"passwordFeedback\", \"errorContainer\"]\n\n  connect() {\n    this.validateForm()\n  }\n\n  validatePassword() {\n    this.validateForm()\n  }\n\n  validateForm() {\n    if (!this.hasPasswordInputTarget || !this.hasSubmitButtonTarget) return\n\n    const currentLength = this.passwordInputTarget.value.length\n    const isPasswordValid = this.passwordInputTarget.validity.valid\n    this.submitButtonTarget.disabled = !this.element.checkValidity()\n\n    if (!this.hasPasswordFeedbackTarget) return\n\n    if (currentLength === 0) {\n      this.passwordFeedbackTarget.textContent = \"\"\n      this.passwordFeedbackTarget.classList.remove(\"text-red-600\", \"text-green-600\")\n      return\n    }\n\n    const template = isPasswordValid\n      ? this.passwordFeedbackTarget.dataset.validTemplate\n      : this.passwordFeedbackTarget.dataset.invalidTemplate\n\n    this.passwordFeedbackTarget.textContent = template.replace(\"%{current}\", currentLength)\n    this.passwordFeedbackTarget.classList.toggle(\"text-red-600\", !isPasswordValid)\n    this.passwordFeedbackTarget.classList.toggle(\"text-green-600\", isPasswordValid)\n  }\n\n  submitOnEnter(event) {\n    if (event.key !== \"Enter\") return\n\n    event.preventDefault()\n    this.validateForm()\n\n    if (this.element.checkValidity()) {\n      this.element.requestSubmit()\n      return\n    }\n\n    this.element.reportValidity()\n  }\n\n  disableButton(event) {\n    this.validateForm()\n\n    if (!this.element.checkValidity()) {\n      event.preventDefault()\n      this.element.reportValidity()\n      return\n    }\n\n    // Disable the submit button to prevent multiple submissions\n    if (this.hasSubmitButtonTarget) {\n      this.submitButtonTarget.disabled = true\n\n      // Store original content\n      this.originalContent = this.submitButtonTarget.innerHTML\n\n      // Add loading spinner\n      this.submitButtonTarget.innerHTML = `\n        <svg class=\"animate-spin h-5 w-5 mr-2\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n          <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n          <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n        </svg>\n        Creating account...\n      `\n    }\n  }\n\n  handleSubmitEnd(event) {\n    if (event.detail.success) return\n    if (!this.hasSubmitButtonTarget) return\n\n    this.submitButtonTarget.disabled = false\n    if (this.originalContent) {\n      this.submitButtonTarget.innerHTML = this.originalContent\n    }\n    this.validateForm()\n  }\n\n  clearError() {\n    if (this.hasErrorContainerTarget && this.errorContainerTarget.textContent.trim().length > 0) {\n      this.errorContainerTarget.innerHTML = \"\"\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"panel\", \"overlay\"]\n\n  connect() {\n    this.isOpen = false\n    // Handle escape key\n    this.boundHandleEscape = this.handleEscape.bind(this)\n  }\n\n  disconnect() {\n    document.removeEventListener('keydown', this.boundHandleEscape)\n  }\n\n  open() {\n    this.isOpen = true\n    this.panelTarget.classList.remove('translate-x-full')\n    this.overlayTarget.classList.remove('hidden')\n    document.body.style.overflow = 'hidden'\n    document.addEventListener('keydown', this.boundHandleEscape)\n\n    // Trigger resize event for map after panel is visible\n    setTimeout(() => {\n      window.dispatchEvent(new Event('resize'))\n    }, 300)\n  }\n\n  close() {\n    this.isOpen = false\n    this.panelTarget.classList.add('translate-x-full')\n    this.overlayTarget.classList.add('hidden')\n    document.body.style.overflow = ''\n    document.removeEventListener('keydown', this.boundHandleEscape)\n  }\n\n  toggle(event) {\n    event.preventDefault()\n    if (this.isOpen) {\n      this.close()\n    } else {\n      this.open()\n    }\n  }\n\n  handleEscape(event) {\n    if (event.key === 'Escape' && this.isOpen) {\n      this.close()\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.element.addEventListener('click', this.smoothScroll.bind(this))\n  }\n\n  smoothScroll(event) {\n    event.preventDefault()\n    const targetId = this.element.getAttribute('href')\n    const targetElement = document.querySelector(targetId)\n\n    if (targetElement) {\n      targetElement.scrollIntoView({\n        behavior: 'smooth',\n        block: 'start'\n      })\n    }\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"header\", \"row\"]\n\n  connect() {\n    this.sortColumn = this.element.dataset.sortableTableDefaultSortValue || \"name\"\n    this.sortDirection = this.element.dataset.sortableTableDefaultDirectionValue || \"asc\"\n    this.updateHeaderIndicators()\n    this.sortRows()\n  }\n\n  sort(event) {\n    const column = event.currentTarget.dataset.sortKey\n    if (!column) return\n\n    if (this.sortColumn === column) {\n      this.sortDirection = this.sortDirection === \"asc\" ? \"desc\" : \"asc\"\n    } else {\n      this.sortColumn = column\n      this.sortDirection = column === \"name\" ? \"asc\" : \"desc\"\n    }\n\n    this.sortRows()\n    this.updateHeaderIndicators()\n  }\n\n  sortRows() {\n    if (!this.hasRowTarget) return\n\n    const column = this.sortColumn\n    const direction = this.sortDirection === \"asc\" ? 1 : -1\n    const datasetKey = this.datasetKeyFor(column)\n    const tbody = this.rowTargets[0].parentNode\n\n    const rows = Array.from(this.rowTargets).sort((left, right) => {\n      const leftValue = left.dataset[datasetKey]\n      const rightValue = right.dataset[datasetKey]\n      const missingComparison = this.compareMissing(leftValue, rightValue)\n\n      if (missingComparison !== 0) return missingComparison\n\n      return this.compareValues(leftValue, rightValue, column) * direction\n    })\n\n    rows.forEach((row) => tbody.appendChild(row))\n  }\n\n  compareMissing(leftValue, rightValue) {\n    const leftMissing = this.isMissing(leftValue)\n    const rightMissing = this.isMissing(rightValue)\n\n    if (leftMissing && rightMissing) return 0\n    if (leftMissing) return 1\n    if (rightMissing) return -1\n\n    return 0\n  }\n\n  compareValues(leftValue, rightValue, column) {\n    if (column === \"name\") {\n      return leftValue.localeCompare(rightValue, undefined, { sensitivity: \"base\" })\n    }\n\n    return Number(leftValue) - Number(rightValue)\n  }\n\n  isMissing(value) {\n    return value === undefined || value === \"\"\n  }\n\n  datasetKeyFor(column) {\n    const suffix = column.replace(/_([a-z])/g, (_, char) => char.toUpperCase())\n    return `sort${suffix.charAt(0).toUpperCase()}${suffix.slice(1)}`\n  }\n\n  updateHeaderIndicators() {\n    this.headerTargets.forEach((header) => {\n      const isActive = header.dataset.sortKey === this.sortColumn\n      const icon = header.querySelector(\"[data-sort-icon]\")\n\n      header.classList.toggle(\"text-stone-600\", isActive)\n      header.classList.toggle(\"text-stone-400\", !isActive)\n\n      if (!icon) return\n\n      icon.classList.remove(\"mdi--unfold-more-horizontal\", \"mdi--arrow-up\", \"mdi--arrow-down\")\n      icon.classList.toggle(\"opacity-100\", isActive)\n      icon.classList.toggle(\"opacity-40\", !isActive)\n      icon.classList.add(this.iconForColumn(isActive))\n    })\n  }\n\n  iconForColumn(isActive) {\n    if (!isActive) return \"mdi--unfold-more-horizontal\"\n\n    return this.sortDirection === \"asc\" ? \"mdi--arrow-up\" : \"mdi--arrow-down\"\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    // Dispatch event when story navigation loads\n    this.dispatch('storyNavLoaded', { bubbles: true })\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    activeSection: String\n  }\n\n  static targets = [\"tab\"]\n\n  connect() {\n    // Set initial active tab\n    this.setInitialActiveTab()\n\n    // Intercept clicks on tab links to update the URL and tab state\n    this.boundHandleClick = this.handleClick.bind(this)\n    this.element.addEventListener('click', this.boundHandleClick, true)\n\n    // Scroll active tab into view (for mobile navigation)\n    // Use a small delay to ensure DOM is fully rendered\n    setTimeout(() => {\n      this.scrollActiveTabIntoView()\n    }, 150)\n\n    // Listen for turbo frame loads to scroll active tab when navigation updates\n    this.boundHandleFrameLoad = this.handleFrameLoad.bind(this)\n    document.addEventListener('turbo:frame-load', this.boundHandleFrameLoad)\n\n    // Listen for programmatic tab switch events\n    this.boundHandleTabSwitch = this.handleTabSwitch.bind(this)\n    window.addEventListener('story:switchTab', this.boundHandleTabSwitch)\n\n    // Listen for URL sync events (from popstate handler)\n    this.boundHandleSyncFromUrl = this.handleSyncFromUrl.bind(this)\n    window.addEventListener('story:syncFromUrl', this.boundHandleSyncFromUrl)\n  }\n\n  disconnect() {\n    this.element.removeEventListener('click', this.boundHandleClick, true)\n    if (this.boundHandleFrameLoad) {\n      document.removeEventListener('turbo:frame-load', this.boundHandleFrameLoad)\n    }\n    if (this.boundHandleTabSwitch) {\n      window.removeEventListener('story:switchTab', this.boundHandleTabSwitch)\n    }\n    if (this.boundHandleSyncFromUrl) {\n      window.removeEventListener('story:syncFromUrl', this.boundHandleSyncFromUrl)\n    }\n  }\n\n  setInitialActiveTab() {\n    // Find the active tab based on aria-selected or active class\n    const activeTab = this.tabTargets.find(tab =>\n      tab.getAttribute('aria-selected') === 'true' ||\n      tab.classList.contains('active')\n    )\n\n    if (activeTab) {\n      this.activateTab(activeTab)\n    } else {\n      console.warn('[story-tabs] No active tab found on initial load')\n    }\n  }\n\n  activateTab(tabElement) {\n    // Get the panel ID from the tab's aria-controls or data-turbo-frame\n    const panelId = tabElement.getAttribute('aria-controls') ||\n                    tabElement.getAttribute('data-turbo-frame')\n\n    if (!panelId) {\n      console.warn('[story-tabs] No panel ID found for tab:', tabElement.id)\n      return\n    }\n\n    // Get all panel IDs from tabs\n    const allPanelIds = this.tabTargets.map(tab =>\n      tab.getAttribute('aria-controls') || tab.getAttribute('data-turbo-frame')\n    ).filter(Boolean)\n\n    // Hide all panels (add hidden class)\n    allPanelIds.forEach(id => {\n      const panel = document.getElementById(id)\n      if (panel) {\n        panel.classList.add('hidden')\n        panel.classList.remove('active')\n      }\n    })\n\n    // Show the active panel (remove hidden class)\n    // The panel IS the turbo-frame element\n    const activePanel = document.getElementById(panelId)\n    if (activePanel) {\n      activePanel.classList.remove('hidden')\n      activePanel.classList.add('active')\n\n      // Load the frame content if needed\n      if (activePanel.tagName === 'TURBO-FRAME') {\n        // Check if frame has content (not just loading spinner)\n        const hasRealContent = activePanel.querySelector('section:not(.animate-spin)') ||\n                              activePanel.innerHTML.trim().length > 200 // Has substantial content\n\n        if (!hasRealContent) {\n          // Frame needs to load - get URL from the corresponding tab link\n          const tabLink = this.tabTargets.find(tab => {\n            const tabPanelId = tab.getAttribute('aria-controls')\n            return tabPanelId === panelId\n          })\n\n          if (tabLink && tabLink.href && tabLink.href !== '#' && tabLink.href !== '# ') {\n            // Set src to trigger frame load (Turbo will load it when frame becomes visible)\n            activePanel.src = tabLink.href\n          }\n        }\n      }\n    } else {\n      console.warn('[story-tabs] Panel not found:', panelId)\n    }\n\n    // Check if this is a mobile tab (by checking if ID contains '-mobile')\n    const isMobileTab = tabElement.id && tabElement.id.includes('-mobile')\n\n    // Deactivate all tabs\n    this.tabTargets.forEach(tab => {\n      tab.setAttribute('aria-selected', 'false')\n      const isTabMobile = tab.id && tab.id.includes('-mobile')\n\n      if (isTabMobile) {\n        tab.classList.remove('active', 'text-primary', 'border-primary')\n        tab.classList.add('text-slate-600', 'border-transparent')\n      } else {\n        tab.classList.remove('active', 'bg-blue-50', 'text-blue-600', 'font-semibold')\n        tab.classList.add('text-slate-600')\n        tab.style.backgroundColor = ''\n        tab.style.color = ''\n\n        const icon = tab.querySelector('.iconify')\n        if (icon) {\n          icon.classList.remove('text-blue-600')\n          icon.style.color = ''\n        }\n      }\n    })\n\n    // Activate the selected tab\n    tabElement.setAttribute('aria-selected', 'true')\n    if (isMobileTab) {\n      tabElement.classList.add('active', 'text-primary', 'border-primary')\n      tabElement.classList.remove('text-slate-600', 'border-transparent')\n\n      this.scrollTabIntoView(tabElement)\n    } else {\n      tabElement.classList.add('active', 'font-semibold')\n      tabElement.classList.remove('text-slate-600')\n      tabElement.style.backgroundColor = '#E4F0EA'\n      tabElement.style.color = '#1F6F54'\n\n      const icon = tabElement.querySelector('.iconify')\n      if (icon) {\n        icon.style.color = '#1F6F54'\n      }\n    }\n\n    // Handle map resize for market-overview\n    this.handleTabChanged(panelId)\n  }\n\n  handleClick(event) {\n    // Find the closest tab link\n    const link = event.target.closest('a[role=\"tab\"]')\n    // Use getAttribute so hash-only hrefs (\"#\") are skipped \u2014 link.href is a full URL\n    const href = link?.getAttribute('href')\n    if (!link || !href || href === '#' || href === '# ') {\n      return\n    }\n\n    // Ensure the clicked link is within this controller's element\n    if (!this.element.contains(link)) {\n      return\n    }\n\n    // Prevent default navigation - we'll handle it ourselves\n    event.preventDefault()\n    event.stopPropagation()\n\n    // Get the panel ID from the link\n    const panelId = link.getAttribute('aria-controls')\n    if (!panelId) {\n      console.warn('[story-tabs] No panel ID found for tab:', link.id)\n      return\n    }\n\n    // Activate the tab visually\n    this.activateTab(link)\n\n    // Update URL using the link's href (which already has the correct path)\n    try {\n      const linkUrl = new URL(link.href, window.location.origin)\n\n      // Update the browser URL without navigation\n      window.history.pushState({}, '', linkUrl.toString())\n\n      // Track tab change event\n      this.dispatch('trackEvent', {\n        prefix: null,\n        detail: {\n          name: 'Insights Tab Changed',\n          properties: {\n            section: panelId\n          }\n        }\n      })\n\n      // The activateTab method will handle loading the frame content\n      // We just need to ensure the URL is updated, which we did above\n    } catch (e) {\n      console.warn('[story-tabs] Error updating URL:', e)\n    }\n  }\n\n  handleTabChanged(panelId) {\n    // Dispatch event when market-overview tab is shown for map resize\n    if (panelId === 'market-overview') {\n      const marketOverviewFrame = document.getElementById('market-overview')\n\n      if (marketOverviewFrame) {\n        const triggerResize = () => {\n          // Dispatch custom event for map resize\n          this.dispatch('marketOverviewShown', { detail: { sectionId: 'market-overview' } })\n        }\n\n        // If frame is already loaded, trigger immediately\n        if (marketOverviewFrame.complete || marketOverviewFrame.classList.contains('active')) {\n          // Wait a bit to ensure tab transition is complete\n          setTimeout(triggerResize, 100)\n        } else {\n          // Wait for frame to load\n          marketOverviewFrame.addEventListener('turbo:frame-load', triggerResize, { once: true })\n        }\n      } else {\n        console.warn('[story-tabs] Market overview frame not found')\n      }\n    }\n  }\n\n  scrollTabIntoView(tabElement) {\n    // Find the scrollable container (parent with overflow-x-auto)\n    const scrollContainer = tabElement.closest('.overflow-x-auto')\n    if (!scrollContainer) {\n      return\n    }\n\n    // Calculate scroll position to center the tab\n    const containerRect = scrollContainer.getBoundingClientRect()\n    const tabRect = tabElement.getBoundingClientRect()\n    const containerScrollLeft = scrollContainer.scrollLeft\n    const containerWidth = containerRect.width\n    const tabLeft = tabRect.left - containerRect.left + containerScrollLeft\n    const tabWidth = tabRect.width\n    const tabCenter = tabLeft + tabWidth / 2\n    const scrollTarget = tabCenter - containerWidth / 2\n\n    // Smooth scroll to center the tab\n    scrollContainer.scrollTo({\n      left: scrollTarget,\n      behavior: 'smooth'\n    })\n  }\n\n  scrollActiveTabIntoView() {\n    // Find the active mobile tab\n    const activeMobileTab = this.tabTargets.find(tab => {\n      const isMobile = tab.id && tab.id.includes('-mobile')\n      const isActive = tab.getAttribute('aria-selected') === 'true' || tab.classList.contains('active')\n      return isMobile && isActive\n    })\n\n    if (activeMobileTab) {\n      this.scrollTabIntoView(activeMobileTab)\n    }\n  }\n\n  handleFrameLoad(event) {\n    // Check if the loaded frame is the mobile navigation frame\n    const mobileNavFrame = document.getElementById('story-nav-mobile')\n    if (mobileNavFrame && event.target === mobileNavFrame) {\n      // Navigation was updated, scroll active tab into view\n      setTimeout(() => {\n        this.scrollActiveTabIntoView()\n      }, 50)\n    }\n  }\n\n  handleTabSwitch(event) {\n    const { sectionId } = event.detail\n    if (!sectionId) {\n      console.warn('[story-tabs] No sectionId provided in switchTab event')\n      return\n    }\n\n    // Find the tab that corresponds to this section ID\n    // Tabs have data-turbo-frame attribute that matches the section ID\n    const targetTab = this.tabTargets.find(tab => {\n      const frameId = tab.getAttribute('data-turbo-frame') || tab.getAttribute('aria-controls')\n      return frameId === sectionId\n    })\n\n    if (targetTab) {\n      // Activate the tab (this will handle visual state and URL update)\n      this.activateTab(targetTab)\n\n      // If it's a link, we should also trigger navigation\n      if (targetTab.tagName === 'A' && targetTab.href && targetTab.href !== '#' && targetTab.href !== '# ') {\n        // Use Turbo to navigate to the tab's URL\n        Turbo.visit(targetTab.href)\n      }\n    } else {\n      console.warn('[story-tabs] Tab not found for section:', sectionId)\n    }\n  }\n\n  handleSyncFromUrl() {\n    this.syncTabFromUrl()\n  }\n\n  syncTabFromUrl() {\n    // Extract section from URL pathname\n    const pathParts = window.location.pathname.split('/').filter(Boolean)\n    const insightsIndex = pathParts.indexOf('insights')\n\n    if (insightsIndex === -1) {\n      return\n    }\n\n    // Valid URL sections mapped to panel IDs\n    const urlSectionToPanelId = {\n      'overview': 'market-overview',\n      'listings': 'listings',\n      'occupancy_analysis': 'occupancy-demand',\n      'pricing_revenue': 'pricing-revenue',\n      'supply_demand': 'supply-demand',\n      'submarkets': 'submarkets',\n      'top_listings': 'top-listings',\n      'related_markets': 'related-markets'\n    }\n\n    // Get the last part of the path (the section)\n    const urlSection = pathParts[pathParts.length - 1]\n    const panelId = urlSectionToPanelId[urlSection]\n\n    if (!panelId) {\n      // If no valid section found, default to overview\n      return\n    }\n\n    // Find the tab that corresponds to this panel ID\n    const targetTab = this.tabTargets.find(tab => {\n      const frameId = tab.getAttribute('data-turbo-frame') || tab.getAttribute('aria-controls')\n      return frameId === panelId\n    })\n\n    if (targetTab) {\n      // Activate the tab visually (without updating URL since it's already correct)\n      this.activateTab(targetTab)\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"buttonTemplate\"]\n  static values = {\n    selectedLocalityId: String\n  }\n\n  connect() {\n    if (this.selectedLocalityIdValue) {\n      this.showButton({ currentTarget: $(`[data-locality-id=\"${this.selectedLocalityIdValue}\"]`).addClass('bg-indigo-50').get(0) })\n    }\n  }\n\n  showButton(event) {\n    if (this.lastButton) {\n      this.lastButton.remove()\n      this.lastTarget.find('.lock-cell').show()\n    }\n\n    this.lastTarget = $(event.currentTarget)\n\n    const button = this.buttonTemplateTarget.firstElementChild.cloneNode(true)\n    button.classList.remove('hidden')\n\n    // Hide all locks\n    this.lastTarget.find('.lock-cell').hide()\n\n    this.lastButton = $('<td colspan=\"3\" class=\"button-cell\">').addClass($(event.currentTarget).find('td').first().attr('class')).append(button)\n\n    this.lastTarget.append(this.lastButton)\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"userId\", \"userEmail\"]\n\n  connect() {\n    // Listen for Preline modal open event\n    document.addEventListener('click', (event) => {\n      if (event.target.matches('[data-hs-overlay=\"#subscription-modal\"]') && event.target.dataset.userId) {\n        this.populateModal(event.target.dataset.userId, event.target.dataset.userEmail)\n      }\n    })\n  }\n\n  populateModal(userId, userEmail) {\n    this.userIdTarget.value = userId;\n    this.userEmailTarget.textContent = userEmail;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport L from 'leaflet'\nimport Wkt from 'wicket'\n\nexport default class extends Controller {\n  static values = {\n    compSetCoordinates: Array,\n    compSetPolygons: String\n  }\n\n  static targets = [\"container\"]\n\n  connect() {\n    this.wkt = new Wkt.Wkt()\n    this.markers = []\n    this.initializeMap()\n    this.addPolygons()\n    this.addMarkers()\n    this.fitMapBounds()\n  }\n\n  initializeMap() {\n    this.map = L.map('map')\n    L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {\n      maxZoom: 19,\n      attribution: '&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>'\n    }).addTo(this.map)\n  }\n\n  addPolygons() {\n    this.wkt.read(this.compSetPolygonsValue)\n    const obj = this.wkt.toObject({\n      color: '#1F6F54',\n      fillColor: 'none',\n      weight: 2\n    })\n    obj.addTo(this.map)\n  }\n\n  addMarkers() {\n    this.compSetCoordinatesValue.forEach((c, index) => {\n      const label = L.divIcon({\n        className: 'marker',\n        html: `${index + 1}`,\n        iconSize: [20, 20]\n      })\n      const marker = L.marker(c, { icon: label })\n      marker.addTo(this.map)\n\n      marker.on('mouseover', () => this.selectMarker(null, index, false))\n      marker.on('mouseout', () => this.unselectMarker(null, index))\n      marker.on('click', () => this.selectListing(index))\n\n      this.markers[index] = marker\n    })\n  }\n\n  fitMapBounds() {\n    const bounds = L.latLngBounds(this.compSetCoordinatesValue)\n    this.map.fitBounds(bounds)\n  }\n\n  changeMarkerClass(index, selected) {\n    const marker = this.markers[index]\n    if (marker) {\n      const originalHtml = marker.getIcon().options.html\n      marker.setIcon(L.divIcon({\n        className: selected ? 'marker selected' : 'marker',\n        html: originalHtml,\n        iconSize: selected ? [40, 40] : [20, 20]\n      }))\n    }\n  }\n\n  selectMarker(event, index, pan = true) {\n    index = index != null ? index : parseInt(event.params.index);\n    this.changeMarkerClass(index, true);\n\n    if (pan) {\n      this.map.setView(this.markers[index].getLatLng(), 15);\n      this.selectListing(index, false);\n    }\n  }\n\n  unselectMarker(event, index) {\n    index = index != null ? index : parseInt(event.params.index);\n    this.changeMarkerClass(index, false);\n  }\n\n  selectListing(index, scroll = true) {\n    $(this.containerTarget).find('.selected-listing').removeClass('selected-listing')\n\n    const listing = $(this.containerTarget).find(`#listing-${index}`).get(0)\n\n    if (scroll) {\n      listing.scrollIntoView({ behavior: 'smooth' })\n    }\n\n    listing.classList.add('selected-listing')\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\nimport Wkt from 'wicket'\nimport 'wicket-leaflet'\n\nexport default class extends Controller {\n  static targets = [\"container\"]\n  static values = {\n    wkt: String,\n    wktUrl: String,\n    padding: { type: Number, default: 10 }\n  }\n\n  connect() {\n    // If we have a WKT URL, fetch the data asynchronously\n    if (this.hasWktUrlValue && this.wktUrlValue) {\n      this.fetchWktData()\n    } else if (this.wktValue) {\n      // Fallback to inline WKT if provided (for backward compatibility)\n      this.renderMap()\n    }\n  }\n\n  async fetchWktData() {\n    try {\n      const response = await fetch(this.wktUrlValue)\n      if (!response.ok) {\n        throw new Error(`HTTP error! status: ${response.status}`)\n      }\n      const data = await response.json()\n      const extractedWkt = this.extractWktFromData(data)\n      if (extractedWkt) {\n        this.wktValue = extractedWkt\n        this.renderMap()\n      } else {\n        console.warn('WKT data missing in response', data)\n      }\n    } catch (error) {\n      console.error('Failed to fetch WKT data:', error)\n    }\n  }\n\n  disconnect() {\n    if (this.map) {\n      this.map.remove()\n    }\n  }\n\n  renderMap() {\n    const container = this.containerTarget\n\n    // Parse WKT and create Leaflet object directly (same as h3_map_controller)\n    const wkt = new Wkt.Wkt()\n    wkt.read(this.wktValue)\n\n    // Create Leaflet map\n    this.map = L.map(container, {\n      zoomControl: false,\n      attributionControl: false,\n      dragging: false,\n      touchZoom: false,\n      doubleClickZoom: false,\n      scrollWheelZoom: false,\n      boxZoom: false,\n      keyboard: false\n    })\n\n    // Add tile layer\n    L.tileLayer('https://tiles.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png', {\n      attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors &copy; <a href=\"https://carto.com/attributions\">CARTO</a>',\n      maxZoom: 19,\n      opacity: 1,\n      retina: '@2x',\n      detectRetina: true\n    }).addTo(this.map)\n\n    // Create polygon using the same method as h3_map_controller\n    const polygon = wkt.toObject({\n      color: '#1D4ED8',\n      weight: 2,\n      fillColor: '#3B82F6',\n      fillOpacity: 0.3\n    })\n\n\n    polygon.addTo(this.map)\n\n    // Fit map to polygon bounds with minimal padding for maximum coverage\n    this.map.fitBounds(polygon.getBounds(), { padding: [2, 2] })\n  }\n\n  extractWktFromData(data) {\n    if (!data) return null\n\n    if (typeof data === 'string') return data\n    if (data.wkt) return data.wkt\n    if (data.simplified_geom) return data.simplified_geom\n\n    const polygon = data.polygon\n    if (polygon?.wkt) return polygon.wkt\n    if (polygon?.simplified_geom) return polygon.simplified_geom\n\n    if (Array.isArray(data.polygons) && data.polygons.length > 0) {\n      const [first] = data.polygons\n      if (first?.wkt) return first.wkt\n      if (first?.simplified_geom) return first.simplified_geom\n    }\n\n    return null\n  }\n}", "// This file is auto-generated by ./bin/rails stimulus:manifest:update\n// Run that command whenever you add a new controller or create them with\n// ./bin/rails generate stimulus controllerName\n\nimport { application } from \"./application\"\n\nimport AdminAutocompleteBoostController from \"./admin_autocomplete_boost_controller\"\napplication.register(\"admin-autocomplete-boost\", AdminAutocompleteBoostController)\n\nimport AdrTierController from \"./adr_tier_controller\"\napplication.register(\"adr-tier\", AdrTierController)\n\nimport AmenitiesChartController from \"./amenities_chart_controller\"\napplication.register(\"amenities-chart\", AmenitiesChartController)\n\nimport AmenitiesDropdownController from \"./amenities_dropdown_controller\"\napplication.register(\"amenities-dropdown\", AmenitiesDropdownController)\n\nimport AmplitudeController from \"./amplitude_controller\"\napplication.register(\"amplitude\", AmplitudeController)\n\nimport ApplicationController from \"./application_controller\"\napplication.register(\"application\", ApplicationController)\n\nimport Auth0Controller from \"./auth0_controller\"\napplication.register(\"auth0\", Auth0Controller)\n\nimport AuthController from \"./auth_controller\"\napplication.register(\"auth\", AuthController)\n\nimport AutocompleteController from \"./autocomplete_controller\"\napplication.register(\"autocomplete\", AutocompleteController)\n\nimport BedroomCountChartController from \"./bedroom_count_chart_controller\"\napplication.register(\"bedroom-count-chart\", BedroomCountChartController)\n\nimport CalendarController from \"./calendar_controller\"\napplication.register(\"calendar\", CalendarController)\n\nimport ChartController from \"./chart_controller\"\napplication.register(\"chart\", ChartController)\n\nimport CompSetListRowController from \"./comp_set_list_row_controller\"\napplication.register(\"comp-set-list-row\", CompSetListRowController)\n\nimport ContactFormController from \"./contact_form_controller\"\napplication.register(\"contact-form\", ContactFormController)\n\nimport DailyOccupancyChartController from \"./daily_occupancy_chart_controller\"\napplication.register(\"daily-occupancy-chart\", DailyOccupancyChartController)\n\nimport DesktopFiltersController from \"./desktop_filters_controller\"\napplication.register(\"desktop-filters\", DesktopFiltersController)\n\nimport DetectionSimulatorController from \"./detection_simulator_controller\"\napplication.register(\"detection-simulator\", DetectionSimulatorController)\n\nimport DropdownController from \"./dropdown_controller\"\napplication.register(\"dropdown\", DropdownController)\n\nimport EmailExistsModalController from \"./email_exists_modal_controller\"\napplication.register(\"email-exists-modal\", EmailExistsModalController)\n\nimport FiltersContainerController from \"./filters_container_controller\"\napplication.register(\"filters-container\", FiltersContainerController)\n\nimport FiltersExplainerController from \"./filters_explainer_controller\"\napplication.register(\"filters-explainer\", FiltersExplainerController)\n\nimport GalleryController from \"./gallery_controller\"\napplication.register(\"gallery\", GalleryController)\n\nimport GoogleAdsController from \"./google_ads_controller\"\napplication.register(\"google-ads\", GoogleAdsController)\n\nimport GoogleOneTapController from \"./google_one_tap_controller\"\napplication.register(\"google-one-tap\", GoogleOneTapController)\n\nimport GooglePlacesController from \"./google_places_controller\"\napplication.register(\"google-places\", GooglePlacesController)\n\nimport H3MapController from \"./h3_map_controller\"\napplication.register(\"h3-map\", H3MapController)\n\nimport H3MapPreviewController from \"./h3_map_preview_controller\"\napplication.register(\"h3-map-preview\", H3MapPreviewController)\n\nimport ImageFallbackController from \"./image_fallback_controller\"\napplication.register(\"image-fallback\", ImageFallbackController)\n\nimport InsightsCityTrackingController from \"./insights_city_tracking_controller\"\napplication.register(\"insights-city-tracking\", InsightsCityTrackingController)\n\nimport InsightsMapController from \"./insights_map_controller\"\napplication.register(\"insights-map\", InsightsMapController)\n\nimport InvestmentCalculatorLandingController from \"./investment_calculator_landing_controller\"\napplication.register(\"investment-calculator-landing\", InvestmentCalculatorLandingController)\n\nimport InvestmentCalculatorPreviewTrackingController from \"./investment_calculator_preview_tracking_controller\"\napplication.register(\"investment-calculator-preview-tracking\", InvestmentCalculatorPreviewTrackingController)\n\nimport InvestmentCalculatorRecentSearchesController from \"./investment_calculator_recent_searches_controller\"\napplication.register(\"investment-calculator-recent-searches\", InvestmentCalculatorRecentSearchesController)\n\nimport LandingPageTrackingController from \"./landing_page_tracking_controller\"\napplication.register(\"landing-page-tracking\", LandingPageTrackingController)\n\nimport LinkInterceptorController from \"./link_interceptor_controller\"\napplication.register(\"link-interceptor\", LinkInterceptorController)\n\nimport ListingsChartController from \"./listings_chart_controller\"\napplication.register(\"listings-chart\", ListingsChartController)\n\nimport MapExpandController from \"./map_expand_controller\"\napplication.register(\"map-expand\", MapExpandController)\n\nimport MapModalController from \"./map_modal_controller\"\napplication.register(\"map-modal\", MapModalController)\n\nimport MapSwitcherController from \"./map_switcher_controller\"\napplication.register(\"map-switcher\", MapSwitcherController)\n\nimport MetricChartSwitcherController from \"./metric_chart_switcher_controller\"\napplication.register(\"metric-chart-switcher\", MetricChartSwitcherController)\n\nimport MinimalChartController from \"./minimal_chart_controller\"\napplication.register(\"minimal-chart\", MinimalChartController)\n\nimport MobileCompSetFiltersController from \"./mobile_comp_set_filters_controller\"\napplication.register(\"mobile-comp-set-filters\", MobileCompSetFiltersController)\n\nimport MobileFiltersController from \"./mobile_filters_controller\"\napplication.register(\"mobile-filters\", MobileFiltersController)\n\nimport PaddleController from \"./paddle_controller\"\napplication.register(\"paddle\", PaddleController)\n\nimport PaywallController from \"./paywall_controller\"\napplication.register(\"paywall\", PaywallController)\n\nimport PolygonEditorController from \"./polygon_editor_controller\"\napplication.register(\"polygon-editor\", PolygonEditorController)\n\nimport PolygonNavigationController from \"./polygon_navigation_controller\"\napplication.register(\"polygon-navigation\", PolygonNavigationController)\n\nimport PolygonsMapController from \"./polygons_map_controller\"\napplication.register(\"polygons-map\", PolygonsMapController)\n\nimport PortfolioController from \"./portfolio_controller\"\napplication.register(\"portfolio\", PortfolioController)\n\nimport PricingController from \"./pricing_controller\"\napplication.register(\"pricing\", PricingController)\n\nimport PricingModalController from \"./pricing_modal_controller\"\napplication.register(\"pricing-modal\", PricingModalController)\n\nimport PrimaryIntentController from \"./primary_intent_controller\"\napplication.register(\"primary-intent\", PrimaryIntentController)\n\nimport RatingCountDistributionChartController from \"./rating_count_distribution_chart_controller\"\napplication.register(\"rating-count-distribution-chart\", RatingCountDistributionChartController)\n\nimport RatingDistributionChartController from \"./rating_distribution_chart_controller\"\napplication.register(\"rating-distribution-chart\", RatingDistributionChartController)\n\nimport RecentSearchesController from \"./recent_searches_controller\"\napplication.register(\"recent-searches\", RecentSearchesController)\n\nimport RevenueHistogramController from \"./revenue_histogram_controller\"\napplication.register(\"revenue-histogram\", RevenueHistogramController)\n\nimport RevenueTierController from \"./revenue_tier_controller\"\napplication.register(\"revenue-tier\", RevenueTierController)\n\nimport ScrollRevealController from \"./scroll_reveal_controller\"\napplication.register(\"scroll-reveal\", ScrollRevealController)\n\nimport SignupFormController from \"./signup_form_controller\"\napplication.register(\"signup-form\", SignupFormController)\n\nimport SlidePanelController from \"./slide_panel_controller\"\napplication.register(\"slide-panel\", SlidePanelController)\n\nimport SmoothScrollController from \"./smooth_scroll_controller\"\napplication.register(\"smooth-scroll\", SmoothScrollController)\n\nimport SortableTableController from \"./sortable_table_controller\"\napplication.register(\"sortable-table\", SortableTableController)\n\nimport StoryNavController from \"./story_nav_controller\"\napplication.register(\"story-nav\", StoryNavController)\n\nimport StoryTabsController from \"./story_tabs_controller\"\napplication.register(\"story-tabs\", StoryTabsController)\n\nimport SubmarketsController from \"./submarkets_controller\"\napplication.register(\"submarkets\", SubmarketsController)\n\nimport SubscriptionModalController from \"./subscription_modal_controller\"\napplication.register(\"subscription-modal\", SubscriptionModalController)\n\nimport TopListingsController from \"./top_listings_controller\"\napplication.register(\"top-listings\", TopListingsController)\n\nimport WktMapController from \"./wkt_map_controller\"\napplication.register(\"wkt-map\", WktMapController)\n", "/*!\nTurbo 8.0.23\nCopyright \u00A9 2026 37signals LLC\n */\nconst FrameLoadingStyle = {\n  eager: \"eager\",\n  lazy: \"lazy\"\n};\n\n/**\n * Contains a fragment of HTML which is updated based on navigation within\n * it (e.g. via links or form submissions).\n *\n * @customElement turbo-frame\n * @example\n *   <turbo-frame id=\"messages\">\n *     <a href=\"/messages/expanded\">\n *       Show all expanded messages in this frame.\n *     </a>\n *\n *     <form action=\"/messages\">\n *       Show response from this form within this frame.\n *     </form>\n *   </turbo-frame>\n */\nclass FrameElement extends HTMLElement {\n  static delegateConstructor = undefined\n\n  loaded = Promise.resolve()\n\n  static get observedAttributes() {\n    return [\"disabled\", \"loading\", \"src\"]\n  }\n\n  constructor() {\n    super();\n    this.delegate = new FrameElement.delegateConstructor(this);\n  }\n\n  connectedCallback() {\n    this.delegate.connect();\n  }\n\n  disconnectedCallback() {\n    this.delegate.disconnect();\n  }\n\n  reload() {\n    return this.delegate.sourceURLReloaded()\n  }\n\n  attributeChangedCallback(name) {\n    if (name == \"loading\") {\n      this.delegate.loadingStyleChanged();\n    } else if (name == \"src\") {\n      this.delegate.sourceURLChanged();\n    } else if (name == \"disabled\") {\n      this.delegate.disabledChanged();\n    }\n  }\n\n  /**\n   * Gets the URL to lazily load source HTML from\n   */\n  get src() {\n    return this.getAttribute(\"src\")\n  }\n\n  /**\n   * Sets the URL to lazily load source HTML from\n   */\n  set src(value) {\n    if (value) {\n      this.setAttribute(\"src\", value);\n    } else {\n      this.removeAttribute(\"src\");\n    }\n  }\n\n  /**\n   * Gets the refresh mode for the frame.\n   */\n  get refresh() {\n    return this.getAttribute(\"refresh\")\n  }\n\n  /**\n   * Sets the refresh mode for the frame.\n   */\n  set refresh(value) {\n    if (value) {\n      this.setAttribute(\"refresh\", value);\n    } else {\n      this.removeAttribute(\"refresh\");\n    }\n  }\n\n  get shouldReloadWithMorph() {\n    return this.src && this.refresh === \"morph\"\n  }\n\n  /**\n   * Determines if the element is loading\n   */\n  get loading() {\n    return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\")\n  }\n\n  /**\n   * Sets the value of if the element is loading\n   */\n  set loading(value) {\n    if (value) {\n      this.setAttribute(\"loading\", value);\n    } else {\n      this.removeAttribute(\"loading\");\n    }\n  }\n\n  /**\n   * Gets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  get disabled() {\n    return this.hasAttribute(\"disabled\")\n  }\n\n  /**\n   * Sets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  set disabled(value) {\n    if (value) {\n      this.setAttribute(\"disabled\", \"\");\n    } else {\n      this.removeAttribute(\"disabled\");\n    }\n  }\n\n  /**\n   * Gets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  get autoscroll() {\n    return this.hasAttribute(\"autoscroll\")\n  }\n\n  /**\n   * Sets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  set autoscroll(value) {\n    if (value) {\n      this.setAttribute(\"autoscroll\", \"\");\n    } else {\n      this.removeAttribute(\"autoscroll\");\n    }\n  }\n\n  /**\n   * Determines if the element has finished loading\n   */\n  get complete() {\n    return !this.delegate.isLoading\n  }\n\n  /**\n   * Gets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isActive() {\n    return this.ownerDocument === document && !this.isPreview\n  }\n\n  /**\n   * Sets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isPreview() {\n    return this.ownerDocument?.documentElement?.hasAttribute(\"data-turbo-preview\")\n  }\n}\n\nfunction frameLoadingStyleFromString(style) {\n  switch (style.toLowerCase()) {\n    case \"lazy\":\n      return FrameLoadingStyle.lazy\n    default:\n      return FrameLoadingStyle.eager\n  }\n}\n\nconst drive = {\n  enabled: true,\n  progressBarDelay: 500,\n  unvisitableExtensions: new Set(\n    [\n      \".7z\", \".aac\", \".apk\", \".avi\", \".bmp\", \".bz2\", \".css\", \".csv\", \".deb\", \".dmg\", \".doc\",\n      \".docx\", \".exe\", \".gif\", \".gz\", \".heic\", \".heif\", \".ico\", \".iso\", \".jpeg\", \".jpg\",\n      \".js\", \".json\", \".m4a\", \".mkv\", \".mov\", \".mp3\", \".mp4\", \".mpeg\", \".mpg\", \".msi\",\n      \".ogg\", \".ogv\", \".pdf\", \".pkg\", \".png\", \".ppt\", \".pptx\", \".rar\", \".rtf\",\n      \".svg\", \".tar\", \".tif\", \".tiff\", \".txt\", \".wav\", \".webm\", \".webp\", \".wma\", \".wmv\",\n      \".xls\", \".xlsx\", \".xml\", \".zip\"\n    ]\n  )\n};\n\nfunction activateScriptElement(element) {\n  if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n    return element\n  } else {\n    const createdScriptElement = document.createElement(\"script\");\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      createdScriptElement.nonce = cspNonce;\n    }\n    createdScriptElement.textContent = element.textContent;\n    createdScriptElement.async = false;\n    copyElementAttributes(createdScriptElement, element);\n    return createdScriptElement\n  }\n}\n\nfunction copyElementAttributes(destinationElement, sourceElement) {\n  for (const { name, value } of sourceElement.attributes) {\n    destinationElement.setAttribute(name, value);\n  }\n}\n\nfunction createDocumentFragment(html) {\n  const template = document.createElement(\"template\");\n  template.innerHTML = html;\n  return template.content\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n  const event = new CustomEvent(eventName, {\n    cancelable,\n    bubbles: true,\n    composed: true,\n    detail\n  });\n\n  if (target && target.isConnected) {\n    target.dispatchEvent(event);\n  } else {\n    document.documentElement.dispatchEvent(event);\n  }\n\n  return event\n}\n\nfunction cancelEvent(event) {\n  event.preventDefault();\n  event.stopImmediatePropagation();\n}\n\nfunction nextRepaint() {\n  if (document.visibilityState === \"hidden\") {\n    return nextEventLoopTick()\n  } else {\n    return nextAnimationFrame()\n  }\n}\n\nfunction nextAnimationFrame() {\n  return new Promise((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction nextEventLoopTick() {\n  return new Promise((resolve) => setTimeout(() => resolve(), 0))\n}\n\nfunction parseHTMLDocument(html = \"\") {\n  return new DOMParser().parseFromString(html, \"text/html\")\n}\n\nfunction unindent(strings, ...values) {\n  const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n  const match = lines[0].match(/^\\s+/);\n  const indent = match ? match[0].length : 0;\n  return lines.map((line) => line.slice(indent)).join(\"\\n\")\n}\n\nfunction interpolate(strings, values) {\n  return strings.reduce((result, string, i) => {\n    const value = values[i] == undefined ? \"\" : values[i];\n    return result + string + value\n  }, \"\")\n}\n\nfunction uuid() {\n  return Array.from({ length: 36 })\n    .map((_, i) => {\n      if (i == 8 || i == 13 || i == 18 || i == 23) {\n        return \"-\"\n      } else if (i == 14) {\n        return \"4\"\n      } else if (i == 19) {\n        return (Math.floor(Math.random() * 4) + 8).toString(16)\n      } else {\n        return Math.floor(Math.random() * 16).toString(16)\n      }\n    })\n    .join(\"\")\n}\n\nfunction getAttribute(attributeName, ...elements) {\n  for (const value of elements.map((element) => element?.getAttribute(attributeName))) {\n    if (typeof value == \"string\") return value\n  }\n\n  return null\n}\n\nfunction hasAttribute(attributeName, ...elements) {\n  return elements.some((element) => element && element.hasAttribute(attributeName))\n}\n\nfunction markAsBusy(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.setAttribute(\"busy\", \"\");\n    }\n    element.setAttribute(\"aria-busy\", \"true\");\n  }\n}\n\nfunction clearBusyState(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.removeAttribute(\"busy\");\n    }\n\n    element.removeAttribute(\"aria-busy\");\n  }\n}\n\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n  return new Promise((resolve) => {\n    const onComplete = () => {\n      element.removeEventListener(\"error\", onComplete);\n      element.removeEventListener(\"load\", onComplete);\n      resolve();\n    };\n\n    element.addEventListener(\"load\", onComplete, { once: true });\n    element.addEventListener(\"error\", onComplete, { once: true });\n    setTimeout(resolve, timeoutInMilliseconds);\n  })\n}\n\nfunction getHistoryMethodForAction(action) {\n  switch (action) {\n    case \"replace\":\n      return history.replaceState\n    case \"advance\":\n    case \"restore\":\n      return history.pushState\n  }\n}\n\nfunction isAction(action) {\n  return action == \"advance\" || action == \"replace\" || action == \"restore\"\n}\n\nfunction getVisitAction(...elements) {\n  const action = getAttribute(\"data-turbo-action\", ...elements);\n\n  return isAction(action) ? action : null\n}\n\nfunction getMetaElement(name) {\n  return document.querySelector(`meta[name=\"${name}\"]`)\n}\n\nfunction getMetaContent(name) {\n  const element = getMetaElement(name);\n  return element && element.content\n}\n\nfunction getCspNonce() {\n  const element = getMetaElement(\"csp-nonce\");\n\n  if (element) {\n    const { nonce, content } = element;\n    return nonce == \"\" ? content : nonce\n  }\n}\n\nfunction setMetaContent(name, content) {\n  let element = getMetaElement(name);\n\n  if (!element) {\n    element = document.createElement(\"meta\");\n    element.setAttribute(\"name\", name);\n\n    document.head.appendChild(element);\n  }\n\n  element.setAttribute(\"content\", content);\n\n  return element\n}\n\nfunction findClosestRecursively(element, selector) {\n  if (element instanceof Element) {\n    return (\n      element.closest(selector) || findClosestRecursively(element.assignedSlot || element.getRootNode()?.host, selector)\n    )\n  }\n}\n\nfunction elementIsFocusable(element) {\n  const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n\n  return !!element && element.closest(inertDisabledOrHidden) == null && typeof element.focus == \"function\"\n}\n\nfunction queryAutofocusableElement(elementOrDocumentFragment) {\n  return Array.from(elementOrDocumentFragment.querySelectorAll(\"[autofocus]\")).find(elementIsFocusable)\n}\n\nasync function around(callback, reader) {\n  const before = reader();\n\n  callback();\n\n  await nextAnimationFrame();\n\n  const after = reader();\n\n  return [before, after]\n}\n\nfunction doesNotTargetIFrame(name) {\n  if (name === \"_blank\") {\n    return false\n  } else if (name) {\n    for (const element of document.getElementsByName(name)) {\n      if (element instanceof HTMLIFrameElement) return false\n    }\n\n    return true\n  } else {\n    return true\n  }\n}\n\nfunction findLinkFromClickTarget(target) {\n  const link = findClosestRecursively(target, \"a[href], a[xlink\\\\:href]\");\n\n  if (!link) return null\n  if (link.href.startsWith(\"#\")) return null\n  if (link.hasAttribute(\"download\")) return null\n\n  const linkTarget = link.getAttribute(\"target\");\n  if (linkTarget && linkTarget !== \"_self\") return null\n\n  return link\n}\n\nfunction debounce(fn, delay) {\n  let timeoutId = null;\n\n  return (...args) => {\n    const callback = () => fn.apply(this, args);\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(callback, delay);\n  }\n}\n\nconst submitter = {\n  \"aria-disabled\": {\n    beforeSubmit: submitter => {\n      submitter.setAttribute(\"aria-disabled\", \"true\");\n      submitter.addEventListener(\"click\", cancelEvent);\n    },\n\n    afterSubmit: submitter => {\n      submitter.removeAttribute(\"aria-disabled\");\n      submitter.removeEventListener(\"click\", cancelEvent);\n    }\n  },\n\n  \"disabled\": {\n    beforeSubmit: submitter => submitter.disabled = true,\n    afterSubmit: submitter => submitter.disabled = false\n  }\n};\n\nclass Config {\n  #submitter = null\n\n  constructor(config) {\n    Object.assign(this, config);\n  }\n\n  get submitter() {\n    return this.#submitter\n  }\n\n  set submitter(value) {\n    this.#submitter = submitter[value] || value;\n  }\n}\n\nconst forms = new Config({\n  mode: \"on\",\n  submitter: \"disabled\"\n});\n\nconst config = {\n  drive,\n  forms\n};\n\nfunction expandURL(locatable) {\n  return new URL(locatable.toString(), document.baseURI)\n}\n\nfunction getAnchor(url) {\n  let anchorMatch;\n  if (url.hash) {\n    return url.hash.slice(1)\n    // eslint-disable-next-line no-cond-assign\n  } else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n    return anchorMatch[1]\n  }\n}\n\nfunction getAction$1(form, submitter) {\n  const action = submitter?.getAttribute(\"formaction\") || form.getAttribute(\"action\") || form.action;\n\n  return expandURL(action)\n}\n\nfunction getExtension(url) {\n  return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\"\n}\n\nfunction isPrefixedBy(baseURL, url) {\n  const prefix = addTrailingSlash(url.origin + url.pathname);\n  return addTrailingSlash(baseURL.href) === prefix || baseURL.href.startsWith(prefix)\n}\n\nfunction locationIsVisitable(location, rootLocation) {\n  return isPrefixedBy(location, rootLocation) && !config.drive.unvisitableExtensions.has(getExtension(location))\n}\n\nfunction getLocationForLink(link) {\n  return expandURL(link.getAttribute(\"href\") || \"\")\n}\n\nfunction getRequestURL(url) {\n  const anchor = getAnchor(url);\n  return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href\n}\n\nfunction toCacheKey(url) {\n  return getRequestURL(url)\n}\n\nfunction urlsAreEqual(left, right) {\n  return expandURL(left).href == expandURL(right).href\n}\n\nfunction getPathComponents(url) {\n  return url.pathname.split(\"/\").slice(1)\n}\n\nfunction getLastPathComponent(url) {\n  return getPathComponents(url).slice(-1)[0]\n}\n\nfunction addTrailingSlash(value) {\n  return value.endsWith(\"/\") ? value : value + \"/\"\n}\n\nclass FetchResponse {\n  constructor(response) {\n    this.response = response;\n  }\n\n  get succeeded() {\n    return this.response.ok\n  }\n\n  get failed() {\n    return !this.succeeded\n  }\n\n  get clientError() {\n    return this.statusCode >= 400 && this.statusCode <= 499\n  }\n\n  get serverError() {\n    return this.statusCode >= 500 && this.statusCode <= 599\n  }\n\n  get redirected() {\n    return this.response.redirected\n  }\n\n  get location() {\n    return expandURL(this.response.url)\n  }\n\n  get isHTML() {\n    return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/)\n  }\n\n  get statusCode() {\n    return this.response.status\n  }\n\n  get contentType() {\n    return this.header(\"Content-Type\")\n  }\n\n  get responseText() {\n    return this.response.clone().text()\n  }\n\n  get responseHTML() {\n    if (this.isHTML) {\n      return this.response.clone().text()\n    } else {\n      return Promise.resolve(undefined)\n    }\n  }\n\n  header(name) {\n    return this.response.headers.get(name)\n  }\n}\n\nclass LimitedSet extends Set {\n  constructor(maxSize) {\n    super();\n    this.maxSize = maxSize;\n  }\n\n  add(value) {\n    if (this.size >= this.maxSize) {\n      const iterator = this.values();\n      const oldestValue = iterator.next().value;\n      this.delete(oldestValue);\n    }\n    super.add(value);\n  }\n}\n\nconst recentRequests = new LimitedSet(20);\n\nfunction fetchWithTurboHeaders(url, options = {}) {\n  const modifiedHeaders = new Headers(options.headers || {});\n  const requestUID = uuid();\n  recentRequests.add(requestUID);\n  modifiedHeaders.append(\"X-Turbo-Request-Id\", requestUID);\n\n  return window.fetch(url, {\n    ...options,\n    headers: modifiedHeaders\n  })\n}\n\nfunction fetchMethodFromString(method) {\n  switch (method.toLowerCase()) {\n    case \"get\":\n      return FetchMethod.get\n    case \"post\":\n      return FetchMethod.post\n    case \"put\":\n      return FetchMethod.put\n    case \"patch\":\n      return FetchMethod.patch\n    case \"delete\":\n      return FetchMethod.delete\n  }\n}\n\nconst FetchMethod = {\n  get: \"get\",\n  post: \"post\",\n  put: \"put\",\n  patch: \"patch\",\n  delete: \"delete\"\n};\n\nfunction fetchEnctypeFromString(encoding) {\n  switch (encoding.toLowerCase()) {\n    case FetchEnctype.multipart:\n      return FetchEnctype.multipart\n    case FetchEnctype.plain:\n      return FetchEnctype.plain\n    default:\n      return FetchEnctype.urlEncoded\n  }\n}\n\nconst FetchEnctype = {\n  urlEncoded: \"application/x-www-form-urlencoded\",\n  multipart: \"multipart/form-data\",\n  plain: \"text/plain\"\n};\n\nclass FetchRequest {\n  abortController = new AbortController()\n  #resolveRequestPromise = (_value) => {}\n\n  constructor(delegate, method, location, requestBody = new URLSearchParams(), target = null, enctype = FetchEnctype.urlEncoded) {\n    const [url, body] = buildResourceAndBody(expandURL(location), method, requestBody, enctype);\n\n    this.delegate = delegate;\n    this.url = url;\n    this.target = target;\n    this.fetchOptions = {\n      credentials: \"same-origin\",\n      redirect: \"follow\",\n      method: method.toUpperCase(),\n      headers: { ...this.defaultHeaders },\n      body: body,\n      signal: this.abortSignal,\n      referrer: this.delegate.referrer?.href\n    };\n    this.enctype = enctype;\n  }\n\n  get method() {\n    return this.fetchOptions.method\n  }\n\n  set method(value) {\n    const fetchBody = this.isSafe ? this.url.searchParams : this.fetchOptions.body || new FormData();\n    const fetchMethod = fetchMethodFromString(value) || FetchMethod.get;\n\n    this.url.search = \"\";\n\n    const [url, body] = buildResourceAndBody(this.url, fetchMethod, fetchBody, this.enctype);\n\n    this.url = url;\n    this.fetchOptions.body = body;\n    this.fetchOptions.method = fetchMethod.toUpperCase();\n  }\n\n  get headers() {\n    return this.fetchOptions.headers\n  }\n\n  set headers(value) {\n    this.fetchOptions.headers = value;\n  }\n\n  get body() {\n    if (this.isSafe) {\n      return this.url.searchParams\n    } else {\n      return this.fetchOptions.body\n    }\n  }\n\n  set body(value) {\n    this.fetchOptions.body = value;\n  }\n\n  get location() {\n    return this.url\n  }\n\n  get params() {\n    return this.url.searchParams\n  }\n\n  get entries() {\n    return this.body ? Array.from(this.body.entries()) : []\n  }\n\n  cancel() {\n    this.abortController.abort();\n  }\n\n  async perform() {\n    const { fetchOptions } = this;\n    this.delegate.prepareRequest(this);\n    const event = await this.#allowRequestToBeIntercepted(fetchOptions);\n    try {\n      this.delegate.requestStarted(this);\n\n      if (event.detail.fetchRequest) {\n        this.response = event.detail.fetchRequest.response;\n      } else {\n        this.response = fetchWithTurboHeaders(this.url.href, fetchOptions);\n      }\n\n      const response = await this.response;\n      return await this.receive(response)\n    } catch (error) {\n      if (error.name !== \"AbortError\") {\n        if (this.#willDelegateErrorHandling(error)) {\n          this.delegate.requestErrored(this, error);\n        }\n        throw error\n      }\n    } finally {\n      this.delegate.requestFinished(this);\n    }\n  }\n\n  async receive(response) {\n    const fetchResponse = new FetchResponse(response);\n    const event = dispatch(\"turbo:before-fetch-response\", {\n      cancelable: true,\n      detail: { fetchResponse },\n      target: this.target\n    });\n    if (event.defaultPrevented) {\n      this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n    } else if (fetchResponse.succeeded) {\n      this.delegate.requestSucceededWithResponse(this, fetchResponse);\n    } else {\n      this.delegate.requestFailedWithResponse(this, fetchResponse);\n    }\n    return fetchResponse\n  }\n\n  get defaultHeaders() {\n    return {\n      Accept: \"text/html, application/xhtml+xml\"\n    }\n  }\n\n  get isSafe() {\n    return isSafe(this.method)\n  }\n\n  get abortSignal() {\n    return this.abortController.signal\n  }\n\n  acceptResponseType(mimeType) {\n    this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n  }\n\n  async #allowRequestToBeIntercepted(fetchOptions) {\n    const requestInterception = new Promise((resolve) => (this.#resolveRequestPromise = resolve));\n    const event = dispatch(\"turbo:before-fetch-request\", {\n      cancelable: true,\n      detail: {\n        fetchOptions,\n        url: this.url,\n        resume: this.#resolveRequestPromise\n      },\n      target: this.target\n    });\n    this.url = event.detail.url;\n    if (event.defaultPrevented) await requestInterception;\n\n    return event\n  }\n\n  #willDelegateErrorHandling(error) {\n    const event = dispatch(\"turbo:fetch-request-error\", {\n      target: this.target,\n      cancelable: true,\n      detail: { request: this, error: error }\n    });\n\n    return !event.defaultPrevented\n  }\n}\n\nfunction isSafe(fetchMethod) {\n  return fetchMethodFromString(fetchMethod) == FetchMethod.get\n}\n\nfunction buildResourceAndBody(resource, method, requestBody, enctype) {\n  const searchParams =\n    Array.from(requestBody).length > 0 ? new URLSearchParams(entriesExcludingFiles(requestBody)) : resource.searchParams;\n\n  if (isSafe(method)) {\n    return [mergeIntoURLSearchParams(resource, searchParams), null]\n  } else if (enctype == FetchEnctype.urlEncoded) {\n    return [resource, searchParams]\n  } else {\n    return [resource, requestBody]\n  }\n}\n\nfunction entriesExcludingFiles(requestBody) {\n  const entries = [];\n\n  for (const [name, value] of requestBody) {\n    if (value instanceof File) continue\n    else entries.push([name, value]);\n  }\n\n  return entries\n}\n\nfunction mergeIntoURLSearchParams(url, requestBody) {\n  const searchParams = new URLSearchParams(entriesExcludingFiles(requestBody));\n\n  url.search = searchParams.toString();\n\n  return url\n}\n\nclass AppearanceObserver {\n  started = false\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n    this.intersectionObserver = new IntersectionObserver(this.intersect);\n  }\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      this.intersectionObserver.observe(this.element);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      this.intersectionObserver.unobserve(this.element);\n    }\n  }\n\n  intersect = (entries) => {\n    const lastEntry = entries.slice(-1)[0];\n    if (lastEntry?.isIntersecting) {\n      this.delegate.elementAppearedInViewport(this.element);\n    }\n  }\n}\n\nclass StreamMessage {\n  static contentType = \"text/vnd.turbo-stream.html\"\n\n  static wrap(message) {\n    if (typeof message == \"string\") {\n      return new this(createDocumentFragment(message))\n    } else {\n      return message\n    }\n  }\n\n  constructor(fragment) {\n    this.fragment = importStreamElements(fragment);\n  }\n}\n\nfunction importStreamElements(fragment) {\n  for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n    const streamElement = document.importNode(element, true);\n\n    for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n      inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n    }\n\n    element.replaceWith(streamElement);\n  }\n\n  return fragment\n}\n\nconst identity = key => key;\n\nclass LRUCache {\n  keys = []\n  entries = {}\n  #toCacheKey\n\n  constructor(size, toCacheKey = identity) {\n    this.size = size;\n    this.#toCacheKey = toCacheKey;\n  }\n\n  has(key) {\n    return this.#toCacheKey(key) in this.entries\n  }\n\n  get(key) {\n    if (this.has(key)) {\n      const entry = this.read(key);\n      this.touch(key);\n      return entry\n    }\n  }\n\n  put(key, entry) {\n    this.write(key, entry);\n    this.touch(key);\n    return entry\n  }\n\n  clear() {\n    for (const key of Object.keys(this.entries)) {\n      this.evict(key);\n    }\n  }\n\n  // Private\n\n  read(key) {\n    return this.entries[this.#toCacheKey(key)]\n  }\n\n  write(key, entry) {\n    this.entries[this.#toCacheKey(key)] = entry;\n  }\n\n  touch(key) {\n    key = this.#toCacheKey(key);\n    const index = this.keys.indexOf(key);\n    if (index > -1) this.keys.splice(index, 1);\n    this.keys.unshift(key);\n    this.trim();\n  }\n\n  trim() {\n    for (const key of this.keys.splice(this.size)) {\n      this.evict(key);\n    }\n  }\n\n  evict(key) {\n    delete this.entries[key];\n  }\n}\n\nconst PREFETCH_DELAY = 100;\n\nclass PrefetchCache extends LRUCache {\n  #prefetchTimeout = null\n  #maxAges = {}\n\n  constructor(size = 1, prefetchDelay = PREFETCH_DELAY) {\n    super(size, toCacheKey);\n    this.prefetchDelay = prefetchDelay;\n  }\n\n  putLater(url, request, ttl) {\n    this.#prefetchTimeout = setTimeout(() => {\n      request.perform();\n      this.put(url, request, ttl);\n      this.#prefetchTimeout = null;\n    }, this.prefetchDelay);\n  }\n\n  put(url, request, ttl = cacheTtl) {\n    super.put(url, request);\n    this.#maxAges[toCacheKey(url)] = new Date(new Date().getTime() + ttl);\n  }\n\n  clear() {\n    super.clear();\n    if (this.#prefetchTimeout) clearTimeout(this.#prefetchTimeout);\n  }\n\n  evict(key) {\n    super.evict(key);\n    delete this.#maxAges[key];\n  }\n\n  has(key) {\n    if (super.has(key)) {\n      const maxAge = this.#maxAges[toCacheKey(key)];\n\n      return maxAge && maxAge > Date.now()\n    } else {\n      return false\n    }\n  }\n}\n\nconst cacheTtl = 10 * 1000;\nconst prefetchCache = new PrefetchCache();\n\nconst FormSubmissionState = {\n  initialized: \"initialized\",\n  requesting: \"requesting\",\n  waiting: \"waiting\",\n  receiving: \"receiving\",\n  stopping: \"stopping\",\n  stopped: \"stopped\"\n};\n\nclass FormSubmission {\n  state = FormSubmissionState.initialized\n\n  static confirmMethod(message) {\n    return Promise.resolve(confirm(message))\n  }\n\n  constructor(delegate, formElement, submitter, mustRedirect = false) {\n    const method = getMethod(formElement, submitter);\n    const action = getAction(getFormAction(formElement, submitter), method);\n    const body = buildFormData(formElement, submitter);\n    const enctype = getEnctype(formElement, submitter);\n\n    this.delegate = delegate;\n    this.formElement = formElement;\n    this.submitter = submitter;\n    this.fetchRequest = new FetchRequest(this, method, action, body, formElement, enctype);\n    this.mustRedirect = mustRedirect;\n  }\n\n  get method() {\n    return this.fetchRequest.method\n  }\n\n  set method(value) {\n    this.fetchRequest.method = value;\n  }\n\n  get action() {\n    return this.fetchRequest.url.toString()\n  }\n\n  set action(value) {\n    this.fetchRequest.url = expandURL(value);\n  }\n\n  get body() {\n    return this.fetchRequest.body\n  }\n\n  get enctype() {\n    return this.fetchRequest.enctype\n  }\n\n  get isSafe() {\n    return this.fetchRequest.isSafe\n  }\n\n  get location() {\n    return this.fetchRequest.url\n  }\n\n  // The submission process\n\n  async start() {\n    const { initialized, requesting } = FormSubmissionState;\n    const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n\n    if (typeof confirmationMessage === \"string\") {\n      const confirmMethod = typeof config.forms.confirm === \"function\" ?\n        config.forms.confirm :\n        FormSubmission.confirmMethod;\n\n      const answer = await confirmMethod(confirmationMessage, this.formElement, this.submitter);\n      if (!answer) {\n        return\n      }\n    }\n\n    if (this.state == initialized) {\n      this.state = requesting;\n      return this.fetchRequest.perform()\n    }\n  }\n\n  stop() {\n    const { stopping, stopped } = FormSubmissionState;\n    if (this.state != stopping && this.state != stopped) {\n      this.state = stopping;\n      this.fetchRequest.cancel();\n      return true\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (!request.isSafe) {\n      const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n      if (token) {\n        request.headers[\"X-CSRF-Token\"] = token;\n      }\n    }\n\n    if (this.requestAcceptsTurboStreamResponse(request)) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    this.state = FormSubmissionState.waiting;\n    if (this.submitter) config.forms.submitter.beforeSubmit(this.submitter);\n    this.setSubmitsWith();\n    markAsBusy(this.formElement);\n    dispatch(\"turbo:submit-start\", {\n      target: this.formElement,\n      detail: { formSubmission: this }\n    });\n    this.delegate.formSubmissionStarted(this);\n  }\n\n  requestPreventedHandlingResponse(request, response) {\n    prefetchCache.clear();\n\n    this.result = { success: response.succeeded, fetchResponse: response };\n  }\n\n  requestSucceededWithResponse(request, response) {\n    if (response.clientError || response.serverError) {\n      this.delegate.formSubmissionFailedWithResponse(this, response);\n      return\n    }\n\n    prefetchCache.clear();\n\n    if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n      const error = new Error(\"Form responses must redirect to another location\");\n      this.delegate.formSubmissionErrored(this, error);\n    } else {\n      this.state = FormSubmissionState.receiving;\n      this.result = { success: true, fetchResponse: response };\n      this.delegate.formSubmissionSucceededWithResponse(this, response);\n    }\n  }\n\n  requestFailedWithResponse(request, response) {\n    this.result = { success: false, fetchResponse: response };\n    this.delegate.formSubmissionFailedWithResponse(this, response);\n  }\n\n  requestErrored(request, error) {\n    this.result = { success: false, error };\n    this.delegate.formSubmissionErrored(this, error);\n  }\n\n  requestFinished(_request) {\n    this.state = FormSubmissionState.stopped;\n    if (this.submitter) config.forms.submitter.afterSubmit(this.submitter);\n    this.resetSubmitterText();\n    clearBusyState(this.formElement);\n    dispatch(\"turbo:submit-end\", {\n      target: this.formElement,\n      detail: { formSubmission: this, ...this.result }\n    });\n    this.delegate.formSubmissionFinished(this);\n  }\n\n  // Private\n\n  setSubmitsWith() {\n    if (!this.submitter || !this.submitsWith) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.originalSubmitText = this.submitter.innerHTML;\n      this.submitter.innerHTML = this.submitsWith;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      this.originalSubmitText = input.value;\n      input.value = this.submitsWith;\n    }\n  }\n\n  resetSubmitterText() {\n    if (!this.submitter || !this.originalSubmitText) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.submitter.innerHTML = this.originalSubmitText;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      input.value = this.originalSubmitText;\n    }\n  }\n\n  requestMustRedirect(request) {\n    return !request.isSafe && this.mustRedirect\n  }\n\n  requestAcceptsTurboStreamResponse(request) {\n    return !request.isSafe || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement)\n  }\n\n  get submitsWith() {\n    return this.submitter?.getAttribute(\"data-turbo-submits-with\")\n  }\n}\n\nfunction buildFormData(formElement, submitter) {\n  const formData = new FormData(formElement);\n  const name = submitter?.getAttribute(\"name\");\n  const value = submitter?.getAttribute(\"value\");\n\n  if (name) {\n    formData.append(name, value || \"\");\n  }\n\n  return formData\n}\n\nfunction getCookieValue(cookieName) {\n  if (cookieName != null) {\n    const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n    const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n    if (cookie) {\n      const value = cookie.split(\"=\").slice(1).join(\"=\");\n      return value ? decodeURIComponent(value) : undefined\n    }\n  }\n}\n\nfunction responseSucceededWithoutRedirect(response) {\n  return response.statusCode == 200 && !response.redirected\n}\n\nfunction getFormAction(formElement, submitter) {\n  const formElementAction = typeof formElement.action === \"string\" ? formElement.action : null;\n\n  if (submitter?.hasAttribute(\"formaction\")) {\n    return submitter.getAttribute(\"formaction\") || \"\"\n  } else {\n    return formElement.getAttribute(\"action\") || formElementAction || \"\"\n  }\n}\n\nfunction getAction(formAction, fetchMethod) {\n  const action = expandURL(formAction);\n\n  if (isSafe(fetchMethod)) {\n    action.search = \"\";\n  }\n\n  return action\n}\n\nfunction getMethod(formElement, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || formElement.getAttribute(\"method\") || \"\";\n  return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get\n}\n\nfunction getEnctype(formElement, submitter) {\n  return fetchEnctypeFromString(submitter?.getAttribute(\"formenctype\") || formElement.enctype)\n}\n\nclass Snapshot {\n  constructor(element) {\n    this.element = element;\n  }\n\n  get activeElement() {\n    return this.element.ownerDocument.activeElement\n  }\n\n  get children() {\n    return [...this.element.children]\n  }\n\n  hasAnchor(anchor) {\n    return this.getElementForAnchor(anchor) != null\n  }\n\n  getElementForAnchor(anchor) {\n    return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null\n  }\n\n  get isConnected() {\n    return this.element.isConnected\n  }\n\n  get firstAutofocusableElement() {\n    return queryAutofocusableElement(this.element)\n  }\n\n  get permanentElements() {\n    return queryPermanentElementsAll(this.element)\n  }\n\n  getPermanentElementById(id) {\n    return getPermanentElementById(this.element, id)\n  }\n\n  getPermanentElementMapForSnapshot(snapshot) {\n    const permanentElementMap = {};\n\n    for (const currentPermanentElement of this.permanentElements) {\n      const { id } = currentPermanentElement;\n      const newPermanentElement = snapshot.getPermanentElementById(id);\n      if (newPermanentElement) {\n        permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n      }\n    }\n\n    return permanentElementMap\n  }\n}\n\nfunction getPermanentElementById(node, id) {\n  return node.querySelector(`#${id}[data-turbo-permanent]`)\n}\n\nfunction queryPermanentElementsAll(node) {\n  return node.querySelectorAll(\"[id][data-turbo-permanent]\")\n}\n\nclass FormSubmitObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n      this.started = false;\n    }\n  }\n\n  submitCaptured = () => {\n    this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n    this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n  }\n\n  submitBubbled = (event) => {\n    if (!event.defaultPrevented) {\n      const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n      const submitter = event.submitter || undefined;\n\n      if (\n        form &&\n        submissionDoesNotDismissDialog(form, submitter) &&\n        submissionDoesNotTargetIFrame(form, submitter) &&\n        this.delegate.willSubmitForm(form, submitter)\n      ) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        this.delegate.formSubmitted(form, submitter);\n      }\n    }\n  }\n}\n\nfunction submissionDoesNotDismissDialog(form, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || form.getAttribute(\"method\");\n\n  return method != \"dialog\"\n}\n\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n  const target = submitter?.getAttribute(\"formtarget\") || form.getAttribute(\"target\");\n\n  return doesNotTargetIFrame(target)\n}\n\nclass View {\n  #resolveRenderPromise = (_value) => {}\n  #resolveInterceptionPromise = (_value) => {}\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  // Scrolling\n\n  scrollToAnchor(anchor) {\n    const element = this.snapshot.getElementForAnchor(anchor);\n    if (element) {\n      this.focusElement(element);\n      this.scrollToElement(element);\n    } else {\n      this.scrollToPosition({ x: 0, y: 0 });\n    }\n  }\n\n  scrollToAnchorFromLocation(location) {\n    this.scrollToAnchor(getAnchor(location));\n  }\n\n  scrollToElement(element) {\n    element.scrollIntoView();\n  }\n\n  focusElement(element) {\n    if (element instanceof HTMLElement) {\n      if (element.hasAttribute(\"tabindex\")) {\n        element.focus();\n      } else {\n        element.setAttribute(\"tabindex\", \"-1\");\n        element.focus();\n        element.removeAttribute(\"tabindex\");\n      }\n    }\n  }\n\n  scrollToPosition({ x, y }) {\n    this.scrollRoot.scrollTo(x, y);\n  }\n\n  scrollToTop() {\n    this.scrollToPosition({ x: 0, y: 0 });\n  }\n\n  get scrollRoot() {\n    return window\n  }\n\n  // Rendering\n\n  async render(renderer) {\n    const { isPreview, shouldRender, willRender, newSnapshot: snapshot } = renderer;\n\n    // A workaround to ignore tracked element mismatch reloads when performing\n    // a promoted Visit from a frame navigation\n    const shouldInvalidate = willRender;\n\n    if (shouldRender) {\n      try {\n        this.renderPromise = new Promise((resolve) => (this.#resolveRenderPromise = resolve));\n        this.renderer = renderer;\n        await this.prepareToRenderSnapshot(renderer);\n\n        const renderInterception = new Promise((resolve) => (this.#resolveInterceptionPromise = resolve));\n        const options = { resume: this.#resolveInterceptionPromise, render: this.renderer.renderElement, renderMethod: this.renderer.renderMethod };\n        const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n        if (!immediateRender) await renderInterception;\n\n        await this.renderSnapshot(renderer);\n        this.delegate.viewRenderedSnapshot(snapshot, isPreview, this.renderer.renderMethod);\n        this.delegate.preloadOnLoadLinksForView(this.element);\n        this.finishRenderingSnapshot(renderer);\n      } finally {\n        delete this.renderer;\n        this.#resolveRenderPromise(undefined);\n        delete this.renderPromise;\n      }\n    } else if (shouldInvalidate) {\n      this.invalidate(renderer.reloadReason);\n    }\n  }\n\n  invalidate(reason) {\n    this.delegate.viewInvalidated(reason);\n  }\n\n  async prepareToRenderSnapshot(renderer) {\n    this.markAsPreview(renderer.isPreview);\n    await renderer.prepareToRender();\n  }\n\n  markAsPreview(isPreview) {\n    if (isPreview) {\n      this.element.setAttribute(\"data-turbo-preview\", \"\");\n    } else {\n      this.element.removeAttribute(\"data-turbo-preview\");\n    }\n  }\n\n  markVisitDirection(direction) {\n    this.element.setAttribute(\"data-turbo-visit-direction\", direction);\n  }\n\n  unmarkVisitDirection() {\n    this.element.removeAttribute(\"data-turbo-visit-direction\");\n  }\n\n  async renderSnapshot(renderer) {\n    await renderer.render();\n  }\n\n  finishRenderingSnapshot(renderer) {\n    renderer.finishRendering();\n  }\n}\n\nclass FrameView extends View {\n  missing() {\n    this.element.innerHTML = `<strong class=\"turbo-frame-error\">Content missing</strong>`;\n  }\n\n  get snapshot() {\n    return new Snapshot(this.element)\n  }\n}\n\nclass LinkInterceptor {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  start() {\n    this.element.addEventListener(\"click\", this.clickBubbled);\n    document.addEventListener(\"turbo:click\", this.linkClicked);\n    document.addEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  stop() {\n    this.element.removeEventListener(\"click\", this.clickBubbled);\n    document.removeEventListener(\"turbo:click\", this.linkClicked);\n    document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  clickBubbled = (event) => {\n    if (this.clickEventIsSignificant(event)) {\n      this.clickEvent = event;\n    } else {\n      delete this.clickEvent;\n    }\n  }\n\n  linkClicked = (event) => {\n    if (this.clickEvent && this.clickEventIsSignificant(event)) {\n      if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n        this.clickEvent.preventDefault();\n        event.preventDefault();\n        this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n      }\n    }\n    delete this.clickEvent;\n  }\n\n  willVisit = (_event) => {\n    delete this.clickEvent;\n  }\n\n  clickEventIsSignificant(event) {\n    const target = event.composed ? event.target?.parentElement : event.target;\n    const element = findLinkFromClickTarget(target) || target;\n\n    return element instanceof Element && element.closest(\"turbo-frame, html\") == this.element\n  }\n}\n\nclass LinkClickObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n      this.started = false;\n    }\n  }\n\n  clickCaptured = () => {\n    this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n    this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n  }\n\n  clickBubbled = (event) => {\n    if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n      const target = (event.composedPath && event.composedPath()[0]) || event.target;\n      const link = findLinkFromClickTarget(target);\n      if (link && doesNotTargetIFrame(link.target)) {\n        const location = getLocationForLink(link);\n        if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n          event.preventDefault();\n          this.delegate.followedLinkToLocation(link, location);\n        }\n      }\n    }\n  }\n\n  clickEventIsSignificant(event) {\n    return !(\n      (event.target && event.target.isContentEditable) ||\n      event.defaultPrevented ||\n      event.which > 1 ||\n      event.altKey ||\n      event.ctrlKey ||\n      event.metaKey ||\n      event.shiftKey\n    )\n  }\n}\n\nclass FormLinkClickObserver {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.linkInterceptor = new LinkClickObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n  }\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return false\n  }\n\n  prefetchAndCacheRequestToLocation(link, location) {\n    return\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, originalEvent) {\n    return (\n      this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n      (link.hasAttribute(\"data-turbo-method\") || link.hasAttribute(\"data-turbo-stream\"))\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const form = document.createElement(\"form\");\n\n    const type = \"hidden\";\n    for (const [name, value] of location.searchParams) {\n      form.append(Object.assign(document.createElement(\"input\"), { type, name, value }));\n    }\n\n    const action = Object.assign(location, { search: \"\" });\n    form.setAttribute(\"data-turbo\", \"true\");\n    form.setAttribute(\"action\", action.href);\n    form.setAttribute(\"hidden\", \"\");\n\n    const method = link.getAttribute(\"data-turbo-method\");\n    if (method) form.setAttribute(\"method\", method);\n\n    const turboFrame = link.getAttribute(\"data-turbo-frame\");\n    if (turboFrame) form.setAttribute(\"data-turbo-frame\", turboFrame);\n\n    const turboAction = getVisitAction(link);\n    if (turboAction) form.setAttribute(\"data-turbo-action\", turboAction);\n\n    const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n    if (turboConfirm) form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n\n    const turboStream = link.hasAttribute(\"data-turbo-stream\");\n    if (turboStream) form.setAttribute(\"data-turbo-stream\", \"\");\n\n    this.delegate.submittedFormLinkToLocation(link, location, form);\n\n    document.body.appendChild(form);\n    form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n    requestAnimationFrame(() => form.requestSubmit());\n  }\n}\n\nclass Bardo {\n  static async preservingPermanentElements(delegate, permanentElementMap, callback) {\n    const bardo = new this(delegate, permanentElementMap);\n    bardo.enter();\n    await callback();\n    bardo.leave();\n  }\n\n  constructor(delegate, permanentElementMap) {\n    this.delegate = delegate;\n    this.permanentElementMap = permanentElementMap;\n  }\n\n  enter() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n      this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n      this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n    }\n  }\n\n  leave() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement] = this.permanentElementMap[id];\n      this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n      this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n      this.delegate.leavingBardo(currentPermanentElement);\n    }\n  }\n\n  replaceNewPermanentElementWithPlaceholder(permanentElement) {\n    const placeholder = createPlaceholderForPermanentElement(permanentElement);\n    permanentElement.replaceWith(placeholder);\n  }\n\n  replaceCurrentPermanentElementWithClone(permanentElement) {\n    const clone = permanentElement.cloneNode(true);\n    permanentElement.replaceWith(clone);\n  }\n\n  replacePlaceholderWithPermanentElement(permanentElement) {\n    const placeholder = this.getPlaceholderById(permanentElement.id);\n    placeholder?.replaceWith(permanentElement);\n  }\n\n  getPlaceholderById(id) {\n    return this.placeholders.find((element) => element.content == id)\n  }\n\n  get placeholders() {\n    return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")]\n  }\n}\n\nfunction createPlaceholderForPermanentElement(permanentElement) {\n  const element = document.createElement(\"meta\");\n  element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n  element.setAttribute(\"content\", permanentElement.id);\n  return element\n}\n\nclass Renderer {\n  #activeElement = null\n\n  static renderElement(currentElement, newElement) {\n    // Abstract method\n  }\n\n  constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n    this.currentSnapshot = currentSnapshot;\n    this.newSnapshot = newSnapshot;\n    this.isPreview = isPreview;\n    this.willRender = willRender;\n    this.renderElement = this.constructor.renderElement;\n    this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  get shouldAutofocus() {\n    return true\n  }\n\n  get reloadReason() {\n    return\n  }\n\n  prepareToRender() {\n    return\n  }\n\n  render() {\n    // Abstract method\n  }\n\n  finishRendering() {\n    if (this.resolvingFunctions) {\n      this.resolvingFunctions.resolve();\n      delete this.resolvingFunctions;\n    }\n  }\n\n  async preservingPermanentElements(callback) {\n    await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n  }\n\n  focusFirstAutofocusableElement() {\n    if (this.shouldAutofocus) {\n      const element = this.connectedSnapshot.firstAutofocusableElement;\n      if (element) {\n        element.focus();\n      }\n    }\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement) {\n    if (this.#activeElement) return\n\n    if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n      this.#activeElement = this.currentSnapshot.activeElement;\n    }\n  }\n\n  leavingBardo(currentPermanentElement) {\n    if (currentPermanentElement.contains(this.#activeElement) && this.#activeElement instanceof HTMLElement) {\n      this.#activeElement.focus();\n\n      this.#activeElement = null;\n    }\n  }\n\n  get connectedSnapshot() {\n    return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot\n  }\n\n  get currentElement() {\n    return this.currentSnapshot.element\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  get permanentElementMap() {\n    return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)\n  }\n\n  get renderMethod() {\n    return \"replace\"\n  }\n}\n\nclass FrameRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const destinationRange = document.createRange();\n    destinationRange.selectNodeContents(currentElement);\n    destinationRange.deleteContents();\n\n    const frameElement = newElement;\n    const sourceRange = frameElement.ownerDocument?.createRange();\n    if (sourceRange) {\n      sourceRange.selectNodeContents(frameElement);\n      currentElement.appendChild(sourceRange.extractContents());\n    }\n  }\n\n  constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n    super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n    this.delegate = delegate;\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  async render() {\n    await nextRepaint();\n    this.preservingPermanentElements(() => {\n      this.loadFrameElement();\n    });\n    this.scrollFrameIntoView();\n    await nextRepaint();\n    this.focusFirstAutofocusableElement();\n    await nextRepaint();\n    this.activateScriptElements();\n  }\n\n  loadFrameElement() {\n    this.delegate.willRenderFrame(this.currentElement, this.newElement);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  scrollFrameIntoView() {\n    if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n      const element = this.currentElement.firstElementChild;\n      const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n      const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n\n      if (element) {\n        element.scrollIntoView({ block, behavior });\n        return true\n      }\n    }\n    return false\n  }\n\n  activateScriptElements() {\n    for (const inertScriptElement of this.newScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  get newScriptElements() {\n    return this.currentElement.querySelectorAll(\"script\")\n  }\n}\n\nfunction readScrollLogicalPosition(value, defaultValue) {\n  if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\nfunction readScrollBehavior(value, defaultValue) {\n  if (value == \"auto\" || value == \"smooth\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\n/**\n * @typedef {object} ConfigHead\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} [style]\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {function(Element): boolean} [shouldPreserve]\n * @property {function(Element): boolean} [shouldReAppend]\n * @property {function(Element): boolean} [shouldRemove]\n * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed]\n */\n\n/**\n * @typedef {object} ConfigCallbacks\n *\n * @property {function(Node): boolean} [beforeNodeAdded]\n * @property {function(Node): void} [afterNodeAdded]\n * @property {function(Element, Node): boolean} [beforeNodeMorphed]\n * @property {function(Element, Node): void} [afterNodeMorphed]\n * @property {function(Element): boolean} [beforeNodeRemoved]\n * @property {function(Element): void} [afterNodeRemoved]\n * @property {function(string, Element, \"update\" | \"remove\"): boolean} [beforeAttributeUpdated]\n */\n\n/**\n * @typedef {object} Config\n *\n * @property {'outerHTML' | 'innerHTML'} [morphStyle]\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacks} [callbacks]\n * @property {ConfigHead} [head]\n */\n\n/**\n * @typedef {function} NoOp\n *\n * @returns {void}\n */\n\n/**\n * @typedef {object} ConfigHeadInternal\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} style\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {(function(Element): boolean) | NoOp} shouldPreserve\n * @property {(function(Element): boolean) | NoOp} shouldReAppend\n * @property {(function(Element): boolean) | NoOp} shouldRemove\n * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed\n */\n\n/**\n * @typedef {object} ConfigCallbacksInternal\n *\n * @property {(function(Node): boolean) | NoOp} beforeNodeAdded\n * @property {(function(Node): void) | NoOp} afterNodeAdded\n * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed\n * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed\n * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved\n * @property {(function(Node): void) | NoOp} afterNodeRemoved\n * @property {(function(string, Element, \"update\" | \"remove\"): boolean) | NoOp} beforeAttributeUpdated\n */\n\n/**\n * @typedef {object} ConfigInternal\n *\n * @property {'outerHTML' | 'innerHTML'} morphStyle\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacksInternal} callbacks\n * @property {ConfigHeadInternal} head\n */\n\n/**\n * @typedef {Object} IdSets\n * @property {Set<string>} persistentIds\n * @property {Map<Node, Set<string>>} idMap\n */\n\n/**\n * @typedef {Function} Morph\n *\n * @param {Element | Document} oldNode\n * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n * @param {Config} [config]\n * @returns {undefined | Node[]}\n */\n\n// base IIFE to define idiomorph\n/**\n *\n * @type {{defaults: ConfigInternal, morph: Morph}}\n */\nvar Idiomorph = (function () {\n\n  /**\n   * @typedef {object} MorphContext\n   *\n   * @property {Element} target\n   * @property {Element} newContent\n   * @property {ConfigInternal} config\n   * @property {ConfigInternal['morphStyle']} morphStyle\n   * @property {ConfigInternal['ignoreActive']} ignoreActive\n   * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue\n   * @property {ConfigInternal['restoreFocus']} restoreFocus\n   * @property {Map<Node, Set<string>>} idMap\n   * @property {Set<string>} persistentIds\n   * @property {ConfigInternal['callbacks']} callbacks\n   * @property {ConfigInternal['head']} head\n   * @property {HTMLDivElement} pantry\n   * @property {Element[]} activeElementAndParents\n   */\n\n  //=============================================================================\n  // AND NOW IT BEGINS...\n  //=============================================================================\n\n  const noOp = () => {};\n  /**\n   * Default configuration values, updatable by users now\n   * @type {ConfigInternal}\n   */\n  const defaults = {\n    morphStyle: \"outerHTML\",\n    callbacks: {\n      beforeNodeAdded: noOp,\n      afterNodeAdded: noOp,\n      beforeNodeMorphed: noOp,\n      afterNodeMorphed: noOp,\n      beforeNodeRemoved: noOp,\n      afterNodeRemoved: noOp,\n      beforeAttributeUpdated: noOp,\n    },\n    head: {\n      style: \"merge\",\n      shouldPreserve: (elt) => elt.getAttribute(\"im-preserve\") === \"true\",\n      shouldReAppend: (elt) => elt.getAttribute(\"im-re-append\") === \"true\",\n      shouldRemove: noOp,\n      afterHeadMorphed: noOp,\n    },\n    restoreFocus: true,\n  };\n\n  /**\n   * Core idiomorph function for morphing one DOM tree to another\n   *\n   * @param {Element | Document} oldNode\n   * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n   * @param {Config} [config]\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function morph(oldNode, newContent, config = {}) {\n    oldNode = normalizeElement(oldNode);\n    const newNode = normalizeParent(newContent);\n    const ctx = createMorphContext(oldNode, newNode, config);\n\n    const morphedNodes = saveAndRestoreFocus(ctx, () => {\n      return withHeadBlocking(\n        ctx,\n        oldNode,\n        newNode,\n        /** @param {MorphContext} ctx */ (ctx) => {\n          if (ctx.morphStyle === \"innerHTML\") {\n            morphChildren(ctx, oldNode, newNode);\n            return Array.from(oldNode.childNodes);\n          } else {\n            return morphOuterHTML(ctx, oldNode, newNode);\n          }\n        },\n      );\n    });\n\n    ctx.pantry.remove();\n    return morphedNodes;\n  }\n\n  /**\n   * Morph just the outerHTML of the oldNode to the newContent\n   * We have to be careful because the oldNode could have siblings which need to be untouched\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @returns {Node[]}\n   */\n  function morphOuterHTML(ctx, oldNode, newNode) {\n    const oldParent = normalizeParent(oldNode);\n    morphChildren(\n      ctx,\n      oldParent,\n      newNode,\n      // these two optional params are the secret sauce\n      oldNode, // start point for iteration\n      oldNode.nextSibling, // end point for iteration\n    );\n    // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed.\n    return Array.from(oldParent.childNodes);\n  }\n\n  /**\n   * @param {MorphContext} ctx\n   * @param {Function} fn\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function saveAndRestoreFocus(ctx, fn) {\n    if (!ctx.config.restoreFocus) return fn();\n    let activeElement =\n      /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ (\n        document.activeElement\n      );\n\n    // don't bother if the active element is not an input or textarea\n    if (\n      !(\n        activeElement instanceof HTMLInputElement ||\n        activeElement instanceof HTMLTextAreaElement\n      )\n    ) {\n      return fn();\n    }\n\n    const { id: activeElementId, selectionStart, selectionEnd } = activeElement;\n\n    const results = fn();\n\n    if (\n      activeElementId &&\n      activeElementId !== document.activeElement?.getAttribute(\"id\")\n    ) {\n      activeElement = ctx.target.querySelector(`[id=\"${activeElementId}\"]`);\n      activeElement?.focus();\n    }\n    if (activeElement && !activeElement.selectionEnd && selectionEnd) {\n      activeElement.setSelectionRange(selectionStart, selectionEnd);\n    }\n\n    return results;\n  }\n\n  const morphChildren = (function () {\n    /**\n     * This is the core algorithm for matching up children.  The idea is to use id sets to try to match up\n     * nodes as faithfully as possible.  We greedily match, which allows us to keep the algorithm fast, but\n     * by using id sets, we are able to better match up with content deeper in the DOM.\n     *\n     * Basic algorithm:\n     * - for each node in the new content:\n     *   - search self and siblings for an id set match, falling back to a soft match\n     *   - if match found\n     *     - remove any nodes up to the match:\n     *       - pantry persistent nodes\n     *       - delete the rest\n     *     - morph the match\n     *   - elsif no match found, and node is persistent\n     *     - find its match by querying the old root (future) and pantry (past)\n     *     - move it and its children here\n     *     - morph it\n     *   - else\n     *     - create a new node from scratch as a last result\n     *\n     * @param {MorphContext} ctx the merge context\n     * @param {Element} oldParent the old content that we are merging the new content into\n     * @param {Element} newParent the parent element of the new content\n     * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child)\n     * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child)\n     */\n    function morphChildren(\n      ctx,\n      oldParent,\n      newParent,\n      insertionPoint = null,\n      endPoint = null,\n    ) {\n      // normalize\n      if (\n        oldParent instanceof HTMLTemplateElement &&\n        newParent instanceof HTMLTemplateElement\n      ) {\n        // @ts-ignore we can pretend the DocumentFragment is an Element\n        oldParent = oldParent.content;\n        // @ts-ignore ditto\n        newParent = newParent.content;\n      }\n      insertionPoint ||= oldParent.firstChild;\n\n      // run through all the new content\n      for (const newChild of newParent.childNodes) {\n        // once we reach the end of the old parent content skip to the end and insert the rest\n        if (insertionPoint && insertionPoint != endPoint) {\n          const bestMatch = findBestMatch(\n            ctx,\n            newChild,\n            insertionPoint,\n            endPoint,\n          );\n          if (bestMatch) {\n            // if the node to morph is not at the insertion point then remove/move up to it\n            if (bestMatch !== insertionPoint) {\n              removeNodesBetween(ctx, insertionPoint, bestMatch);\n            }\n            morphNode(bestMatch, newChild, ctx);\n            insertionPoint = bestMatch.nextSibling;\n            continue;\n          }\n        }\n\n        // if the matching node is elsewhere in the original content\n        if (newChild instanceof Element) {\n          // we can pretend the id is non-null because the next `.has` line will reject it if not\n          const newChildId = /** @type {String} */ (\n            newChild.getAttribute(\"id\")\n          );\n          if (ctx.persistentIds.has(newChildId)) {\n            // move it and all its children here and morph\n            const movedChild = moveBeforeById(\n              oldParent,\n              newChildId,\n              insertionPoint,\n              ctx,\n            );\n            morphNode(movedChild, newChild, ctx);\n            insertionPoint = movedChild.nextSibling;\n            continue;\n          }\n        }\n\n        // last resort: insert the new node from scratch\n        const insertedNode = createNode(\n          oldParent,\n          newChild,\n          insertionPoint,\n          ctx,\n        );\n        // could be null if beforeNodeAdded prevented insertion\n        if (insertedNode) {\n          insertionPoint = insertedNode.nextSibling;\n        }\n      }\n\n      // remove any remaining old nodes that didn't match up with new content\n      while (insertionPoint && insertionPoint != endPoint) {\n        const tempNode = insertionPoint;\n        insertionPoint = insertionPoint.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n    }\n\n    /**\n     * This performs the action of inserting a new node while handling situations where the node contains\n     * elements with persistent ids and possible state info we can still preserve by moving in and then morphing\n     *\n     * @param {Element} oldParent\n     * @param {Node} newChild\n     * @param {Node|null} insertionPoint\n     * @param {MorphContext} ctx\n     * @returns {Node|null}\n     */\n    function createNode(oldParent, newChild, insertionPoint, ctx) {\n      if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null;\n      if (ctx.idMap.has(newChild)) {\n        // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm\n        const newEmptyChild = document.createElement(\n          /** @type {Element} */ (newChild).tagName,\n        );\n        oldParent.insertBefore(newEmptyChild, insertionPoint);\n        morphNode(newEmptyChild, newChild, ctx);\n        ctx.callbacks.afterNodeAdded(newEmptyChild);\n        return newEmptyChild;\n      } else {\n        // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants\n        const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent\n        oldParent.insertBefore(newClonedChild, insertionPoint);\n        ctx.callbacks.afterNodeAdded(newClonedChild);\n        return newClonedChild;\n      }\n    }\n\n    //=============================================================================\n    // Matching Functions\n    //=============================================================================\n    const findBestMatch = (function () {\n      /**\n       * Scans forward from the startPoint to the endPoint looking for a match\n       * for the node. It looks for an id set match first, then a soft match.\n       * We abort softmatching if we find two future soft matches, to reduce churn.\n       * @param {Node} node\n       * @param {MorphContext} ctx\n       * @param {Node | null} startPoint\n       * @param {Node | null} endPoint\n       * @returns {Node | null}\n       */\n      function findBestMatch(ctx, node, startPoint, endPoint) {\n        let softMatch = null;\n        let nextSibling = node.nextSibling;\n        let siblingSoftMatchCount = 0;\n\n        let cursor = startPoint;\n        while (cursor && cursor != endPoint) {\n          // soft matching is a prerequisite for id set matching\n          if (isSoftMatch(cursor, node)) {\n            if (isIdSetMatch(ctx, cursor, node)) {\n              return cursor; // found an id set match, we're done!\n            }\n\n            // we haven't yet saved a soft match fallback\n            if (softMatch === null) {\n              // the current soft match will hard match something else in the future, leave it\n              if (!ctx.idMap.has(cursor)) {\n                // save this as the fallback if we get through the loop without finding a hard match\n                softMatch = cursor;\n              }\n            }\n          }\n          if (\n            softMatch === null &&\n            nextSibling &&\n            isSoftMatch(cursor, nextSibling)\n          ) {\n            // The next new node has a soft match with this node, so\n            // increment the count of future soft matches\n            siblingSoftMatchCount++;\n            nextSibling = nextSibling.nextSibling;\n\n            // If there are two future soft matches, block soft matching for this node to allow\n            // future siblings to soft match. This is to reduce churn in the DOM when an element\n            // is prepended.\n            if (siblingSoftMatchCount >= 2) {\n              softMatch = undefined;\n            }\n          }\n\n          // if the current node contains active element, stop looking for better future matches,\n          // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus\n          // @ts-ignore pretend cursor is Element rather than Node, we're just testing for array inclusion\n          if (ctx.activeElementAndParents.includes(cursor)) break;\n\n          cursor = cursor.nextSibling;\n        }\n\n        return softMatch || null;\n      }\n\n      /**\n       *\n       * @param {MorphContext} ctx\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isIdSetMatch(ctx, oldNode, newNode) {\n        let oldSet = ctx.idMap.get(oldNode);\n        let newSet = ctx.idMap.get(newNode);\n\n        if (!newSet || !oldSet) return false;\n\n        for (const id of oldSet) {\n          // a potential match is an id in the new and old nodes that\n          // has not already been merged into the DOM\n          // But the newNode content we call this on has not been\n          // merged yet and we don't allow duplicate IDs so it is simple\n          if (newSet.has(id)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      /**\n       *\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isSoftMatch(oldNode, newNode) {\n        // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that.\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        return (\n          oldElt.nodeType === newElt.nodeType &&\n          oldElt.tagName === newElt.tagName &&\n          // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing.\n          // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n          // its not persistent, and new nodes can't have any hidden state.\n          // We can't use .id because of form input shadowing, and we can't count on .getAttribute's presence because it could be a document-fragment\n          (!oldElt.getAttribute?.(\"id\") ||\n            oldElt.getAttribute?.(\"id\") === newElt.getAttribute?.(\"id\"))\n        );\n      }\n\n      return findBestMatch;\n    })();\n\n    //=============================================================================\n    // DOM Manipulation Functions\n    //=============================================================================\n\n    /**\n     * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n     * - Persistent nodes will be moved to the pantry for later reuse\n     * - Other nodes will have their hooks called, and then are removed\n     * @param {MorphContext} ctx\n     * @param {Node} node\n     */\n    function removeNode(ctx, node) {\n      // are we going to id set match this later?\n      if (ctx.idMap.has(node)) {\n        // skip callbacks and move to pantry\n        moveBefore(ctx.pantry, node, null);\n      } else {\n        // remove for realsies\n        if (ctx.callbacks.beforeNodeRemoved(node) === false) return;\n        node.parentNode?.removeChild(node);\n        ctx.callbacks.afterNodeRemoved(node);\n      }\n    }\n\n    /**\n     * Remove nodes between the start and end nodes\n     * @param {MorphContext} ctx\n     * @param {Node} startInclusive\n     * @param {Node} endExclusive\n     * @returns {Node|null}\n     */\n    function removeNodesBetween(ctx, startInclusive, endExclusive) {\n      /** @type {Node | null} */\n      let cursor = startInclusive;\n      // remove nodes until the endExclusive node\n      while (cursor && cursor !== endExclusive) {\n        let tempNode = /** @type {Node} */ (cursor);\n        cursor = cursor.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n      return cursor;\n    }\n\n    /**\n     * Search for an element by id within the document and pantry, and move it using moveBefore.\n     *\n     * @param {Element} parentNode - The parent node to which the element will be moved.\n     * @param {string} id - The ID of the element to be moved.\n     * @param {Node | null} after - The reference node to insert the element before.\n     *                              If `null`, the element is appended as the last child.\n     * @param {MorphContext} ctx\n     * @returns {Element} The found element\n     */\n    function moveBeforeById(parentNode, id, after, ctx) {\n      const target =\n        /** @type {Element} - will always be found */\n        (\n          // ctx.target.id unsafe because of form input shadowing\n          // ctx.target could be a document fragment which doesn't have `getAttribute`\n          (ctx.target.getAttribute?.(\"id\") === id && ctx.target) ||\n            ctx.target.querySelector(`[id=\"${id}\"]`) ||\n            ctx.pantry.querySelector(`[id=\"${id}\"]`)\n        );\n      removeElementFromAncestorsIdMaps(target, ctx);\n      moveBefore(parentNode, target, after);\n      return target;\n    }\n\n    /**\n     * Removes an element from its ancestors' id maps. This is needed when an element is moved from the\n     * \"future\" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the\n     * pantry rather than being deleted, preventing their removal hooks from being called.\n     *\n     * @param {Element} element - element to remove from its ancestors' id maps\n     * @param {MorphContext} ctx\n     */\n    function removeElementFromAncestorsIdMaps(element, ctx) {\n      // we know id is non-null String, because this function is only called on elements with ids\n      const id = /** @type {String} */ (element.getAttribute(\"id\"));\n      /** @ts-ignore - safe to loop in this way **/\n      while ((element = element.parentNode)) {\n        let idSet = ctx.idMap.get(element);\n        if (idSet) {\n          idSet.delete(id);\n          if (!idSet.size) {\n            ctx.idMap.delete(element);\n          }\n        }\n      }\n    }\n\n    /**\n     * Moves an element before another element within the same parent.\n     * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n     * This is essentialy a forward-compat wrapper.\n     *\n     * @param {Element} parentNode - The parent node containing the after element.\n     * @param {Node} element - The element to be moved.\n     * @param {Node | null} after - The reference node to insert `element` before.\n     *                              If `null`, `element` is appended as the last child.\n     */\n    function moveBefore(parentNode, element, after) {\n      // @ts-ignore - use proposed moveBefore feature\n      if (parentNode.moveBefore) {\n        try {\n          // @ts-ignore - use proposed moveBefore feature\n          parentNode.moveBefore(element, after);\n        } catch (e) {\n          // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry\n          parentNode.insertBefore(element, after);\n        }\n      } else {\n        parentNode.insertBefore(element, after);\n      }\n    }\n\n    return morphChildren;\n  })();\n\n  //=============================================================================\n  // Single Node Morphing Code\n  //=============================================================================\n  const morphNode = (function () {\n    /**\n     * @param {Node} oldNode root node to merge content into\n     * @param {Node} newContent new content to merge\n     * @param {MorphContext} ctx the merge context\n     * @returns {Node | null} the element that ended up in the DOM\n     */\n    function morphNode(oldNode, newContent, ctx) {\n      if (ctx.ignoreActive && oldNode === document.activeElement) {\n        // don't morph focused element\n        return null;\n      }\n\n      if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) {\n        return oldNode;\n      }\n\n      if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if (\n        oldNode instanceof HTMLHeadElement &&\n        ctx.head.style !== \"morph\"\n      ) {\n        // ok to cast: if newContent wasn't also a <head>, it would've got caught in the `!isSoftMatch` branch above\n        handleHeadElement(\n          oldNode,\n          /** @type {HTMLHeadElement} */ (newContent),\n          ctx,\n        );\n      } else {\n        morphAttributes(oldNode, newContent, ctx);\n        if (!ignoreValueOfActiveElement(oldNode, ctx)) {\n          // @ts-ignore newContent can be a node here because .firstChild will be null\n          morphChildren(ctx, oldNode, newContent);\n        }\n      }\n      ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n      return oldNode;\n    }\n\n    /**\n     * syncs the oldNode to the newNode, copying over all attributes and\n     * inner element state from the newNode to the oldNode\n     *\n     * @param {Node} oldNode the node to copy attributes & state to\n     * @param {Node} newNode the node to copy attributes & state from\n     * @param {MorphContext} ctx the merge context\n     */\n    function morphAttributes(oldNode, newNode, ctx) {\n      let type = newNode.nodeType;\n\n      // if is an element type, sync the attributes from the\n      // new node into the new node\n      if (type === 1 /* element type */) {\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        const oldAttributes = oldElt.attributes;\n        const newAttributes = newElt.attributes;\n        for (const newAttribute of newAttributes) {\n          if (ignoreAttribute(newAttribute.name, oldElt, \"update\", ctx)) {\n            continue;\n          }\n          if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) {\n            oldElt.setAttribute(newAttribute.name, newAttribute.value);\n          }\n        }\n        // iterate backwards to avoid skipping over items when a delete occurs\n        for (let i = oldAttributes.length - 1; 0 <= i; i--) {\n          const oldAttribute = oldAttributes[i];\n\n          // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe\n          // e.g. custom element attribute callbacks can remove other attributes\n          if (!oldAttribute) continue;\n\n          if (!newElt.hasAttribute(oldAttribute.name)) {\n            if (ignoreAttribute(oldAttribute.name, oldElt, \"remove\", ctx)) {\n              continue;\n            }\n            oldElt.removeAttribute(oldAttribute.name);\n          }\n        }\n\n        if (!ignoreValueOfActiveElement(oldElt, ctx)) {\n          syncInputValue(oldElt, newElt, ctx);\n        }\n      }\n\n      // sync text nodes\n      if (type === 8 /* comment */ || type === 3 /* text */) {\n        if (oldNode.nodeValue !== newNode.nodeValue) {\n          oldNode.nodeValue = newNode.nodeValue;\n        }\n      }\n    }\n\n    /**\n     * NB: many bothans died to bring us information:\n     *\n     *  https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n     *  https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113\n     *\n     * @param {Element} oldElement the element to sync the input value to\n     * @param {Element} newElement the element to sync the input value from\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncInputValue(oldElement, newElement, ctx) {\n      if (\n        oldElement instanceof HTMLInputElement &&\n        newElement instanceof HTMLInputElement &&\n        newElement.type !== \"file\"\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n\n        // sync boolean attributes\n        syncBooleanAttribute(oldElement, newElement, \"checked\", ctx);\n        syncBooleanAttribute(oldElement, newElement, \"disabled\", ctx);\n\n        if (!newElement.hasAttribute(\"value\")) {\n          if (!ignoreAttribute(\"value\", oldElement, \"remove\", ctx)) {\n            oldElement.value = \"\";\n            oldElement.removeAttribute(\"value\");\n          }\n        } else if (oldValue !== newValue) {\n          if (!ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n            oldElement.setAttribute(\"value\", newValue);\n            oldElement.value = newValue;\n          }\n        }\n        // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why?\n        // did I break something?\n      } else if (\n        oldElement instanceof HTMLOptionElement &&\n        newElement instanceof HTMLOptionElement\n      ) {\n        syncBooleanAttribute(oldElement, newElement, \"selected\", ctx);\n      } else if (\n        oldElement instanceof HTMLTextAreaElement &&\n        newElement instanceof HTMLTextAreaElement\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n        if (ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n          return;\n        }\n        if (newValue !== oldValue) {\n          oldElement.value = newValue;\n        }\n        if (\n          oldElement.firstChild &&\n          oldElement.firstChild.nodeValue !== newValue\n        ) {\n          oldElement.firstChild.nodeValue = newValue;\n        }\n      }\n    }\n\n    /**\n     * @param {Element} oldElement element to write the value to\n     * @param {Element} newElement element to read the value from\n     * @param {string} attributeName the attribute name\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) {\n      // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n      const newLiveValue = newElement[attributeName],\n        // @ts-ignore ditto\n        oldLiveValue = oldElement[attributeName];\n      if (newLiveValue !== oldLiveValue) {\n        const ignoreUpdate = ignoreAttribute(\n          attributeName,\n          oldElement,\n          \"update\",\n          ctx,\n        );\n        if (!ignoreUpdate) {\n          // update attribute's associated DOM property\n          // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n          oldElement[attributeName] = newElement[attributeName];\n        }\n        if (newLiveValue) {\n          if (!ignoreUpdate) {\n            // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML\n            // this is the correct way to set a boolean attribute to \"true\"\n            oldElement.setAttribute(attributeName, \"\");\n          }\n        } else {\n          if (!ignoreAttribute(attributeName, oldElement, \"remove\", ctx)) {\n            oldElement.removeAttribute(attributeName);\n          }\n        }\n      }\n    }\n\n    /**\n     * @param {string} attr the attribute to be mutated\n     * @param {Element} element the element that is going to be updated\n     * @param {\"update\" | \"remove\"} updateType\n     * @param {MorphContext} ctx the merge context\n     * @returns {boolean} true if the attribute should be ignored, false otherwise\n     */\n    function ignoreAttribute(attr, element, updateType, ctx) {\n      if (\n        attr === \"value\" &&\n        ctx.ignoreActiveValue &&\n        element === document.activeElement\n      ) {\n        return true;\n      }\n      return (\n        ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) ===\n        false\n      );\n    }\n\n    /**\n     * @param {Node} possibleActiveElement\n     * @param {MorphContext} ctx\n     * @returns {boolean}\n     */\n    function ignoreValueOfActiveElement(possibleActiveElement, ctx) {\n      return (\n        !!ctx.ignoreActiveValue &&\n        possibleActiveElement === document.activeElement &&\n        possibleActiveElement !== document.body\n      );\n    }\n\n    return morphNode;\n  })();\n\n  //=============================================================================\n  // Head Management Functions\n  //=============================================================================\n  /**\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @param {function} callback\n   * @returns {Node[] | Promise<Node[]>}\n   */\n  function withHeadBlocking(ctx, oldNode, newNode, callback) {\n    if (ctx.head.block) {\n      const oldHead = oldNode.querySelector(\"head\");\n      const newHead = newNode.querySelector(\"head\");\n      if (oldHead && newHead) {\n        const promises = handleHeadElement(oldHead, newHead, ctx);\n        // when head promises resolve, proceed ignoring the head tag\n        return Promise.all(promises).then(() => {\n          const newCtx = Object.assign(ctx, {\n            head: {\n              block: false,\n              ignore: true,\n            },\n          });\n          return callback(newCtx);\n        });\n      }\n    }\n    // just proceed if we not head blocking\n    return callback(ctx);\n  }\n\n  /**\n   *  The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style\n   *\n   * @param {Element} oldHead\n   * @param {Element} newHead\n   * @param {MorphContext} ctx\n   * @returns {Promise<void>[]}\n   */\n  function handleHeadElement(oldHead, newHead, ctx) {\n    let added = [];\n    let removed = [];\n    let preserved = [];\n    let nodesToAppend = [];\n\n    // put all new head elements into a Map, by their outerHTML\n    let srcToNewHeadNodes = new Map();\n    for (const newHeadChild of newHead.children) {\n      srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild);\n    }\n\n    // for each elt in the current head\n    for (const currentHeadElt of oldHead.children) {\n      // If the current head element is in the map\n      let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML);\n      let isReAppended = ctx.head.shouldReAppend(currentHeadElt);\n      let isPreserved = ctx.head.shouldPreserve(currentHeadElt);\n      if (inNewContent || isPreserved) {\n        if (isReAppended) {\n          // remove the current version and let the new version replace it and re-execute\n          removed.push(currentHeadElt);\n        } else {\n          // this element already exists and should not be re-appended, so remove it from\n          // the new content map, preserving it in the DOM\n          srcToNewHeadNodes.delete(currentHeadElt.outerHTML);\n          preserved.push(currentHeadElt);\n        }\n      } else {\n        if (ctx.head.style === \"append\") {\n          // we are appending and this existing element is not new content\n          // so if and only if it is marked for re-append do we do anything\n          if (isReAppended) {\n            removed.push(currentHeadElt);\n            nodesToAppend.push(currentHeadElt);\n          }\n        } else {\n          // if this is a merge, we remove this content since it is not in the new head\n          if (ctx.head.shouldRemove(currentHeadElt) !== false) {\n            removed.push(currentHeadElt);\n          }\n        }\n      }\n    }\n\n    // Push the remaining new head elements in the Map into the\n    // nodes to append to the head tag\n    nodesToAppend.push(...srcToNewHeadNodes.values());\n\n    let promises = [];\n    for (const newNode of nodesToAppend) {\n      // TODO: This could theoretically be null, based on type\n      let newElt = /** @type {ChildNode} */ (\n        document.createRange().createContextualFragment(newNode.outerHTML)\n          .firstChild\n      );\n      if (ctx.callbacks.beforeNodeAdded(newElt) !== false) {\n        if (\n          (\"href\" in newElt && newElt.href) ||\n          (\"src\" in newElt && newElt.src)\n        ) {\n          /** @type {(result?: any) => void} */ let resolve;\n          let promise = new Promise(function (_resolve) {\n            resolve = _resolve;\n          });\n          newElt.addEventListener(\"load\", function () {\n            resolve();\n          });\n          promises.push(promise);\n        }\n        oldHead.appendChild(newElt);\n        ctx.callbacks.afterNodeAdded(newElt);\n        added.push(newElt);\n      }\n    }\n\n    // remove all removed elements, after we have appended the new elements to avoid\n    // additional network requests for things like style sheets\n    for (const removedElement of removed) {\n      if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) {\n        oldHead.removeChild(removedElement);\n        ctx.callbacks.afterNodeRemoved(removedElement);\n      }\n    }\n\n    ctx.head.afterHeadMorphed(oldHead, {\n      added: added,\n      kept: preserved,\n      removed: removed,\n    });\n    return promises;\n  }\n\n  //=============================================================================\n  // Create Morph Context Functions\n  //=============================================================================\n  const createMorphContext = (function () {\n    /**\n     *\n     * @param {Element} oldNode\n     * @param {Element} newContent\n     * @param {Config} config\n     * @returns {MorphContext}\n     */\n    function createMorphContext(oldNode, newContent, config) {\n      const { persistentIds, idMap } = createIdMaps(oldNode, newContent);\n\n      const mergedConfig = mergeDefaults(config);\n      const morphStyle = mergedConfig.morphStyle || \"outerHTML\";\n      if (![\"innerHTML\", \"outerHTML\"].includes(morphStyle)) {\n        throw `Do not understand how to morph style ${morphStyle}`;\n      }\n\n      return {\n        target: oldNode,\n        newContent: newContent,\n        config: mergedConfig,\n        morphStyle: morphStyle,\n        ignoreActive: mergedConfig.ignoreActive,\n        ignoreActiveValue: mergedConfig.ignoreActiveValue,\n        restoreFocus: mergedConfig.restoreFocus,\n        idMap: idMap,\n        persistentIds: persistentIds,\n        pantry: createPantry(),\n        activeElementAndParents: createActiveElementAndParents(oldNode),\n        callbacks: mergedConfig.callbacks,\n        head: mergedConfig.head,\n      };\n    }\n\n    /**\n     * Deep merges the config object and the Idiomorph.defaults object to\n     * produce a final configuration object\n     * @param {Config} config\n     * @returns {ConfigInternal}\n     */\n    function mergeDefaults(config) {\n      let finalConfig = Object.assign({}, defaults);\n\n      // copy top level stuff into final config\n      Object.assign(finalConfig, config);\n\n      // copy callbacks into final config (do this to deep merge the callbacks)\n      finalConfig.callbacks = Object.assign(\n        {},\n        defaults.callbacks,\n        config.callbacks,\n      );\n\n      // copy head config into final config  (do this to deep merge the head)\n      finalConfig.head = Object.assign({}, defaults.head, config.head);\n\n      return finalConfig;\n    }\n\n    /**\n     * @returns {HTMLDivElement}\n     */\n    function createPantry() {\n      const pantry = document.createElement(\"div\");\n      pantry.hidden = true;\n      document.body.insertAdjacentElement(\"afterend\", pantry);\n      return pantry;\n    }\n\n    /**\n     * @param {Element} oldNode\n     * @returns {Element[]}\n     */\n    function createActiveElementAndParents(oldNode) {\n      /** @type {Element[]} */\n      let activeElementAndParents = [];\n      let elt = document.activeElement;\n      if (elt?.tagName !== \"BODY\" && oldNode.contains(elt)) {\n        while (elt) {\n          activeElementAndParents.push(elt);\n          if (elt === oldNode) break;\n          elt = elt.parentElement;\n        }\n      }\n      return activeElementAndParents;\n    }\n\n    /**\n     * Returns all elements with an ID contained within the root element and its descendants\n     *\n     * @param {Element} root\n     * @returns {Element[]}\n     */\n    function findIdElements(root) {\n      let elements = Array.from(root.querySelectorAll(\"[id]\"));\n      // root could be a document fragment which doesn't have `getAttribute`\n      if (root.getAttribute?.(\"id\")) {\n        elements.push(root);\n      }\n      return elements;\n    }\n\n    /**\n     * A bottom-up algorithm that populates a map of Element -> IdSet.\n     * The idSet for a given element is the set of all IDs contained within its subtree.\n     * As an optimzation, we filter these IDs through the given list of persistent IDs,\n     * because we don't need to bother considering IDed elements that won't be in the new content.\n     *\n     * @param {Map<Node, Set<string>>} idMap\n     * @param {Set<string>} persistentIds\n     * @param {Element} root\n     * @param {Element[]} elements\n     */\n    function populateIdMapWithTree(idMap, persistentIds, root, elements) {\n      for (const elt of elements) {\n        // we can pretend id is non-null String, because the .has line will reject it immediately if not\n        const id = /** @type {String} */ (elt.getAttribute(\"id\"));\n        if (persistentIds.has(id)) {\n          /** @type {Element|null} */\n          let current = elt;\n          // walk up the parent hierarchy of that element, adding the id\n          // of element to the parent's id set\n          while (current) {\n            let idSet = idMap.get(current);\n            // if the id set doesn't exist, create it and insert it in the map\n            if (idSet == null) {\n              idSet = new Set();\n              idMap.set(current, idSet);\n            }\n            idSet.add(id);\n\n            if (current === root) break;\n            current = current.parentElement;\n          }\n        }\n      }\n    }\n\n    /**\n     * This function computes a map of nodes to all ids contained within that node (inclusive of the\n     * node).  This map can be used to ask if two nodes have intersecting sets of ids, which allows\n     * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n     * to contribute to a parent nodes matching.\n     *\n     * @param {Element} oldContent  the old content that will be morphed\n     * @param {Element} newContent  the new content to morph to\n     * @returns {IdSets}\n     */\n    function createIdMaps(oldContent, newContent) {\n      const oldIdElements = findIdElements(oldContent);\n      const newIdElements = findIdElements(newContent);\n\n      const persistentIds = createPersistentIds(oldIdElements, newIdElements);\n\n      /** @type {Map<Node, Set<string>>} */\n      let idMap = new Map();\n      populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements);\n\n      /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */\n      const newRoot = newContent.__idiomorphRoot || newContent;\n      populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements);\n\n      return { persistentIds, idMap };\n    }\n\n    /**\n     * This function computes the set of ids that persist between the two contents excluding duplicates\n     *\n     * @param {Element[]} oldIdElements\n     * @param {Element[]} newIdElements\n     * @returns {Set<string>}\n     */\n    function createPersistentIds(oldIdElements, newIdElements) {\n      let duplicateIds = new Set();\n\n      /** @type {Map<string, string>} */\n      let oldIdTagNameMap = new Map();\n      for (const { id, tagName } of oldIdElements) {\n        if (oldIdTagNameMap.has(id)) {\n          duplicateIds.add(id);\n        } else {\n          oldIdTagNameMap.set(id, tagName);\n        }\n      }\n\n      let persistentIds = new Set();\n      for (const { id, tagName } of newIdElements) {\n        if (persistentIds.has(id)) {\n          duplicateIds.add(id);\n        } else if (oldIdTagNameMap.get(id) === tagName) {\n          persistentIds.add(id);\n        }\n        // skip if tag types mismatch because its not possible to morph one tag into another\n      }\n\n      for (const id of duplicateIds) {\n        persistentIds.delete(id);\n      }\n      return persistentIds;\n    }\n\n    return createMorphContext;\n  })();\n\n  //=============================================================================\n  // HTML Normalization Functions\n  //=============================================================================\n  const { normalizeElement, normalizeParent } = (function () {\n    /** @type {WeakSet<Node>} */\n    const generatedByIdiomorph = new WeakSet();\n\n    /**\n     *\n     * @param {Element | Document} content\n     * @returns {Element}\n     */\n    function normalizeElement(content) {\n      if (content instanceof Document) {\n        return content.documentElement;\n      } else {\n        return content;\n      }\n    }\n\n    /**\n     *\n     * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent\n     * @returns {Element}\n     */\n    function normalizeParent(newContent) {\n      if (newContent == null) {\n        return document.createElement(\"div\"); // dummy parent element\n      } else if (typeof newContent === \"string\") {\n        return normalizeParent(parseContent(newContent));\n      } else if (\n        generatedByIdiomorph.has(/** @type {Element} */ (newContent))\n      ) {\n        // the template tag created by idiomorph parsing can serve as a dummy parent\n        return /** @type {Element} */ (newContent);\n      } else if (newContent instanceof Node) {\n        if (newContent.parentNode) {\n          // we can't use the parent directly because newContent may have siblings\n          // that we don't want in the morph, and reparenting might be expensive (TODO is it?),\n          // so instead we create a fake parent node that only sees a slice of its children.\n          /** @type {Element} */\n          return /** @type {any} */ (new SlicedParentNode(newContent));\n        } else {\n          // a single node is added as a child to a dummy parent\n          const dummyParent = document.createElement(\"div\");\n          dummyParent.append(newContent);\n          return dummyParent;\n        }\n      } else {\n        // all nodes in the array or HTMLElement collection are consolidated under\n        // a single dummy parent element\n        const dummyParent = document.createElement(\"div\");\n        for (const elt of [...newContent]) {\n          dummyParent.append(elt);\n        }\n        return dummyParent;\n      }\n    }\n\n    /**\n     * A fake duck-typed parent element to wrap a single node, without actually reparenting it.\n     * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved\n     * or replaced with one or more elements during the morph. This class effectively allows us a window into\n     * a slice of a node's children.\n     * \"If it walks like a duck, and quacks like a duck, then it must be a duck!\" -- James Whitcomb Riley (1849\u20131916)\n     */\n    class SlicedParentNode {\n      /** @param {Node} node */\n      constructor(node) {\n        this.originalNode = node;\n        this.realParentNode = /** @type {Element} */ (node.parentNode);\n        this.previousSibling = node.previousSibling;\n        this.nextSibling = node.nextSibling;\n      }\n\n      /** @returns {Node[]} */\n      get childNodes() {\n        // return slice of realParent's current childNodes, based on previousSibling and nextSibling\n        const nodes = [];\n        let cursor = this.previousSibling\n          ? this.previousSibling.nextSibling\n          : this.realParentNode.firstChild;\n        while (cursor && cursor != this.nextSibling) {\n          nodes.push(cursor);\n          cursor = cursor.nextSibling;\n        }\n        return nodes;\n      }\n\n      /**\n       * @param {string} selector\n       * @returns {Element[]}\n       */\n      querySelectorAll(selector) {\n        return this.childNodes.reduce((results, node) => {\n          if (node instanceof Element) {\n            if (node.matches(selector)) results.push(node);\n            const nodeList = node.querySelectorAll(selector);\n            for (let i = 0; i < nodeList.length; i++) {\n              results.push(nodeList[i]);\n            }\n          }\n          return results;\n        }, /** @type {Element[]} */ ([]));\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      insertBefore(node, referenceNode) {\n        return this.realParentNode.insertBefore(node, referenceNode);\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      moveBefore(node, referenceNode) {\n        // @ts-ignore - use new moveBefore feature\n        return this.realParentNode.moveBefore(node, referenceNode);\n      }\n\n      /**\n       * for later use with populateIdMapWithTree to halt upwards iteration\n       * @returns {Node}\n       */\n      get __idiomorphRoot() {\n        return this.originalNode;\n      }\n    }\n\n    /**\n     *\n     * @param {string} newContent\n     * @returns {Node | null | DocumentFragment}\n     */\n    function parseContent(newContent) {\n      let parser = new DOMParser();\n\n      // remove svgs to avoid false-positive matches on head, etc.\n      let contentWithSvgsRemoved = newContent.replace(\n        /<svg(\\s[^>]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n        \"\",\n      );\n\n      // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping\n      if (\n        contentWithSvgsRemoved.match(/<\\/html>/) ||\n        contentWithSvgsRemoved.match(/<\\/head>/) ||\n        contentWithSvgsRemoved.match(/<\\/body>/)\n      ) {\n        let content = parser.parseFromString(newContent, \"text/html\");\n        // if it is a full HTML document, return the document itself as the parent container\n        if (contentWithSvgsRemoved.match(/<\\/html>/)) {\n          generatedByIdiomorph.add(content);\n          return content;\n        } else {\n          // otherwise return the html element as the parent container\n          let htmlElement = content.firstChild;\n          if (htmlElement) {\n            generatedByIdiomorph.add(htmlElement);\n          }\n          return htmlElement;\n        }\n      } else {\n        // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help\n        // deal with touchy tags like tr, tbody, etc.\n        let responseDoc = parser.parseFromString(\n          \"<body><template>\" + newContent + \"</template></body>\",\n          \"text/html\",\n        );\n        let content = /** @type {HTMLTemplateElement} */ (\n          responseDoc.body.querySelector(\"template\")\n        ).content;\n        generatedByIdiomorph.add(content);\n        return content;\n      }\n    }\n\n    return { normalizeElement, normalizeParent };\n  })();\n\n  //=============================================================================\n  // This is what ends up becoming the Idiomorph global object\n  //=============================================================================\n  return {\n    morph,\n    defaults,\n  };\n})();\n\n/**\n * Morph the state of the currentElement based on the attributes and contents of\n * the newElement. Morphing may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing changes\n * @param newElement Element source of morphing changes\n */\nfunction morphElements(currentElement, newElement, { callbacks, ...options } = {}) {\n  Idiomorph.morph(currentElement, newElement, {\n    ...options,\n    callbacks: new DefaultIdiomorphCallbacks(callbacks)\n  });\n}\n\n/**\n * Morph the child elements of the currentElement based on the child elements of\n * the newElement. Morphing children may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing children changes\n * @param newElement Element source of morphing children changes\n */\nfunction morphChildren(currentElement, newElement, options = {}) {\n  morphElements(currentElement, newElement.childNodes, {\n    ...options,\n    morphStyle: \"innerHTML\"\n  });\n}\n\nfunction shouldRefreshFrameWithMorphing(currentFrame, newFrame) {\n  return currentFrame instanceof FrameElement &&\n    currentFrame.shouldReloadWithMorph && (!newFrame || areFramesCompatibleForRefreshing(currentFrame, newFrame)) &&\n    !currentFrame.closest(\"[data-turbo-permanent]\")\n}\n\nfunction areFramesCompatibleForRefreshing(currentFrame, newFrame) {\n  // newFrame cannot yet be an instance of FrameElement because custom\n  // elements don't get initialized until they're attached to the DOM, so\n  // test its Element#nodeName instead\n  return newFrame instanceof Element && newFrame.nodeName === \"TURBO-FRAME\" && currentFrame.id === newFrame.id &&\n  (!newFrame.getAttribute(\"src\") || urlsAreEqual(currentFrame.src, newFrame.getAttribute(\"src\")))\n}\n\nfunction closestFrameReloadableWithMorphing(node) {\n  return node.parentElement.closest(\"turbo-frame[src][refresh=morph]\")\n}\n\nclass DefaultIdiomorphCallbacks {\n  #beforeNodeMorphed\n\n  constructor({ beforeNodeMorphed } = {}) {\n    this.#beforeNodeMorphed = beforeNodeMorphed || (() => true);\n  }\n\n  beforeNodeAdded = (node) => {\n    return !(node.id && node.hasAttribute(\"data-turbo-permanent\") && document.getElementById(node.id))\n  }\n\n  beforeNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      if (!currentElement.hasAttribute(\"data-turbo-permanent\") && this.#beforeNodeMorphed(currentElement, newElement)) {\n        const event = dispatch(\"turbo:before-morph-element\", {\n          cancelable: true,\n          target: currentElement,\n          detail: { currentElement, newElement }\n        });\n\n        return !event.defaultPrevented\n      } else {\n        return false\n      }\n    }\n  }\n\n  beforeAttributeUpdated = (attributeName, target, mutationType) => {\n    const event = dispatch(\"turbo:before-morph-attribute\", {\n      cancelable: true,\n      target,\n      detail: { attributeName, mutationType }\n    });\n\n    return !event.defaultPrevented\n  }\n\n  beforeNodeRemoved = (node) => {\n    return this.beforeNodeMorphed(node)\n  }\n\n  afterNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      dispatch(\"turbo:morph-element\", {\n        target: currentElement,\n        detail: { currentElement, newElement }\n      });\n    }\n  }\n}\n\nclass MorphingFrameRenderer extends FrameRenderer {\n  static renderElement(currentElement, newElement) {\n    dispatch(\"turbo:before-frame-morph\", {\n      target: currentElement,\n      detail: { currentElement, newElement }\n    });\n\n    morphChildren(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              closestFrameReloadableWithMorphing(node) === currentElement\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n}\n\nclass ProgressBar {\n  static animationDuration = 300 /*ms*/\n\n  static get defaultCSS() {\n    return unindent`\n      .turbo-progress-bar {\n        position: fixed;\n        display: block;\n        top: 0;\n        left: 0;\n        height: 3px;\n        background: #0076ff;\n        z-index: 2147483647;\n        transition:\n          width ${ProgressBar.animationDuration}ms ease-out,\n          opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n        transform: translate3d(0, 0, 0);\n      }\n    `\n  }\n\n  hiding = false\n  value = 0\n  visible = false\n\n  constructor() {\n    this.stylesheetElement = this.createStylesheetElement();\n    this.progressElement = this.createProgressElement();\n    this.installStylesheetElement();\n    this.setValue(0);\n  }\n\n  show() {\n    if (!this.visible) {\n      this.visible = true;\n      this.installProgressElement();\n      this.startTrickling();\n    }\n  }\n\n  hide() {\n    if (this.visible && !this.hiding) {\n      this.hiding = true;\n      this.fadeProgressElement(() => {\n        this.uninstallProgressElement();\n        this.stopTrickling();\n        this.visible = false;\n        this.hiding = false;\n      });\n    }\n  }\n\n  setValue(value) {\n    this.value = value;\n    this.refresh();\n  }\n\n  // Private\n\n  installStylesheetElement() {\n    document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n  }\n\n  installProgressElement() {\n    this.progressElement.style.width = \"0\";\n    this.progressElement.style.opacity = \"1\";\n    document.documentElement.insertBefore(this.progressElement, document.body);\n    this.refresh();\n  }\n\n  fadeProgressElement(callback) {\n    this.progressElement.style.opacity = \"0\";\n    setTimeout(callback, ProgressBar.animationDuration * 1.5);\n  }\n\n  uninstallProgressElement() {\n    if (this.progressElement.parentNode) {\n      document.documentElement.removeChild(this.progressElement);\n    }\n  }\n\n  startTrickling() {\n    if (!this.trickleInterval) {\n      this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n    }\n  }\n\n  stopTrickling() {\n    window.clearInterval(this.trickleInterval);\n    delete this.trickleInterval;\n  }\n\n  trickle = () => {\n    this.setValue(this.value + Math.random() / 100);\n  }\n\n  refresh() {\n    requestAnimationFrame(() => {\n      this.progressElement.style.width = `${10 + this.value * 90}%`;\n    });\n  }\n\n  createStylesheetElement() {\n    const element = document.createElement(\"style\");\n    element.type = \"text/css\";\n    element.textContent = ProgressBar.defaultCSS;\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      element.nonce = cspNonce;\n    }\n    return element\n  }\n\n  createProgressElement() {\n    const element = document.createElement(\"div\");\n    element.className = \"turbo-progress-bar\";\n    return element\n  }\n}\n\nclass HeadSnapshot extends Snapshot {\n  detailsByOuterHTML = this.children\n    .filter((element) => !elementIsNoscript(element))\n    .map((element) => elementWithoutNonce(element))\n    .reduce((result, element) => {\n      const { outerHTML } = element;\n      const details =\n        outerHTML in result\n          ? result[outerHTML]\n          : {\n              type: elementType(element),\n              tracked: elementIsTracked(element),\n              elements: []\n            };\n      return {\n        ...result,\n        [outerHTML]: {\n          ...details,\n          elements: [...details.elements, element]\n        }\n      }\n    }, {})\n\n  get trackedElementSignature() {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n      .join(\"\")\n  }\n\n  getScriptElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot)\n  }\n\n  getStylesheetElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot)\n  }\n\n  getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n      .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n      .filter(({ type }) => type == matchedType)\n      .map(({ elements: [element] }) => element)\n  }\n\n  get provisionalElements() {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n      if (type == null && !tracked) {\n        return [...result, ...elements]\n      } else if (elements.length > 1) {\n        return [...result, ...elements.slice(1)]\n      } else {\n        return result\n      }\n    }, [])\n  }\n\n  getMetaValue(name) {\n    const element = this.findMetaElementByName(name);\n    return element ? element.getAttribute(\"content\") : null\n  }\n\n  findMetaElementByName(name) {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const {\n        elements: [element]\n      } = this.detailsByOuterHTML[outerHTML];\n      return elementIsMetaElementWithName(element, name) ? element : result\n    }, undefined | undefined)\n  }\n}\n\nfunction elementType(element) {\n  if (elementIsScript(element)) {\n    return \"script\"\n  } else if (elementIsStylesheet(element)) {\n    return \"stylesheet\"\n  }\n}\n\nfunction elementIsTracked(element) {\n  return element.getAttribute(\"data-turbo-track\") == \"reload\"\n}\n\nfunction elementIsScript(element) {\n  const tagName = element.localName;\n  return tagName == \"script\"\n}\n\nfunction elementIsNoscript(element) {\n  const tagName = element.localName;\n  return tagName == \"noscript\"\n}\n\nfunction elementIsStylesheet(element) {\n  const tagName = element.localName;\n  return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\")\n}\n\nfunction elementIsMetaElementWithName(element, name) {\n  const tagName = element.localName;\n  return tagName == \"meta\" && element.getAttribute(\"name\") == name\n}\n\nfunction elementWithoutNonce(element) {\n  if (element.hasAttribute(\"nonce\")) {\n    element.setAttribute(\"nonce\", \"\");\n  }\n\n  return element\n}\n\nclass PageSnapshot extends Snapshot {\n  static fromHTMLString(html = \"\") {\n    return this.fromDocument(parseHTMLDocument(html))\n  }\n\n  static fromElement(element) {\n    return this.fromDocument(element.ownerDocument)\n  }\n\n  static fromDocument({ documentElement, body, head }) {\n    return new this(documentElement, body, new HeadSnapshot(head))\n  }\n\n  constructor(documentElement, body, headSnapshot) {\n    super(body);\n    this.documentElement = documentElement;\n    this.headSnapshot = headSnapshot;\n  }\n\n  clone() {\n    const clonedElement = this.element.cloneNode(true);\n\n    const selectElements = this.element.querySelectorAll(\"select\");\n    const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n\n    for (const [index, source] of selectElements.entries()) {\n      const clone = clonedSelectElements[index];\n      for (const option of clone.selectedOptions) option.selected = false;\n      for (const option of source.selectedOptions) clone.options[option.index].selected = true;\n    }\n\n    for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n      clonedPasswordInput.value = \"\";\n    }\n\n    for (const clonedNoscriptElement of clonedElement.querySelectorAll(\"noscript\")) {\n      clonedNoscriptElement.remove();\n    }\n\n    return new PageSnapshot(this.documentElement, clonedElement, this.headSnapshot)\n  }\n\n  get lang() {\n    return this.documentElement.getAttribute(\"lang\")\n  }\n\n  get dir() {\n    return this.documentElement.getAttribute(\"dir\")\n  }\n\n  get headElement() {\n    return this.headSnapshot.element\n  }\n\n  get rootLocation() {\n    const root = this.getSetting(\"root\") ?? \"/\";\n    return expandURL(root)\n  }\n\n  get cacheControlValue() {\n    return this.getSetting(\"cache-control\")\n  }\n\n  get isPreviewable() {\n    return this.cacheControlValue != \"no-preview\"\n  }\n\n  get isCacheable() {\n    return this.cacheControlValue != \"no-cache\"\n  }\n\n  get isVisitable() {\n    return this.getSetting(\"visit-control\") != \"reload\"\n  }\n\n  get prefersViewTransitions() {\n    const viewTransitionEnabled = this.getSetting(\"view-transition\") === \"true\" || this.headSnapshot.getMetaValue(\"view-transition\") === \"same-origin\";\n    return viewTransitionEnabled && !window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n  }\n\n  get refreshMethod() {\n    return this.getSetting(\"refresh-method\")\n  }\n\n  get refreshScroll() {\n    return this.getSetting(\"refresh-scroll\")\n  }\n\n  // Private\n\n  getSetting(name) {\n    return this.headSnapshot.getMetaValue(`turbo-${name}`)\n  }\n}\n\nclass ViewTransitioner {\n  #viewTransitionStarted = false\n  #lastOperation = Promise.resolve()\n\n  renderChange(useViewTransition, render) {\n    if (useViewTransition && this.viewTransitionsAvailable && !this.#viewTransitionStarted) {\n      this.#viewTransitionStarted = true;\n      this.#lastOperation = this.#lastOperation.then(async () => {\n        await document.startViewTransition(render).finished;\n      });\n    } else {\n      this.#lastOperation = this.#lastOperation.then(render);\n    }\n\n    return this.#lastOperation\n  }\n\n  get viewTransitionsAvailable() {\n    return document.startViewTransition\n  }\n}\n\nconst defaultOptions = {\n  action: \"advance\",\n  historyChanged: false,\n  visitCachedSnapshot: () => {},\n  willRender: true,\n  updateHistory: true,\n  shouldCacheSnapshot: true,\n  acceptsStreamResponse: false,\n  refresh: {}\n};\n\nconst TimingMetric = {\n  visitStart: \"visitStart\",\n  requestStart: \"requestStart\",\n  requestEnd: \"requestEnd\",\n  visitEnd: \"visitEnd\"\n};\n\nconst VisitState = {\n  initialized: \"initialized\",\n  started: \"started\",\n  canceled: \"canceled\",\n  failed: \"failed\",\n  completed: \"completed\"\n};\n\nconst SystemStatusCode = {\n  networkFailure: 0,\n  timeoutFailure: -1,\n  contentTypeMismatch: -2\n};\n\nconst Direction = {\n  advance: \"forward\",\n  restore: \"back\",\n  replace: \"none\"\n};\n\nclass Visit {\n  identifier = uuid() // Required by turbo-ios\n  timingMetrics = {}\n\n  followedRedirect = false\n  historyChanged = false\n  scrolled = false\n  shouldCacheSnapshot = true\n  acceptsStreamResponse = false\n  snapshotCached = false\n  state = VisitState.initialized\n  viewTransitioner = new ViewTransitioner()\n\n  constructor(delegate, location, restorationIdentifier, options = {}) {\n    this.delegate = delegate;\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier || uuid();\n\n    const {\n      action,\n      historyChanged,\n      referrer,\n      snapshot,\n      snapshotHTML,\n      response,\n      visitCachedSnapshot,\n      willRender,\n      updateHistory,\n      shouldCacheSnapshot,\n      acceptsStreamResponse,\n      direction,\n      refresh\n    } = {\n      ...defaultOptions,\n      ...options\n    };\n    this.action = action;\n    this.historyChanged = historyChanged;\n    this.referrer = referrer;\n    this.snapshot = snapshot;\n    this.snapshotHTML = snapshotHTML;\n    this.response = response;\n    this.isPageRefresh = this.view.isPageRefresh(this);\n    this.visitCachedSnapshot = visitCachedSnapshot;\n    this.willRender = willRender;\n    this.updateHistory = updateHistory;\n    this.scrolled = !willRender;\n    this.shouldCacheSnapshot = shouldCacheSnapshot;\n    this.acceptsStreamResponse = acceptsStreamResponse;\n    this.direction = direction || Direction[action];\n    this.refresh = refresh;\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  get restorationData() {\n    return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)\n  }\n\n  start() {\n    if (this.state == VisitState.initialized) {\n      this.recordTimingMetric(TimingMetric.visitStart);\n      this.state = VisitState.started;\n      this.adapter.visitStarted(this);\n      this.delegate.visitStarted(this);\n    }\n  }\n\n  cancel() {\n    if (this.state == VisitState.started) {\n      if (this.request) {\n        this.request.cancel();\n      }\n      this.cancelRender();\n      this.state = VisitState.canceled;\n    }\n  }\n\n  complete() {\n    if (this.state == VisitState.started) {\n      this.recordTimingMetric(TimingMetric.visitEnd);\n      this.adapter.visitCompleted(this);\n      this.state = VisitState.completed;\n      this.followRedirect();\n\n      if (!this.followedRedirect) {\n        this.delegate.visitCompleted(this);\n      }\n    }\n  }\n\n  fail() {\n    if (this.state == VisitState.started) {\n      this.state = VisitState.failed;\n      this.adapter.visitFailed(this);\n      this.delegate.visitCompleted(this);\n    }\n  }\n\n  changeHistory() {\n    if (!this.historyChanged && this.updateHistory) {\n      const actionForHistory = this.location.href === this.referrer?.href ? \"replace\" : this.action;\n      const method = getHistoryMethodForAction(actionForHistory);\n      this.history.update(method, this.location, this.restorationIdentifier);\n      this.historyChanged = true;\n    }\n  }\n\n  issueRequest() {\n    if (this.hasPreloadedResponse()) {\n      this.simulateRequest();\n    } else if (this.shouldIssueRequest() && !this.request) {\n      this.request = new FetchRequest(this, FetchMethod.get, this.location);\n      this.request.perform();\n    }\n  }\n\n  simulateRequest() {\n    if (this.response) {\n      this.startRequest();\n      this.recordResponse();\n      this.finishRequest();\n    }\n  }\n\n  startRequest() {\n    this.recordTimingMetric(TimingMetric.requestStart);\n    this.adapter.visitRequestStarted(this);\n  }\n\n  recordResponse(response = this.response) {\n    this.response = response;\n    if (response) {\n      const { statusCode } = response;\n      if (isSuccessful(statusCode)) {\n        this.adapter.visitRequestCompleted(this);\n      } else {\n        this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n      }\n    }\n  }\n\n  finishRequest() {\n    this.recordTimingMetric(TimingMetric.requestEnd);\n    this.adapter.visitRequestFinished(this);\n  }\n\n  loadResponse() {\n    if (this.response) {\n      const { statusCode, responseHTML } = this.response;\n      this.render(async () => {\n        if (this.shouldCacheSnapshot) this.cacheSnapshot();\n        if (this.view.renderPromise) await this.view.renderPromise;\n\n        if (isSuccessful(statusCode) && responseHTML != null) {\n          const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n          await this.renderPageSnapshot(snapshot, false);\n\n          this.adapter.visitRendered(this);\n          this.complete();\n        } else {\n          await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n          this.adapter.visitRendered(this);\n          this.fail();\n        }\n      });\n    }\n  }\n\n  getCachedSnapshot() {\n    const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n\n    if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n      if (this.action == \"restore\" || snapshot.isPreviewable) {\n        return snapshot\n      }\n    }\n  }\n\n  getPreloadedSnapshot() {\n    if (this.snapshotHTML) {\n      return PageSnapshot.fromHTMLString(this.snapshotHTML)\n    }\n  }\n\n  hasCachedSnapshot() {\n    return this.getCachedSnapshot() != null\n  }\n\n  loadCachedSnapshot() {\n    const snapshot = this.getCachedSnapshot();\n    if (snapshot) {\n      const isPreview = this.shouldIssueRequest();\n      this.render(async () => {\n        this.cacheSnapshot();\n        if (this.isPageRefresh) {\n          this.adapter.visitRendered(this);\n        } else {\n          if (this.view.renderPromise) await this.view.renderPromise;\n\n          await this.renderPageSnapshot(snapshot, isPreview);\n\n          this.adapter.visitRendered(this);\n          if (!isPreview) {\n            this.complete();\n          }\n        }\n      });\n    }\n  }\n\n  followRedirect() {\n    if (this.redirectedToLocation && !this.followedRedirect && this.response?.redirected) {\n      this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n        action: \"replace\",\n        response: this.response,\n        shouldCacheSnapshot: false,\n        willRender: false\n      });\n      this.followedRedirect = true;\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (this.acceptsStreamResponse) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted() {\n    this.startRequest();\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {}\n\n  async requestSucceededWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.redirectedToLocation = response.redirected ? response.location : undefined;\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  async requestFailedWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  requestErrored(_request, _error) {\n    this.recordResponse({\n      statusCode: SystemStatusCode.networkFailure,\n      redirected: false\n    });\n  }\n\n  requestFinished() {\n    this.finishRequest();\n  }\n\n  // Scrolling\n\n  performScroll() {\n    if (!this.scrolled && !this.view.forceReloaded && !this.view.shouldPreserveScrollPosition(this)) {\n      if (this.action == \"restore\") {\n        this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n      } else {\n        this.scrollToAnchor() || this.view.scrollToTop();\n      }\n\n      this.scrolled = true;\n    }\n  }\n\n  scrollToRestoredPosition() {\n    const { scrollPosition } = this.restorationData;\n    if (scrollPosition) {\n      this.view.scrollToPosition(scrollPosition);\n      return true\n    }\n  }\n\n  scrollToAnchor() {\n    const anchor = getAnchor(this.location);\n    if (anchor != null) {\n      this.view.scrollToAnchor(anchor);\n      return true\n    }\n  }\n\n  // Instrumentation\n\n  recordTimingMetric(metric) {\n    this.timingMetrics[metric] = new Date().getTime();\n  }\n\n  getTimingMetrics() {\n    return { ...this.timingMetrics }\n  }\n\n  // Private\n\n  hasPreloadedResponse() {\n    return typeof this.response == \"object\"\n  }\n\n  shouldIssueRequest() {\n    if (this.action == \"restore\") {\n      return !this.hasCachedSnapshot()\n    } else {\n      return this.willRender\n    }\n  }\n\n  cacheSnapshot() {\n    if (!this.snapshotCached) {\n      this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n      this.snapshotCached = true;\n    }\n  }\n\n  async render(callback) {\n    this.cancelRender();\n    await new Promise((resolve) => {\n      this.frame =\n        document.visibilityState === \"hidden\" ? setTimeout(() => resolve(), 0) : requestAnimationFrame(() => resolve());\n    });\n    await callback();\n    delete this.frame;\n  }\n\n  async renderPageSnapshot(snapshot, isPreview) {\n    await this.viewTransitioner.renderChange(this.view.shouldTransitionTo(snapshot), async () => {\n      await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n      this.performScroll();\n    });\n  }\n\n  cancelRender() {\n    if (this.frame) {\n      cancelAnimationFrame(this.frame);\n      delete this.frame;\n    }\n  }\n}\n\nfunction isSuccessful(statusCode) {\n  return statusCode >= 200 && statusCode < 300\n}\n\nclass BrowserAdapter {\n  progressBar = new ProgressBar()\n\n  constructor(session) {\n    this.session = session;\n  }\n\n  visitProposedToLocation(location, options) {\n    if (locationIsVisitable(location, this.navigator.rootLocation)) {\n      this.navigator.startVisit(location, options?.restorationIdentifier || uuid(), options);\n    } else {\n      window.location.href = location.toString();\n    }\n  }\n\n  visitStarted(visit) {\n    this.location = visit.location;\n    this.redirectedToLocation = null;\n\n    visit.loadCachedSnapshot();\n    visit.issueRequest();\n  }\n\n  visitRequestStarted(visit) {\n    this.progressBar.setValue(0);\n    if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n      this.showVisitProgressBarAfterDelay();\n    } else {\n      this.showProgressBar();\n    }\n  }\n\n  visitRequestCompleted(visit) {\n    visit.loadResponse();\n\n    if (visit.response.redirected) {\n      this.redirectedToLocation = visit.redirectedToLocation;\n    }\n  }\n\n  visitRequestFailedWithStatusCode(visit, statusCode) {\n    switch (statusCode) {\n      case SystemStatusCode.networkFailure:\n      case SystemStatusCode.timeoutFailure:\n      case SystemStatusCode.contentTypeMismatch:\n        return this.reload({\n          reason: \"request_failed\",\n          context: {\n            statusCode\n          }\n        })\n      default:\n        return visit.loadResponse()\n    }\n  }\n\n  visitRequestFinished(_visit) {}\n\n  visitCompleted(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  pageInvalidated(reason) {\n    this.reload(reason);\n  }\n\n  visitFailed(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  visitRendered(_visit) {}\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    return true\n  }\n\n  // Form Submission Delegate\n\n  formSubmissionStarted(_formSubmission) {\n    this.progressBar.setValue(0);\n    this.showFormProgressBarAfterDelay();\n  }\n\n  formSubmissionFinished(_formSubmission) {\n    this.progressBar.setValue(1);\n    this.hideFormProgressBar();\n  }\n\n  // Private\n\n  showVisitProgressBarAfterDelay() {\n    this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n  }\n\n  hideVisitProgressBar() {\n    this.progressBar.hide();\n    if (this.visitProgressBarTimeout != null) {\n      window.clearTimeout(this.visitProgressBarTimeout);\n      delete this.visitProgressBarTimeout;\n    }\n  }\n\n  showFormProgressBarAfterDelay() {\n    if (this.formProgressBarTimeout == null) {\n      this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n  }\n\n  hideFormProgressBar() {\n    this.progressBar.hide();\n    if (this.formProgressBarTimeout != null) {\n      window.clearTimeout(this.formProgressBarTimeout);\n      delete this.formProgressBarTimeout;\n    }\n  }\n\n  showProgressBar = () => {\n    this.progressBar.show();\n  }\n\n  reload(reason) {\n    dispatch(\"turbo:reload\", { detail: reason });\n\n    window.location.href = (this.redirectedToLocation || this.location)?.toString() || window.location.href;\n  }\n\n  get navigator() {\n    return this.session.navigator\n  }\n}\n\nclass CacheObserver {\n  selector = \"[data-turbo-temporary]\"\n\n  started = false\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      addEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      removeEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  removeTemporaryElements = (_event) => {\n    for (const element of this.temporaryElements) {\n      element.remove();\n    }\n  }\n\n  get temporaryElements() {\n    return [...document.querySelectorAll(this.selector)]\n  }\n}\n\nclass FrameRedirector {\n  constructor(session, element) {\n    this.session = session;\n    this.element = element;\n    this.linkInterceptor = new LinkInterceptor(this, element);\n    this.formSubmitObserver = new FormSubmitObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n    this.formSubmitObserver.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n    this.formSubmitObserver.stop();\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldRedirect(element)\n  }\n\n  linkClickIntercepted(element, url, event) {\n    const frame = this.#findFrameElement(element);\n    if (frame) {\n      frame.delegate.linkClickIntercepted(element, url, event);\n    }\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return (\n      element.closest(\"turbo-frame\") == null &&\n      this.#shouldSubmit(element, submitter) &&\n      this.#shouldRedirect(element, submitter)\n    )\n  }\n\n  formSubmitted(element, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n    if (frame) {\n      frame.delegate.formSubmitted(element, submitter);\n    }\n  }\n\n  #shouldSubmit(form, submitter) {\n    const action = getAction$1(form, submitter);\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const rootLocation = expandURL(meta?.content ?? \"/\");\n\n    return this.#shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation)\n  }\n\n  #shouldRedirect(element, submitter) {\n    const isNavigatable =\n      element instanceof HTMLFormElement\n        ? this.session.submissionIsNavigatable(element, submitter)\n        : this.session.elementIsNavigatable(element);\n\n    if (isNavigatable) {\n      const frame = this.#findFrameElement(element, submitter);\n      return frame ? frame != element.closest(\"turbo-frame\") : false\n    } else {\n      return false\n    }\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = submitter?.getAttribute(\"data-turbo-frame\") || element.getAttribute(\"data-turbo-frame\");\n    if (id && id != \"_top\") {\n      const frame = this.element.querySelector(`#${id}:not([disabled])`);\n      if (frame instanceof FrameElement) {\n        return frame\n      }\n    }\n  }\n}\n\nclass History {\n  location\n  restorationIdentifier = uuid()\n  restorationData = {}\n  started = false\n  currentIndex = 0\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"popstate\", this.onPopState, false);\n      this.currentIndex = history.state?.turbo?.restorationIndex || 0;\n      this.started = true;\n      this.replace(new URL(window.location.href));\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"popstate\", this.onPopState, false);\n      this.started = false;\n    }\n  }\n\n  push(location, restorationIdentifier) {\n    this.update(history.pushState, location, restorationIdentifier);\n  }\n\n  replace(location, restorationIdentifier) {\n    this.update(history.replaceState, location, restorationIdentifier);\n  }\n\n  update(method, location, restorationIdentifier = uuid()) {\n    if (method === history.pushState) ++this.currentIndex;\n\n    const state = { turbo: { restorationIdentifier, restorationIndex: this.currentIndex } };\n    method.call(history, state, \"\", location.href);\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier;\n  }\n\n  // Restoration data\n\n  getRestorationDataForIdentifier(restorationIdentifier) {\n    return this.restorationData[restorationIdentifier] || {}\n  }\n\n  updateRestorationData(additionalData) {\n    const { restorationIdentifier } = this;\n    const restorationData = this.restorationData[restorationIdentifier];\n    this.restorationData[restorationIdentifier] = {\n      ...restorationData,\n      ...additionalData\n    };\n  }\n\n  // Scroll restoration\n\n  assumeControlOfScrollRestoration() {\n    if (!this.previousScrollRestoration) {\n      this.previousScrollRestoration = history.scrollRestoration ?? \"auto\";\n      history.scrollRestoration = \"manual\";\n    }\n  }\n\n  relinquishControlOfScrollRestoration() {\n    if (this.previousScrollRestoration) {\n      history.scrollRestoration = this.previousScrollRestoration;\n      delete this.previousScrollRestoration;\n    }\n  }\n\n  // Event handlers\n\n  onPopState = (event) => {\n    const { turbo } = event.state || {};\n    this.location = new URL(window.location.href);\n\n    if (turbo) {\n      const { restorationIdentifier, restorationIndex } = turbo;\n      this.restorationIdentifier = restorationIdentifier;\n      const direction = restorationIndex > this.currentIndex ? \"forward\" : \"back\";\n      this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction);\n      this.currentIndex = restorationIndex;\n    } else {\n      this.currentIndex++;\n      this.delegate.historyPoppedWithEmptyState(this.location);\n    }\n  }\n}\n\nclass LinkPrefetchObserver {\n  started = false\n  #prefetchedLink = null\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (this.started) return\n\n    if (this.eventTarget.readyState === \"loading\") {\n      this.eventTarget.addEventListener(\"DOMContentLoaded\", this.#enable, { once: true });\n    } else {\n      this.#enable();\n    }\n  }\n\n  stop() {\n    if (!this.started) return\n\n    this.eventTarget.removeEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.removeEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.removeEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = false;\n  }\n\n  #enable = () => {\n    this.eventTarget.addEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.addEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.addEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = true;\n  }\n\n  #tryToPrefetchRequest = (event) => {\n    if (getMetaContent(\"turbo-prefetch\") === \"false\") return\n\n    const target = event.target;\n    const isLink = target.matches && target.matches(\"a[href]:not([target^=_]):not([download])\");\n\n    if (isLink && this.#isPrefetchable(target)) {\n      const link = target;\n      const location = getLocationForLink(link);\n\n      if (this.delegate.canPrefetchRequestToLocation(link, location)) {\n        this.#prefetchedLink = link;\n\n        const fetchRequest = new FetchRequest(\n          this,\n          FetchMethod.get,\n          location,\n          new URLSearchParams(),\n          target\n        );\n\n        fetchRequest.fetchOptions.priority = \"low\";\n\n        prefetchCache.putLater(location, fetchRequest, this.#cacheTtl);\n      }\n    }\n  }\n\n  #cancelRequestIfObsolete = (event) => {\n    if (event.target === this.#prefetchedLink) this.#cancelPrefetchRequest();\n  }\n\n  #cancelPrefetchRequest = () => {\n    prefetchCache.clear();\n    this.#prefetchedLink = null;\n  }\n\n  #tryToUsePrefetchedRequest = (event) => {\n    if (event.target.tagName !== \"FORM\" && event.detail.fetchOptions.method === \"GET\") {\n      const cached = prefetchCache.get(event.detail.url);\n\n      if (cached) {\n        // User clicked link, use cache response\n        event.detail.fetchRequest = cached;\n      }\n\n      prefetchCache.clear();\n    }\n  }\n\n  prepareRequest(request) {\n    const link = request.target;\n\n    request.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n\n    const turboFrame = link.closest(\"turbo-frame\");\n    const turboFrameTarget = link.getAttribute(\"data-turbo-frame\") || turboFrame?.getAttribute(\"target\") || turboFrame?.id;\n\n    if (turboFrameTarget && turboFrameTarget !== \"_top\") {\n      request.headers[\"Turbo-Frame\"] = turboFrameTarget;\n    }\n  }\n\n  // Fetch request interface\n\n  requestSucceededWithResponse() {}\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  get #cacheTtl() {\n    return Number(getMetaContent(\"turbo-prefetch-cache-time\")) || cacheTtl\n  }\n\n  #isPrefetchable(link) {\n    const href = link.getAttribute(\"href\");\n\n    if (!href) return false\n\n    if (unfetchableLink(link)) return false\n    if (linkToTheSamePage(link)) return false\n    if (linkOptsOut(link)) return false\n    if (nonSafeLink(link)) return false\n    if (eventPrevented(link)) return false\n\n    return true\n  }\n}\n\nconst unfetchableLink = (link) => {\n  return link.origin !== document.location.origin || ![\"http:\", \"https:\"].includes(link.protocol) || link.hasAttribute(\"target\")\n};\n\nconst linkToTheSamePage = (link) => {\n  return (link.pathname + link.search === document.location.pathname + document.location.search) || link.href.startsWith(\"#\")\n};\n\nconst linkOptsOut = (link) => {\n  if (link.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n  if (link.getAttribute(\"data-turbo\") === \"false\") return true\n\n  const turboPrefetchParent = findClosestRecursively(link, \"[data-turbo-prefetch]\");\n  if (turboPrefetchParent && turboPrefetchParent.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n\n  return false\n};\n\nconst nonSafeLink = (link) => {\n  const turboMethod = link.getAttribute(\"data-turbo-method\");\n  if (turboMethod && turboMethod.toLowerCase() !== \"get\") return true\n\n  if (isUJS(link)) return true\n  if (link.hasAttribute(\"data-turbo-confirm\")) return true\n  if (link.hasAttribute(\"data-turbo-stream\")) return true\n\n  return false\n};\n\nconst isUJS = (link) => {\n  return link.hasAttribute(\"data-remote\") || link.hasAttribute(\"data-behavior\") || link.hasAttribute(\"data-confirm\") || link.hasAttribute(\"data-method\")\n};\n\nconst eventPrevented = (link) => {\n  const event = dispatch(\"turbo:before-prefetch\", { target: link, cancelable: true });\n  return event.defaultPrevented\n};\n\nclass Navigator {\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  proposeVisit(location, options = {}) {\n    if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n      this.delegate.visitProposedToLocation(location, options);\n    }\n  }\n\n  startVisit(locatable, restorationIdentifier, options = {}) {\n    this.stop();\n    this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, {\n      referrer: this.location,\n      ...options\n    });\n    this.currentVisit.start();\n  }\n\n  submitForm(form, submitter) {\n    this.stop();\n    this.formSubmission = new FormSubmission(this, form, submitter, true);\n\n    this.formSubmission.start();\n  }\n\n  stop() {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n      delete this.formSubmission;\n    }\n\n    if (this.currentVisit) {\n      this.currentVisit.cancel();\n      delete this.currentVisit;\n    }\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get rootLocation() {\n    return this.view.snapshot.rootLocation\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted(formSubmission) {\n    // Not all adapters implement formSubmissionStarted\n    if (typeof this.adapter.formSubmissionStarted === \"function\") {\n      this.adapter.formSubmissionStarted(formSubmission);\n    }\n  }\n\n  async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n    if (formSubmission == this.formSubmission) {\n      const responseHTML = await fetchResponse.responseHTML;\n      if (responseHTML) {\n        const shouldCacheSnapshot = formSubmission.isSafe;\n        if (!shouldCacheSnapshot) {\n          this.view.clearSnapshotCache();\n        }\n\n        const { statusCode, redirected } = fetchResponse;\n        const action = this.#getActionForFormSubmission(formSubmission, fetchResponse);\n        const visitOptions = {\n          action,\n          shouldCacheSnapshot,\n          response: { statusCode, responseHTML, redirected }\n        };\n        this.proposeVisit(fetchResponse.location, visitOptions);\n      }\n    }\n  }\n\n  async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    const responseHTML = await fetchResponse.responseHTML;\n\n    if (responseHTML) {\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n      if (fetchResponse.serverError) {\n        await this.view.renderError(snapshot, this.currentVisit);\n      } else {\n        await this.view.renderPage(snapshot, false, true, this.currentVisit);\n      }\n      if (snapshot.refreshScroll !== \"preserve\") {\n        this.view.scrollToTop();\n      }\n      this.view.clearSnapshotCache();\n    }\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished(formSubmission) {\n    // Not all adapters implement formSubmissionFinished\n    if (typeof this.adapter.formSubmissionFinished === \"function\") {\n      this.adapter.formSubmissionFinished(formSubmission);\n    }\n  }\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    // Not all adapters implement linkPrefetchingIsEnabledForLocation\n    if (typeof this.adapter.linkPrefetchingIsEnabledForLocation === \"function\") {\n      return this.adapter.linkPrefetchingIsEnabledForLocation(location)\n    }\n\n    return true\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    this.delegate.visitStarted(visit);\n  }\n\n  visitCompleted(visit) {\n    this.delegate.visitCompleted(visit);\n    delete this.currentVisit;\n  }\n\n  // Same-page links are no longer handled with a Visit.\n  // This method is still needed for Turbo Native adapters.\n  locationWithActionIsSamePage(location, action) {\n    return false\n  }\n\n  // Visits\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  #getActionForFormSubmission(formSubmission, fetchResponse) {\n    const { submitter, formElement } = formSubmission;\n    return getVisitAction(submitter, formElement) || this.#getDefaultAction(fetchResponse)\n  }\n\n  #getDefaultAction(fetchResponse) {\n    const sameLocationRedirect = fetchResponse.redirected && fetchResponse.location.href === this.location?.href;\n    return sameLocationRedirect ? \"replace\" : \"advance\"\n  }\n}\n\nconst PageStage = {\n  initial: 0,\n  loading: 1,\n  interactive: 2,\n  complete: 3\n};\n\nclass PageObserver {\n  stage = PageStage.initial\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      if (this.stage == PageStage.initial) {\n        this.stage = PageStage.loading;\n      }\n      document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n      addEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n      removeEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = false;\n    }\n  }\n\n  interpretReadyState = () => {\n    const { readyState } = this;\n    if (readyState == \"interactive\") {\n      this.pageIsInteractive();\n    } else if (readyState == \"complete\") {\n      this.pageIsComplete();\n    }\n  }\n\n  pageIsInteractive() {\n    if (this.stage == PageStage.loading) {\n      this.stage = PageStage.interactive;\n      this.delegate.pageBecameInteractive();\n    }\n  }\n\n  pageIsComplete() {\n    this.pageIsInteractive();\n    if (this.stage == PageStage.interactive) {\n      this.stage = PageStage.complete;\n      this.delegate.pageLoaded();\n    }\n  }\n\n  pageWillUnload = () => {\n    this.delegate.pageWillUnload();\n  }\n\n  get readyState() {\n    return document.readyState\n  }\n}\n\nclass ScrollObserver {\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"scroll\", this.onScroll, false);\n      this.onScroll();\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"scroll\", this.onScroll, false);\n      this.started = false;\n    }\n  }\n\n  onScroll = () => {\n    this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n  }\n\n  // Private\n\n  updatePosition(position) {\n    this.delegate.scrollPositionChanged(position);\n  }\n}\n\nclass StreamMessageRenderer {\n  render({ fragment }) {\n    Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => {\n      withAutofocusFromFragment(fragment, () => {\n        withPreservedFocus(() => {\n          document.documentElement.appendChild(fragment);\n        });\n      });\n    });\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement, newPermanentElement) {\n    newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n  }\n\n  leavingBardo() {}\n}\n\nfunction getPermanentElementMapForFragment(fragment) {\n  const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n  const permanentElementMap = {};\n  for (const permanentElementInDocument of permanentElementsInDocument) {\n    const { id } = permanentElementInDocument;\n\n    for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n      const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n\n      if (elementInStream) {\n        permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n      }\n    }\n  }\n\n  return permanentElementMap\n}\n\nasync function withAutofocusFromFragment(fragment, callback) {\n  const generatedID = `turbo-stream-autofocus-${uuid()}`;\n  const turboStreams = fragment.querySelectorAll(\"turbo-stream\");\n  const elementWithAutofocus = firstAutofocusableElementInStreams(turboStreams);\n  let willAutofocusId = null;\n\n  if (elementWithAutofocus) {\n    if (elementWithAutofocus.id) {\n      willAutofocusId = elementWithAutofocus.id;\n    } else {\n      willAutofocusId = generatedID;\n    }\n\n    elementWithAutofocus.id = willAutofocusId;\n  }\n\n  callback();\n  await nextRepaint();\n\n  const hasNoActiveElement = document.activeElement == null || document.activeElement == document.body;\n\n  if (hasNoActiveElement && willAutofocusId) {\n    const elementToAutofocus = document.getElementById(willAutofocusId);\n\n    if (elementIsFocusable(elementToAutofocus)) {\n      elementToAutofocus.focus();\n    }\n    if (elementToAutofocus && elementToAutofocus.id == generatedID) {\n      elementToAutofocus.removeAttribute(\"id\");\n    }\n  }\n}\n\nasync function withPreservedFocus(callback) {\n  const [activeElementBeforeRender, activeElementAfterRender] = await around(callback, () => document.activeElement);\n\n  const restoreFocusTo = activeElementBeforeRender && activeElementBeforeRender.id;\n\n  if (restoreFocusTo) {\n    const elementToFocus = document.getElementById(restoreFocusTo);\n\n    if (elementIsFocusable(elementToFocus) && elementToFocus != activeElementAfterRender) {\n      elementToFocus.focus();\n    }\n  }\n}\n\nfunction firstAutofocusableElementInStreams(nodeListOfStreamElements) {\n  for (const streamElement of nodeListOfStreamElements) {\n    const elementWithAutofocus = queryAutofocusableElement(streamElement.templateElement.content);\n\n    if (elementWithAutofocus) return elementWithAutofocus\n  }\n\n  return null\n}\n\nclass StreamObserver {\n  sources = new Set()\n  #started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.#started) {\n      this.#started = true;\n      addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  stop() {\n    if (this.#started) {\n      this.#started = false;\n      removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  connectStreamSource(source) {\n    if (!this.streamSourceIsConnected(source)) {\n      this.sources.add(source);\n      source.addEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  disconnectStreamSource(source) {\n    if (this.streamSourceIsConnected(source)) {\n      this.sources.delete(source);\n      source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  streamSourceIsConnected(source) {\n    return this.sources.has(source)\n  }\n\n  inspectFetchResponse = (event) => {\n    const response = fetchResponseFromEvent(event);\n    if (response && fetchResponseIsStream(response)) {\n      event.preventDefault();\n      this.receiveMessageResponse(response);\n    }\n  }\n\n  receiveMessageEvent = (event) => {\n    if (this.#started && typeof event.data == \"string\") {\n      this.receiveMessageHTML(event.data);\n    }\n  }\n\n  async receiveMessageResponse(response) {\n    const html = await response.responseHTML;\n    if (html) {\n      this.receiveMessageHTML(html);\n    }\n  }\n\n  receiveMessageHTML(html) {\n    this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n  }\n}\n\nfunction fetchResponseFromEvent(event) {\n  const fetchResponse = event.detail?.fetchResponse;\n  if (fetchResponse instanceof FetchResponse) {\n    return fetchResponse\n  }\n}\n\nfunction fetchResponseIsStream(response) {\n  const contentType = response.contentType ?? \"\";\n  return contentType.startsWith(StreamMessage.contentType)\n}\n\nclass ErrorRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const { documentElement, body } = document;\n\n    documentElement.replaceChild(newElement, body);\n  }\n\n  async render() {\n    this.replaceHeadAndBody();\n    this.activateScriptElements();\n  }\n\n  replaceHeadAndBody() {\n    const { documentElement, head } = document;\n    documentElement.replaceChild(this.newHead, head);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  activateScriptElements() {\n    for (const replaceableElement of this.scriptElements) {\n      const parentNode = replaceableElement.parentNode;\n      if (parentNode) {\n        const element = activateScriptElement(replaceableElement);\n        parentNode.replaceChild(element, replaceableElement);\n      }\n    }\n  }\n\n  get newHead() {\n    return this.newSnapshot.headSnapshot.element\n  }\n\n  get scriptElements() {\n    return document.documentElement.querySelectorAll(\"script\")\n  }\n}\n\nclass PageRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    if (document.body && newElement instanceof HTMLBodyElement) {\n      document.body.replaceWith(newElement);\n    } else {\n      document.documentElement.appendChild(newElement);\n    }\n  }\n\n  get shouldRender() {\n    return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical\n  }\n\n  get reloadReason() {\n    if (!this.newSnapshot.isVisitable) {\n      return {\n        reason: \"turbo_visit_control_is_reload\"\n      }\n    }\n\n    if (!this.trackedElementsAreIdentical) {\n      return {\n        reason: \"tracked_element_mismatch\"\n      }\n    }\n  }\n\n  async prepareToRender() {\n    this.#setLanguage();\n    await this.mergeHead();\n  }\n\n  async render() {\n    if (this.willRender) {\n      await this.replaceBody();\n    }\n  }\n\n  finishRendering() {\n    super.finishRendering();\n    if (!this.isPreview) {\n      this.focusFirstAutofocusableElement();\n    }\n  }\n\n  get currentHeadSnapshot() {\n    return this.currentSnapshot.headSnapshot\n  }\n\n  get newHeadSnapshot() {\n    return this.newSnapshot.headSnapshot\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  #setLanguage() {\n    const { documentElement } = this.currentSnapshot;\n    const { dir, lang } = this.newSnapshot;\n\n    if (lang) {\n      documentElement.setAttribute(\"lang\", lang);\n    } else {\n      documentElement.removeAttribute(\"lang\");\n    }\n    if (dir) {\n      documentElement.setAttribute(\"dir\", dir);\n    } else {\n      documentElement.removeAttribute(\"dir\");\n    }\n  }\n\n  async mergeHead() {\n    const mergedHeadElements = this.mergeProvisionalElements();\n    const newStylesheetElements = this.copyNewHeadStylesheetElements();\n    this.copyNewHeadScriptElements();\n\n    await mergedHeadElements;\n    await newStylesheetElements;\n\n    if (this.willRender) {\n      this.removeUnusedDynamicStylesheetElements();\n    }\n  }\n\n  async replaceBody() {\n    await this.preservingPermanentElements(async () => {\n      this.activateNewBody();\n      await this.assignNewBody();\n    });\n  }\n\n  get trackedElementsAreIdentical() {\n    return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature\n  }\n\n  async copyNewHeadStylesheetElements() {\n    const loadingElements = [];\n\n    for (const element of this.newHeadStylesheetElements) {\n      loadingElements.push(waitForLoad(element));\n\n      document.head.appendChild(element);\n    }\n\n    await Promise.all(loadingElements);\n  }\n\n  copyNewHeadScriptElements() {\n    for (const element of this.newHeadScriptElements) {\n      document.head.appendChild(activateScriptElement(element));\n    }\n  }\n\n  removeUnusedDynamicStylesheetElements() {\n    for (const element of this.unusedDynamicStylesheetElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  async mergeProvisionalElements() {\n    const newHeadElements = [...this.newHeadProvisionalElements];\n\n    for (const element of this.currentHeadProvisionalElements) {\n      if (!this.isCurrentElementInElementList(element, newHeadElements)) {\n        document.head.removeChild(element);\n      }\n    }\n\n    for (const element of newHeadElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  isCurrentElementInElementList(element, elementList) {\n    for (const [index, newElement] of elementList.entries()) {\n      // if title element...\n      if (element.tagName == \"TITLE\") {\n        if (newElement.tagName != \"TITLE\") {\n          continue\n        }\n        if (element.innerHTML == newElement.innerHTML) {\n          elementList.splice(index, 1);\n          return true\n        }\n      }\n\n      // if any other element...\n      if (newElement.isEqualNode(element)) {\n        elementList.splice(index, 1);\n        return true\n      }\n    }\n\n    return false\n  }\n\n  removeCurrentHeadProvisionalElements() {\n    for (const element of this.currentHeadProvisionalElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  copyNewHeadProvisionalElements() {\n    for (const element of this.newHeadProvisionalElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  activateNewBody() {\n    document.adoptNode(this.newElement);\n    this.removeNoscriptElements();\n    this.activateNewBodyScriptElements();\n  }\n\n  removeNoscriptElements() {\n    for (const noscriptElement of this.newElement.querySelectorAll(\"noscript\")) {\n      noscriptElement.remove();\n    }\n  }\n\n  activateNewBodyScriptElements() {\n    for (const inertScriptElement of this.newBodyScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  async assignNewBody() {\n    await this.renderElement(this.currentElement, this.newElement);\n  }\n\n  get unusedDynamicStylesheetElements() {\n    return this.oldHeadStylesheetElements.filter((element) => {\n      return element.getAttribute(\"data-turbo-track\") === \"dynamic\"\n    })\n  }\n\n  get oldHeadStylesheetElements() {\n    return this.currentHeadSnapshot.getStylesheetElementsNotInSnapshot(this.newHeadSnapshot)\n  }\n\n  get newHeadStylesheetElements() {\n    return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get newHeadScriptElements() {\n    return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get currentHeadProvisionalElements() {\n    return this.currentHeadSnapshot.provisionalElements\n  }\n\n  get newHeadProvisionalElements() {\n    return this.newHeadSnapshot.provisionalElements\n  }\n\n  get newBodyScriptElements() {\n    return this.newElement.querySelectorAll(\"script\")\n  }\n}\n\nclass MorphingPageRenderer extends PageRenderer {\n  static renderElement(currentElement, newElement) {\n    morphElements(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              !closestFrameReloadableWithMorphing(node)\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n\n    dispatch(\"turbo:morph\", { detail: { currentElement, newElement } });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n\n  get renderMethod() {\n    return \"morph\"\n  }\n\n  get shouldAutofocus() {\n    return false\n  }\n}\n\nclass SnapshotCache extends LRUCache {\n  constructor(size) {\n    super(size, toCacheKey);\n  }\n\n  get snapshots() {\n    return this.entries\n  }\n}\n\nclass PageView extends View {\n  snapshotCache = new SnapshotCache(10)\n  lastRenderedLocation = new URL(location.href)\n  forceReloaded = false\n\n  shouldTransitionTo(newSnapshot) {\n    return this.snapshot.prefersViewTransitions && newSnapshot.prefersViewTransitions\n  }\n\n  renderPage(snapshot, isPreview = false, willRender = true, visit) {\n    const shouldMorphPage = this.isPageRefresh(visit) && (visit?.refresh?.method || this.snapshot.refreshMethod) === \"morph\";\n    const rendererClass = shouldMorphPage ? MorphingPageRenderer : PageRenderer;\n\n    const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender);\n\n    if (!renderer.shouldRender) {\n      this.forceReloaded = true;\n    } else {\n      visit?.changeHistory();\n    }\n\n    return this.render(renderer)\n  }\n\n  renderError(snapshot, visit) {\n    visit?.changeHistory();\n    const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n    return this.render(renderer)\n  }\n\n  clearSnapshotCache() {\n    this.snapshotCache.clear();\n  }\n\n  async cacheSnapshot(snapshot = this.snapshot) {\n    if (snapshot.isCacheable) {\n      this.delegate.viewWillCacheSnapshot();\n      const { lastRenderedLocation: location } = this;\n      await nextEventLoopTick();\n      const cachedSnapshot = snapshot.clone();\n      this.snapshotCache.put(location, cachedSnapshot);\n      return cachedSnapshot\n    }\n  }\n\n  getCachedSnapshotForLocation(location) {\n    return this.snapshotCache.get(location)\n  }\n\n  isPageRefresh(visit) {\n    return !visit || (this.lastRenderedLocation.pathname === visit.location.pathname && visit.action === \"replace\")\n  }\n\n  shouldPreserveScrollPosition(visit) {\n    return this.isPageRefresh(visit) && (visit?.refresh?.scroll || this.snapshot.refreshScroll) === \"preserve\"\n  }\n\n  get snapshot() {\n    return PageSnapshot.fromElement(this.element)\n  }\n}\n\nclass Preloader {\n  selector = \"a[data-turbo-preload]\"\n\n  constructor(delegate, snapshotCache) {\n    this.delegate = delegate;\n    this.snapshotCache = snapshotCache;\n  }\n\n  start() {\n    if (document.readyState === \"loading\") {\n      document.addEventListener(\"DOMContentLoaded\", this.#preloadAll);\n    } else {\n      this.preloadOnLoadLinksForView(document.body);\n    }\n  }\n\n  stop() {\n    document.removeEventListener(\"DOMContentLoaded\", this.#preloadAll);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    for (const link of element.querySelectorAll(this.selector)) {\n      if (this.delegate.shouldPreloadLink(link)) {\n        this.preloadURL(link);\n      }\n    }\n  }\n\n  async preloadURL(link) {\n    const location = new URL(link.href);\n\n    if (this.snapshotCache.has(location)) {\n      return\n    }\n\n    const fetchRequest = new FetchRequest(this, FetchMethod.get, location, new URLSearchParams(), link);\n    await fetchRequest.perform();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(fetchRequest) {\n    fetchRequest.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n  }\n\n  async requestSucceededWithResponse(fetchRequest, fetchResponse) {\n    try {\n      const responseHTML = await fetchResponse.responseHTML;\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n\n      this.snapshotCache.put(fetchRequest.url, snapshot);\n    } catch (_) {\n      // If we cannot preload that is ok!\n    }\n  }\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  #preloadAll = () => {\n    this.preloadOnLoadLinksForView(document.body);\n  }\n}\n\nclass Cache {\n  constructor(session) {\n    this.session = session;\n  }\n\n  clear() {\n    this.session.clearCache();\n  }\n\n  resetCacheControl() {\n    this.#setCacheControl(\"\");\n  }\n\n  exemptPageFromCache() {\n    this.#setCacheControl(\"no-cache\");\n  }\n\n  exemptPageFromPreview() {\n    this.#setCacheControl(\"no-preview\");\n  }\n\n  #setCacheControl(value) {\n    setMetaContent(\"turbo-cache-control\", value);\n  }\n}\n\nclass Session {\n  navigator = new Navigator(this)\n  history = new History(this)\n  view = new PageView(this, document.documentElement)\n  adapter = new BrowserAdapter(this)\n\n  pageObserver = new PageObserver(this)\n  cacheObserver = new CacheObserver()\n  linkPrefetchObserver = new LinkPrefetchObserver(this, document)\n  linkClickObserver = new LinkClickObserver(this, window)\n  formSubmitObserver = new FormSubmitObserver(this, document)\n  scrollObserver = new ScrollObserver(this)\n  streamObserver = new StreamObserver(this)\n  formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement)\n  frameRedirector = new FrameRedirector(this, document.documentElement)\n  streamMessageRenderer = new StreamMessageRenderer()\n  cache = new Cache(this)\n\n  enabled = true\n  started = false\n  #pageRefreshDebouncePeriod = 150\n\n  constructor(recentRequests) {\n    this.recentRequests = recentRequests;\n    this.preloader = new Preloader(this, this.view.snapshotCache);\n    this.debouncedRefresh = this.refresh;\n    this.pageRefreshDebouncePeriod = this.pageRefreshDebouncePeriod;\n  }\n\n  start() {\n    if (!this.started) {\n      this.pageObserver.start();\n      this.cacheObserver.start();\n      this.linkPrefetchObserver.start();\n      this.formLinkClickObserver.start();\n      this.linkClickObserver.start();\n      this.formSubmitObserver.start();\n      this.scrollObserver.start();\n      this.streamObserver.start();\n      this.frameRedirector.start();\n      this.history.start();\n      this.preloader.start();\n      this.started = true;\n      this.enabled = true;\n    }\n  }\n\n  disable() {\n    this.enabled = false;\n  }\n\n  stop() {\n    if (this.started) {\n      this.pageObserver.stop();\n      this.cacheObserver.stop();\n      this.linkPrefetchObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkClickObserver.stop();\n      this.formSubmitObserver.stop();\n      this.scrollObserver.stop();\n      this.streamObserver.stop();\n      this.frameRedirector.stop();\n      this.history.stop();\n      this.preloader.stop();\n      this.started = false;\n    }\n  }\n\n  registerAdapter(adapter) {\n    this.adapter = adapter;\n  }\n\n  visit(location, options = {}) {\n    const frameElement = options.frame ? document.getElementById(options.frame) : null;\n\n    if (frameElement instanceof FrameElement) {\n      const action = options.action || getVisitAction(frameElement);\n\n      frameElement.delegate.proposeVisitIfNavigatedWithAction(frameElement, action);\n      frameElement.src = location.toString();\n    } else {\n      this.navigator.proposeVisit(expandURL(location), options);\n    }\n  }\n\n  refresh(url, options = {}) {\n    options = typeof options === \"string\" ? { requestId: options } : options;\n\n    const { method, requestId, scroll } = options;\n    const isRecentRequest = requestId && this.recentRequests.has(requestId);\n    const isCurrentUrl = url === document.baseURI;\n    if (!isRecentRequest && !this.navigator.currentVisit && isCurrentUrl) {\n      this.visit(url, { action: \"replace\", shouldCacheSnapshot: false, refresh: { method, scroll } });\n    }\n  }\n\n  connectStreamSource(source) {\n    this.streamObserver.connectStreamSource(source);\n  }\n\n  disconnectStreamSource(source) {\n    this.streamObserver.disconnectStreamSource(source);\n  }\n\n  renderStreamMessage(message) {\n    this.streamMessageRenderer.render(StreamMessage.wrap(message));\n  }\n\n  clearCache() {\n    this.view.clearSnapshotCache();\n  }\n\n  setProgressBarDelay(delay) {\n    console.warn(\n      \"Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`\"\n    );\n\n    this.progressBarDelay = delay;\n  }\n\n  set progressBarDelay(delay) {\n    config.drive.progressBarDelay = delay;\n  }\n\n  get progressBarDelay() {\n    return config.drive.progressBarDelay\n  }\n\n  set drive(value) {\n    config.drive.enabled = value;\n  }\n\n  get drive() {\n    return config.drive.enabled\n  }\n\n  set formMode(value) {\n    config.forms.mode = value;\n  }\n\n  get formMode() {\n    return config.forms.mode\n  }\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  get pageRefreshDebouncePeriod() {\n    return this.#pageRefreshDebouncePeriod\n  }\n\n  set pageRefreshDebouncePeriod(value) {\n    this.refresh = debounce(this.debouncedRefresh.bind(this), value);\n    this.#pageRefreshDebouncePeriod = value;\n  }\n\n  // Preloader delegate\n\n  shouldPreloadLink(element) {\n    const isUnsafe = element.hasAttribute(\"data-turbo-method\");\n    const isStream = element.hasAttribute(\"data-turbo-stream\");\n    const frameTarget = element.getAttribute(\"data-turbo-frame\");\n    const frame = frameTarget == \"_top\" ?\n      null :\n      document.getElementById(frameTarget) || findClosestRecursively(element, \"turbo-frame:not([disabled])\");\n\n    if (isUnsafe || isStream || frame instanceof FrameElement) {\n      return false\n    } else {\n      const location = new URL(element.href);\n\n      return this.elementIsNavigatable(element) && locationIsVisitable(location, this.snapshot.rootLocation)\n    }\n  }\n\n  // History delegate\n\n  historyPoppedToLocationWithRestorationIdentifierAndDirection(location, restorationIdentifier, direction) {\n    if (this.enabled) {\n      this.navigator.startVisit(location, restorationIdentifier, {\n        action: \"restore\",\n        historyChanged: true,\n        direction\n      });\n    } else {\n      this.adapter.pageInvalidated({\n        reason: \"turbo_disabled\"\n      });\n    }\n  }\n\n  historyPoppedWithEmptyState(location) {\n    this.history.replace(location);\n    this.view.lastRenderedLocation = location;\n    this.view.cacheSnapshot();\n  }\n\n  // Scroll observer delegate\n\n  scrollPositionChanged(position) {\n    this.history.updateRestorationData({ scrollPosition: position });\n  }\n\n  // Form click observer delegate\n\n  willSubmitFormLinkToLocation(link, location) {\n    return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation)\n  }\n\n  submittedFormLinkToLocation() {}\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.navigator.linkPrefetchingIsEnabledForLocation(location)\n    )\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, event) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.applicationAllowsFollowingLinkToLocation(link, location, event)\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const action = this.getActionForLink(link);\n    const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n\n    this.visit(location.href, { action, acceptsStreamResponse });\n  }\n\n  // Navigator delegate\n\n  allowsVisitingLocationWithAction(location, action) {\n    return this.applicationAllowsVisitingLocation(location)\n  }\n\n  visitProposedToLocation(location, options) {\n    extendURLWithDeprecatedProperties(location);\n    this.adapter.visitProposedToLocation(location, options);\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    if (!visit.acceptsStreamResponse) {\n      markAsBusy(document.documentElement);\n      this.view.markVisitDirection(visit.direction);\n    }\n    extendURLWithDeprecatedProperties(visit.location);\n    this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n  }\n\n  visitCompleted(visit) {\n    this.view.unmarkVisitDirection();\n    clearBusyState(document.documentElement);\n    this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return (\n      this.submissionIsNavigatable(form, submitter) &&\n      locationIsVisitable(expandURL(action), this.snapshot.rootLocation)\n    )\n  }\n\n  formSubmitted(form, submitter) {\n    this.navigator.submitForm(form, submitter);\n  }\n\n  // Page observer delegate\n\n  pageBecameInteractive() {\n    this.view.lastRenderedLocation = this.location;\n    this.notifyApplicationAfterPageLoad();\n  }\n\n  pageLoaded() {\n    this.history.assumeControlOfScrollRestoration();\n  }\n\n  pageWillUnload() {\n    this.history.relinquishControlOfScrollRestoration();\n  }\n\n  // Stream observer delegate\n\n  receivedMessageFromStream(message) {\n    this.renderStreamMessage(message);\n  }\n\n  // Page view delegate\n\n  viewWillCacheSnapshot() {\n    this.notifyApplicationBeforeCachingSnapshot();\n  }\n\n  allowsImmediateRender({ element }, options) {\n    const event = this.notifyApplicationBeforeRender(element, options);\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, renderMethod) {\n    this.view.lastRenderedLocation = this.history.location;\n    this.notifyApplicationAfterRender(renderMethod);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    this.preloader.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated(reason) {\n    this.adapter.pageInvalidated(reason);\n  }\n\n  // Frame element\n\n  frameLoaded(frame) {\n    this.notifyApplicationAfterFrameLoad(frame);\n  }\n\n  frameRendered(fetchResponse, frame) {\n    this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n  }\n\n  // Application events\n\n  applicationAllowsFollowingLinkToLocation(link, location, ev) {\n    const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n    return !event.defaultPrevented\n  }\n\n  applicationAllowsVisitingLocation(location) {\n    const event = this.notifyApplicationBeforeVisitingLocation(location);\n    return !event.defaultPrevented\n  }\n\n  notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n    return dispatch(\"turbo:click\", {\n      target: link,\n      detail: { url: location.href, originalEvent: event },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationBeforeVisitingLocation(location) {\n    return dispatch(\"turbo:before-visit\", {\n      detail: { url: location.href },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterVisitingLocation(location, action) {\n    return dispatch(\"turbo:visit\", { detail: { url: location.href, action } })\n  }\n\n  notifyApplicationBeforeCachingSnapshot() {\n    return dispatch(\"turbo:before-cache\")\n  }\n\n  notifyApplicationBeforeRender(newBody, options) {\n    return dispatch(\"turbo:before-render\", {\n      detail: { newBody, ...options },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterRender(renderMethod) {\n    return dispatch(\"turbo:render\", { detail: { renderMethod } })\n  }\n\n  notifyApplicationAfterPageLoad(timing = {}) {\n    return dispatch(\"turbo:load\", {\n      detail: { url: this.location.href, timing }\n    })\n  }\n\n  notifyApplicationAfterFrameLoad(frame) {\n    return dispatch(\"turbo:frame-load\", { target: frame })\n  }\n\n  notifyApplicationAfterFrameRender(fetchResponse, frame) {\n    return dispatch(\"turbo:frame-render\", {\n      detail: { fetchResponse },\n      target: frame,\n      cancelable: true\n    })\n  }\n\n  // Helpers\n\n  submissionIsNavigatable(form, submitter) {\n    if (config.forms.mode == \"off\") {\n      return false\n    } else {\n      const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n\n      if (config.forms.mode == \"optin\") {\n        return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null\n      } else {\n        return submitterIsNavigatable && this.elementIsNavigatable(form)\n      }\n    }\n  }\n\n  elementIsNavigatable(element) {\n    const container = findClosestRecursively(element, \"[data-turbo]\");\n    const withinFrame = findClosestRecursively(element, \"turbo-frame\");\n\n    // Check if Drive is enabled on the session or we're within a Frame.\n    if (config.drive.enabled || withinFrame) {\n      // Element is navigatable by default, unless `data-turbo=\"false\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") != \"false\"\n      } else {\n        return true\n      }\n    } else {\n      // Element isn't navigatable by default, unless `data-turbo=\"true\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") == \"true\"\n      } else {\n        return false\n      }\n    }\n  }\n\n  // Private\n\n  getActionForLink(link) {\n    return getVisitAction(link) || \"advance\"\n  }\n\n  get snapshot() {\n    return this.view.snapshot\n  }\n}\n\n// Older versions of the Turbo Native adapters referenced the\n// `Location#absoluteURL` property in their implementations of\n// the `Adapter#visitProposedToLocation()` and `#visitStarted()`\n// methods. The Location class has since been removed in favor\n// of the DOM URL API, and accordingly all Adapter methods now\n// receive URL objects.\n//\n// We alias #absoluteURL to #toString() here to avoid crashing\n// older adapters which do not expect URL objects. We should\n// consider removing this support at some point in the future.\n\nfunction extendURLWithDeprecatedProperties(url) {\n  Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\n\nconst deprecatedLocationPropertyDescriptors = {\n  absoluteURL: {\n    get() {\n      return this.toString()\n    }\n  }\n};\n\nconst session = new Session(recentRequests);\n\n// Rename `navigator` to avoid shadowing `window.navigator`\nconst { cache, navigator: sessionNavigator } = session;\n\n/**\n * Starts the main session.\n * This initialises any necessary observers such as those to monitor\n * link interactions.\n */\nfunction start() {\n  session.start();\n}\n\n/**\n * Registers an adapter for the main session.\n *\n * @param adapter Adapter to register\n */\nfunction registerAdapter(adapter) {\n  session.registerAdapter(adapter);\n}\n\n/**\n * Performs an application visit to the given location.\n *\n * @param location Location to visit (a URL or path)\n * @param options Options to apply\n * @param options.action Type of history navigation to apply (\"restore\",\n * \"replace\" or \"advance\")\n * @param options.historyChanged Specifies whether the browser history has\n * already been changed for this visit or not\n * @param options.referrer Specifies the referrer of this visit such that\n * navigations to the same page will not result in a new history entry.\n * @param options.snapshotHTML Cached snapshot to render\n * @param options.response Response of the specified location\n */\nfunction visit(location, options) {\n  session.visit(location, options);\n}\n\n/**\n * Connects a stream source to the main session.\n *\n * @param source Stream source to connect\n */\nfunction connectStreamSource(source) {\n  session.connectStreamSource(source);\n}\n\n/**\n * Disconnects a stream source from the main session.\n *\n * @param source Stream source to disconnect\n */\nfunction disconnectStreamSource(source) {\n  session.disconnectStreamSource(source);\n}\n\n/**\n * Renders a stream message to the main session by appending it to the\n * current document.\n *\n * @param message Message to render\n */\nfunction renderStreamMessage(message) {\n  session.renderStreamMessage(message);\n}\n\n/**\n * Sets the delay after which the progress bar will appear during navigation.\n *\n * The progress bar appears after 500ms by default.\n *\n * Note that this method has no effect when used with the iOS or Android\n * adapters.\n *\n * @param delay Time to delay in milliseconds\n */\nfunction setProgressBarDelay(delay) {\n  console.warn(\n    \"Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.drive.progressBarDelay = delay;\n}\n\nfunction setConfirmMethod(confirmMethod) {\n  console.warn(\n    \"Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.confirm = confirmMethod;\n}\n\nfunction setFormMode(mode) {\n  console.warn(\n    \"Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.mode = mode;\n}\n\n/**\n * Morph the state of the currentBody based on the attributes and contents of\n * the newBody. Morphing body elements may dispatch turbo:morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentBody HTMLBodyElement destination of morphing changes\n * @param newBody HTMLBodyElement source of morphing changes\n */\nfunction morphBodyElements(currentBody, newBody) {\n  MorphingPageRenderer.renderElement(currentBody, newBody);\n}\n\n/**\n * Morph the child elements of the currentFrame based on the child elements of\n * the newFrame. Morphing turbo-frame elements may dispatch turbo:before-frame-morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentFrame FrameElement destination of morphing children changes\n * @param newFrame FrameElement source of morphing children changes\n */\nfunction morphTurboFrameElements(currentFrame, newFrame) {\n  MorphingFrameRenderer.renderElement(currentFrame, newFrame);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  PageRenderer: PageRenderer,\n  PageSnapshot: PageSnapshot,\n  FrameRenderer: FrameRenderer,\n  fetch: fetchWithTurboHeaders,\n  config: config,\n  session: session,\n  cache: cache,\n  navigator: sessionNavigator,\n  start: start,\n  registerAdapter: registerAdapter,\n  visit: visit,\n  connectStreamSource: connectStreamSource,\n  disconnectStreamSource: disconnectStreamSource,\n  renderStreamMessage: renderStreamMessage,\n  setProgressBarDelay: setProgressBarDelay,\n  setConfirmMethod: setConfirmMethod,\n  setFormMode: setFormMode,\n  morphBodyElements: morphBodyElements,\n  morphTurboFrameElements: morphTurboFrameElements,\n  morphChildren: morphChildren,\n  morphElements: morphElements\n});\n\nclass TurboFrameMissingError extends Error {}\n\nclass FrameController {\n  fetchResponseLoaded = (_fetchResponse) => Promise.resolve()\n  #currentFetchRequest = null\n  #resolveVisitPromise = () => {}\n  #connected = false\n  #hasBeenLoaded = false\n  #ignoredAttributes = new Set()\n  #shouldMorphFrame = false\n  action = null\n\n  constructor(element) {\n    this.element = element;\n    this.view = new FrameView(this, this.element);\n    this.appearanceObserver = new AppearanceObserver(this, this.element);\n    this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n    this.linkInterceptor = new LinkInterceptor(this, this.element);\n    this.restorationIdentifier = uuid();\n    this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n  }\n\n  // Frame delegate\n\n  connect() {\n    if (!this.#connected) {\n      this.#connected = true;\n      if (this.loadingStyle == FrameLoadingStyle.lazy) {\n        this.appearanceObserver.start();\n      } else {\n        this.#loadSourceURL();\n      }\n      this.formLinkClickObserver.start();\n      this.linkInterceptor.start();\n      this.formSubmitObserver.start();\n    }\n  }\n\n  disconnect() {\n    if (this.#connected) {\n      this.#connected = false;\n      this.appearanceObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkInterceptor.stop();\n      this.formSubmitObserver.stop();\n\n      if (!this.element.hasAttribute(\"recurse\")) {\n        this.#currentFetchRequest?.cancel();\n      }\n    }\n  }\n\n  disabledChanged() {\n    if (this.disabled) {\n      this.#currentFetchRequest?.cancel();\n    } else if (this.loadingStyle == FrameLoadingStyle.eager) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLChanged() {\n    if (this.#isIgnoringChangesTo(\"src\")) return\n\n    if (!this.sourceURL) {\n      this.#currentFetchRequest?.cancel();\n    }\n\n    if (this.element.isConnected) {\n      this.complete = false;\n    }\n\n    if (this.loadingStyle == FrameLoadingStyle.eager || this.#hasBeenLoaded) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLReloaded() {\n    const { refresh, src } = this.element;\n\n    this.#shouldMorphFrame = src && refresh === \"morph\";\n\n    this.element.removeAttribute(\"complete\");\n    this.element.src = null;\n    this.element.src = src;\n    return this.element.loaded\n  }\n\n  loadingStyleChanged() {\n    if (this.loadingStyle == FrameLoadingStyle.lazy) {\n      this.appearanceObserver.start();\n    } else {\n      this.appearanceObserver.stop();\n      this.#loadSourceURL();\n    }\n  }\n\n  async #loadSourceURL() {\n    if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n      this.element.loaded = this.#visit(expandURL(this.sourceURL));\n      this.appearanceObserver.stop();\n      await this.element.loaded;\n      this.#hasBeenLoaded = true;\n    }\n  }\n\n  async loadResponse(fetchResponse) {\n    if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n      this.sourceURL = fetchResponse.response.url;\n    }\n\n    try {\n      const html = await fetchResponse.responseHTML;\n      if (html) {\n        const document = parseHTMLDocument(html);\n        const pageSnapshot = PageSnapshot.fromDocument(document);\n\n        if (pageSnapshot.isVisitable) {\n          await this.#loadFrameResponse(fetchResponse, document);\n        } else {\n          await this.#handleUnvisitableFrameResponse(fetchResponse);\n        }\n      }\n    } finally {\n      this.#shouldMorphFrame = false;\n      this.fetchResponseLoaded = () => Promise.resolve();\n    }\n  }\n\n  // Appearance observer delegate\n\n  elementAppearedInViewport(element) {\n    this.proposeVisitIfNavigatedWithAction(element, getVisitAction(element));\n    this.#loadSourceURL();\n  }\n\n  // Form link click observer delegate\n\n  willSubmitFormLinkToLocation(link) {\n    return this.#shouldInterceptNavigation(link)\n  }\n\n  submittedFormLinkToLocation(link, _location, form) {\n    const frame = this.#findFrameElement(link);\n    if (frame) form.setAttribute(\"data-turbo-frame\", frame.id);\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldInterceptNavigation(element)\n  }\n\n  linkClickIntercepted(element, location) {\n    this.#navigateFrame(element, location);\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return element.closest(\"turbo-frame\") == this.element && this.#shouldInterceptNavigation(element, submitter)\n  }\n\n  formSubmitted(element, submitter) {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n    }\n\n    this.formSubmission = new FormSubmission(this, element, submitter);\n\n    const { fetchRequest } = this.formSubmission;\n    const frame = this.#findFrameElement(element, submitter);\n\n    this.prepareRequest(fetchRequest, frame);\n    this.formSubmission.start();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request, frame = this) {\n    request.headers[\"Turbo-Frame\"] = frame.id;\n\n    if (this.currentNavigationElement?.hasAttribute(\"data-turbo-stream\")) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    markAsBusy(this.element);\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {\n    this.#resolveVisitPromise();\n  }\n\n  async requestSucceededWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  async requestFailedWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  requestErrored(request, error) {\n    console.error(error);\n    this.#resolveVisitPromise();\n  }\n\n  requestFinished(_request) {\n    clearBusyState(this.element);\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted({ formElement }) {\n    markAsBusy(formElement, this.#findFrameElement(formElement));\n  }\n\n  formSubmissionSucceededWithResponse(formSubmission, response) {\n    const frame = this.#findFrameElement(formSubmission.formElement, formSubmission.submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(formSubmission.submitter, formSubmission.formElement, frame));\n    frame.delegate.loadResponse(response);\n\n    if (!formSubmission.isSafe) {\n      session.clearCache();\n    }\n  }\n\n  formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    this.element.delegate.loadResponse(fetchResponse);\n    session.clearCache();\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished({ formElement }) {\n    clearBusyState(formElement, this.#findFrameElement(formElement));\n  }\n\n  // View delegate\n\n  allowsImmediateRender({ element: newFrame }, options) {\n    const event = dispatch(\"turbo:before-frame-render\", {\n      target: this.element,\n      detail: { newFrame, ...options },\n      cancelable: true\n    });\n\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, _renderMethod) {}\n\n  preloadOnLoadLinksForView(element) {\n    session.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated() {}\n\n  // Frame renderer delegate\n\n  willRenderFrame(currentElement, _newElement) {\n    this.previousFrameElement = currentElement.cloneNode(true);\n  }\n\n  visitCachedSnapshot = ({ element }) => {\n    const frame = element.querySelector(\"#\" + this.element.id);\n\n    if (frame && this.previousFrameElement) {\n      frame.replaceChildren(...this.previousFrameElement.children);\n    }\n\n    delete this.previousFrameElement;\n  }\n\n  // Private\n\n  async #loadFrameResponse(fetchResponse, document) {\n    const newFrameElement = await this.extractForeignFrameElement(document.body);\n    const rendererClass = this.#shouldMorphFrame ? MorphingFrameRenderer : FrameRenderer;\n\n    if (newFrameElement) {\n      const snapshot = new Snapshot(newFrameElement);\n      const renderer = new rendererClass(this, this.view.snapshot, snapshot, false, false);\n      if (this.view.renderPromise) await this.view.renderPromise;\n      this.changeHistory();\n\n      await this.view.render(renderer);\n      this.complete = true;\n      session.frameRendered(fetchResponse, this.element);\n      session.frameLoaded(this.element);\n      await this.fetchResponseLoaded(fetchResponse);\n    } else if (this.#willHandleFrameMissingFromResponse(fetchResponse)) {\n      this.#handleFrameMissingFromResponse(fetchResponse);\n    }\n  }\n\n  async #visit(url) {\n    const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n\n    this.#currentFetchRequest?.cancel();\n    this.#currentFetchRequest = request;\n\n    return new Promise((resolve) => {\n      this.#resolveVisitPromise = () => {\n        this.#resolveVisitPromise = () => {};\n        this.#currentFetchRequest = null;\n        resolve();\n      };\n      request.perform();\n    })\n  }\n\n  #navigateFrame(element, url, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(submitter, element, frame));\n\n    this.#withCurrentNavigationElement(element, () => {\n      frame.src = url;\n    });\n  }\n\n  proposeVisitIfNavigatedWithAction(frame, action = null) {\n    this.action = action;\n\n    if (this.action) {\n      const pageSnapshot = PageSnapshot.fromElement(frame).clone();\n      const { visitCachedSnapshot } = frame.delegate;\n\n      frame.delegate.fetchResponseLoaded = async (fetchResponse) => {\n        if (frame.src) {\n          const { statusCode, redirected } = fetchResponse;\n          const responseHTML = await fetchResponse.responseHTML;\n          const response = { statusCode, redirected, responseHTML };\n          const options = {\n            response,\n            visitCachedSnapshot,\n            willRender: false,\n            updateHistory: false,\n            restorationIdentifier: this.restorationIdentifier,\n            snapshot: pageSnapshot\n          };\n\n          if (this.action) options.action = this.action;\n\n          session.visit(frame.src, options);\n        }\n      };\n    }\n  }\n\n  changeHistory() {\n    if (this.action) {\n      const method = getHistoryMethodForAction(this.action);\n      session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n    }\n  }\n\n  async #handleUnvisitableFrameResponse(fetchResponse) {\n    console.warn(\n      `The response (${fetchResponse.statusCode}) from <turbo-frame id=\"${this.element.id}\"> is performing a full page visit due to turbo-visit-control.`\n    );\n\n    await this.#visitResponse(fetchResponse.response);\n  }\n\n  #willHandleFrameMissingFromResponse(fetchResponse) {\n    this.element.setAttribute(\"complete\", \"\");\n\n    const response = fetchResponse.response;\n    const visit = async (url, options) => {\n      if (url instanceof Response) {\n        this.#visitResponse(url);\n      } else {\n        session.visit(url, options);\n      }\n    };\n\n    const event = dispatch(\"turbo:frame-missing\", {\n      target: this.element,\n      detail: { response, visit },\n      cancelable: true\n    });\n\n    return !event.defaultPrevented\n  }\n\n  #handleFrameMissingFromResponse(fetchResponse) {\n    this.view.missing();\n    this.#throwFrameMissingError(fetchResponse);\n  }\n\n  #throwFrameMissingError(fetchResponse) {\n    const message = `The response (${fetchResponse.statusCode}) did not contain the expected <turbo-frame id=\"${this.element.id}\"> and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;\n    throw new TurboFrameMissingError(message)\n  }\n\n  async #visitResponse(response) {\n    const wrapped = new FetchResponse(response);\n    const responseHTML = await wrapped.responseHTML;\n    const { location, redirected, statusCode } = wrapped;\n\n    return session.visit(location, { response: { redirected, statusCode, responseHTML } })\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n    const target = this.#getFrameElementById(id);\n\n    return target instanceof FrameElement ? target : this.element\n  }\n\n  async extractForeignFrameElement(container) {\n    let element;\n    const id = CSS.escape(this.id);\n\n    try {\n      element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n      if (element) {\n        return element\n      }\n\n      element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n      if (element) {\n        await element.loaded;\n        return await this.extractForeignFrameElement(element)\n      }\n    } catch (error) {\n      console.error(error);\n      return new FrameElement()\n    }\n\n    return null\n  }\n\n  #formActionIsVisitable(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return locationIsVisitable(expandURL(action), this.rootLocation)\n  }\n\n  #shouldInterceptNavigation(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n\n    if (element instanceof HTMLFormElement && !this.#formActionIsVisitable(element, submitter)) {\n      return false\n    }\n\n    if (!this.enabled || id == \"_top\") {\n      return false\n    }\n\n    if (id) {\n      const frameElement = this.#getFrameElementById(id);\n      if (frameElement) {\n        return !frameElement.disabled\n      } else if (id == \"_parent\") {\n        return false\n      }\n    }\n\n    if (!session.elementIsNavigatable(element)) {\n      return false\n    }\n\n    if (submitter && !session.elementIsNavigatable(submitter)) {\n      return false\n    }\n\n    return true\n  }\n\n  // Computed properties\n\n  get id() {\n    return this.element.id\n  }\n\n  get disabled() {\n    return this.element.disabled\n  }\n\n  get enabled() {\n    return !this.disabled\n  }\n\n  get sourceURL() {\n    if (this.element.src) {\n      return this.element.src\n    }\n  }\n\n  set sourceURL(sourceURL) {\n    this.#ignoringChangesToAttribute(\"src\", () => {\n      this.element.src = sourceURL ?? null;\n    });\n  }\n\n  get loadingStyle() {\n    return this.element.loading\n  }\n\n  get isLoading() {\n    return this.formSubmission !== undefined || this.#resolveVisitPromise() !== undefined\n  }\n\n  get complete() {\n    return this.element.hasAttribute(\"complete\")\n  }\n\n  set complete(value) {\n    if (value) {\n      this.element.setAttribute(\"complete\", \"\");\n    } else {\n      this.element.removeAttribute(\"complete\");\n    }\n  }\n\n  get isActive() {\n    return this.element.isActive && this.#connected\n  }\n\n  get rootLocation() {\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const root = meta?.content ?? \"/\";\n    return expandURL(root)\n  }\n\n  #isIgnoringChangesTo(attributeName) {\n    return this.#ignoredAttributes.has(attributeName)\n  }\n\n  #ignoringChangesToAttribute(attributeName, callback) {\n    this.#ignoredAttributes.add(attributeName);\n    callback();\n    this.#ignoredAttributes.delete(attributeName);\n  }\n\n  #withCurrentNavigationElement(element, callback) {\n    this.currentNavigationElement = element;\n    callback();\n    delete this.currentNavigationElement;\n  }\n\n  #getFrameElementById(id) {\n    if (id != null) {\n      const element = id === \"_parent\" ?\n        this.element.parentElement.closest(\"turbo-frame\") :\n        document.getElementById(id);\n      if (element instanceof FrameElement) {\n        return element\n      }\n    }\n  }\n}\n\nfunction activateElement(element, currentURL) {\n  if (element) {\n    const src = element.getAttribute(\"src\");\n    if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n      throw new Error(`Matching <turbo-frame id=\"${element.id}\"> element has a source URL which references itself`)\n    }\n    if (element.ownerDocument !== document) {\n      element = document.importNode(element, true);\n    }\n\n    if (element instanceof FrameElement) {\n      element.connectedCallback();\n      element.disconnectedCallback();\n      return element\n    }\n  }\n}\n\nconst StreamActions = {\n  after() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e.nextSibling));\n  },\n\n  append() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.append(this.templateContent));\n  },\n\n  before() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e));\n  },\n\n  prepend() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.prepend(this.templateContent));\n  },\n\n  remove() {\n    this.targetElements.forEach((e) => e.remove());\n  },\n\n  replace() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphElements(targetElement, this.templateContent);\n      } else {\n        targetElement.replaceWith(this.templateContent);\n      }\n    });\n  },\n\n  update() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphChildren(targetElement, this.templateContent);\n      } else {\n        targetElement.innerHTML = \"\";\n        targetElement.append(this.templateContent);\n      }\n    });\n  },\n\n  refresh() {\n    const method = this.getAttribute(\"method\");\n    const requestId = this.requestId;\n    const scroll = this.getAttribute(\"scroll\");\n\n    session.refresh(this.baseURI, { method, requestId, scroll });\n  }\n};\n\n// <turbo-stream action=replace target=id><template>...\n\n/**\n * Renders updates to the page from a stream of messages.\n *\n * Using the `action` attribute, this can be configured one of eight ways:\n *\n * - `after` - inserts the result after the target\n * - `append` - appends the result to the target\n * - `before` - inserts the result before the target\n * - `prepend` - prepends the result to the target\n * - `refresh` - initiates a page refresh\n * - `remove` - removes the target\n * - `replace` - replaces the outer HTML of the target\n * - `update` - replaces the inner HTML of the target\n *\n * @customElement turbo-stream\n * @example\n *   <turbo-stream action=\"append\" target=\"dom_id\">\n *     <template>\n *       Content to append to target designated with the dom_id.\n *     </template>\n *   </turbo-stream>\n */\nclass StreamElement extends HTMLElement {\n  static async renderElement(newElement) {\n    await newElement.performAction();\n  }\n\n  async connectedCallback() {\n    try {\n      await this.render();\n    } catch (error) {\n      console.error(error);\n    } finally {\n      this.disconnect();\n    }\n  }\n\n  async render() {\n    return (this.renderPromise ??= (async () => {\n      const event = this.beforeRenderEvent;\n\n      if (this.dispatchEvent(event)) {\n        await nextRepaint();\n        await event.detail.render(this);\n      }\n    })())\n  }\n\n  disconnect() {\n    try {\n      this.remove();\n      // eslint-disable-next-line no-empty\n    } catch {}\n  }\n\n  /**\n   * Removes duplicate children (by ID)\n   */\n  removeDuplicateTargetChildren() {\n    this.duplicateChildren.forEach((c) => c.remove());\n  }\n\n  /**\n   * Gets the list of duplicate children (i.e. those with the same ID)\n   */\n  get duplicateChildren() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.getAttribute(\"id\"));\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.getAttribute(\"id\")).map((c) => c.getAttribute(\"id\"));\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.getAttribute(\"id\")))\n  }\n\n  /**\n  * Removes duplicate siblings (by ID)\n  */\n  removeDuplicateTargetSiblings() {\n    this.duplicateSiblings.forEach((c) => c.remove());\n  }\n\n  /**\n  * Gets the list of duplicate siblings (i.e. those with the same ID)\n  */\n  get duplicateSiblings() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.parentElement.children]).filter((c) => !!c.id);\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.id).map((c) => c.id);\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.id))\n  }\n\n  /**\n   * Gets the action function to be performed.\n   */\n  get performAction() {\n    if (this.action) {\n      const actionFunction = StreamActions[this.action];\n      if (actionFunction) {\n        return actionFunction\n      }\n      this.#raise(\"unknown action\");\n    }\n    this.#raise(\"action attribute is missing\");\n  }\n\n  /**\n   * Gets the target elements which the template will be rendered to.\n   */\n  get targetElements() {\n    if (this.target) {\n      return this.targetElementsById\n    } else if (this.targets) {\n      return this.targetElementsByQuery\n    } else {\n      this.#raise(\"target or targets attribute is missing\");\n    }\n  }\n\n  /**\n   * Gets the contents of the main `<template>`.\n   */\n  get templateContent() {\n    return this.templateElement.content.cloneNode(true)\n  }\n\n  /**\n   * Gets the main `<template>` used for rendering\n   */\n  get templateElement() {\n    if (this.firstElementChild === null) {\n      const template = this.ownerDocument.createElement(\"template\");\n      this.appendChild(template);\n      return template\n    } else if (this.firstElementChild instanceof HTMLTemplateElement) {\n      return this.firstElementChild\n    }\n    this.#raise(\"first child element must be a <template> element\");\n  }\n\n  /**\n   * Gets the current action.\n   */\n  get action() {\n    return this.getAttribute(\"action\")\n  }\n\n  /**\n   * Gets the current target (an element ID) to which the result will\n   * be rendered.\n   */\n  get target() {\n    return this.getAttribute(\"target\")\n  }\n\n  /**\n   * Gets the current \"targets\" selector (a CSS selector)\n   */\n  get targets() {\n    return this.getAttribute(\"targets\")\n  }\n\n  /**\n   * Reads the request-id attribute\n   */\n  get requestId() {\n    return this.getAttribute(\"request-id\")\n  }\n\n  #raise(message) {\n    throw new Error(`${this.description}: ${message}`)\n  }\n\n  get description() {\n    return (this.outerHTML.match(/<[^>]+>/) ?? [])[0] ?? \"<turbo-stream>\"\n  }\n\n  get beforeRenderEvent() {\n    return new CustomEvent(\"turbo:before-stream-render\", {\n      bubbles: true,\n      cancelable: true,\n      detail: { newStream: this, render: StreamElement.renderElement }\n    })\n  }\n\n  get targetElementsById() {\n    const element = this.ownerDocument?.getElementById(this.target);\n\n    if (element !== null) {\n      return [element]\n    } else {\n      return []\n    }\n  }\n\n  get targetElementsByQuery() {\n    const elements = this.ownerDocument?.querySelectorAll(this.targets);\n\n    if (elements.length !== 0) {\n      return Array.prototype.slice.call(elements)\n    } else {\n      return []\n    }\n  }\n}\n\nclass StreamSourceElement extends HTMLElement {\n  streamSource = null\n\n  connectedCallback() {\n    this.streamSource = this.src.match(/^ws{1,2}:/) ? new WebSocket(this.src) : new EventSource(this.src);\n\n    connectStreamSource(this.streamSource);\n  }\n\n  disconnectedCallback() {\n    if (this.streamSource) {\n      this.streamSource.close();\n\n      disconnectStreamSource(this.streamSource);\n    }\n  }\n\n  get src() {\n    return this.getAttribute(\"src\") || \"\"\n  }\n}\n\nFrameElement.delegateConstructor = FrameController;\n\nif (customElements.get(\"turbo-frame\") === undefined) {\n  customElements.define(\"turbo-frame\", FrameElement);\n}\n\nif (customElements.get(\"turbo-stream\") === undefined) {\n  customElements.define(\"turbo-stream\", StreamElement);\n}\n\nif (customElements.get(\"turbo-stream-source\") === undefined) {\n  customElements.define(\"turbo-stream-source\", StreamSourceElement);\n}\n\n(() => {\n  const scriptElement = document.currentScript;\n  if (!scriptElement) return\n  if (scriptElement.hasAttribute(\"data-turbo-suppress-warning\")) return\n\n  let element = scriptElement.parentElement;\n  while (element) {\n    if (element == document.body) {\n      return console.warn(\n        unindent`\n        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!\n\n        Load your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\n        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements\n\n        \u2014\u2014\n        Suppress this warning by adding a \"data-turbo-suppress-warning\" attribute to: %s\n      `,\n        scriptElement.outerHTML\n      )\n    }\n\n    element = element.parentElement;\n  }\n})();\n\nwindow.Turbo = { ...Turbo, StreamActions };\nstart();\n\nexport { FetchEnctype, FetchMethod, FetchRequest, FetchResponse, FrameElement, FrameLoadingStyle, FrameRenderer, PageRenderer, PageSnapshot, StreamActions, StreamElement, StreamSourceElement, cache, config, connectStreamSource, disconnectStreamSource, fetchWithTurboHeaders as fetch, fetchEnctypeFromString, fetchMethodFromString, isSafe, morphBodyElements, morphChildren, morphElements, morphTurboFrameElements, sessionNavigator as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setFormMode, setProgressBarDelay, start, visit };\n", "let consumer\n\nexport async function getConsumer() {\n  return consumer || setConsumer(createConsumer().then(setConsumer))\n}\n\nexport function setConsumer(newConsumer) {\n  return consumer = newConsumer\n}\n\nexport async function createConsumer() {\n  const { createConsumer } = await import(/* webpackChunkName: \"actioncable\" */ \"@rails/actioncable/src\")\n  return createConsumer()\n}\n\nexport async function subscribeTo(channel, mixin) {\n  const { subscriptions } = await getConsumer()\n  return subscriptions.create(channel, mixin)\n}\n", "// Based on https://github.com/nathan7/snakeize\n//\n// This software is released under the MIT license:\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\nexport default function walk (obj) {\n    if (!obj || typeof obj !== 'object') return obj;\n    if (obj instanceof Date || obj instanceof RegExp) return obj;\n    if (Array.isArray(obj)) return obj.map(walk);\n    return Object.keys(obj).reduce(function (acc, key) {\n        var camel = key[0].toLowerCase() + key.slice(1).replace(/([A-Z]+)/g, function (m, x) {\n            return '_' + x.toLowerCase();\n        });\n        acc[camel] = walk(obj[key]);\n        return acc;\n    }, {});\n};", "import { connectStreamSource, disconnectStreamSource } from \"@hotwired/turbo\"\nimport { subscribeTo } from \"./cable\"\nimport snakeize from \"./snakeize\"\n\nclass TurboCableStreamSourceElement extends HTMLElement {\n  static observedAttributes = [\"channel\", \"signed-stream-name\"]\n\n  async connectedCallback() {\n    connectStreamSource(this)\n    this.subscription = await subscribeTo(this.channel, {\n      received: this.dispatchMessageEvent.bind(this),\n      connected: this.subscriptionConnected.bind(this),\n      disconnected: this.subscriptionDisconnected.bind(this)\n    })\n  }\n\n  disconnectedCallback() {\n    disconnectStreamSource(this)\n    if (this.subscription) this.subscription.unsubscribe()\n    this.subscriptionDisconnected()\n  }\n\n  attributeChangedCallback() {\n    if (this.subscription) {\n      this.disconnectedCallback()\n      this.connectedCallback()\n    }\n  }\n\n  dispatchMessageEvent(data) {\n    const event = new MessageEvent(\"message\", { data })\n    return this.dispatchEvent(event)\n  }\n\n  subscriptionConnected() {\n    this.setAttribute(\"connected\", \"\")\n  }\n\n  subscriptionDisconnected() {\n    this.removeAttribute(\"connected\")\n  }\n\n  get channel() {\n    const channel = this.getAttribute(\"channel\")\n    const signed_stream_name = this.getAttribute(\"signed-stream-name\")\n    return { channel, signed_stream_name, ...snakeize({ ...this.dataset }) }\n  }\n}\n\n\nif (customElements.get(\"turbo-cable-stream-source\") === undefined) {\n  customElements.define(\"turbo-cable-stream-source\", TurboCableStreamSourceElement)\n}\n", "export function encodeMethodIntoRequestBody(event) {\n  if (event.target instanceof HTMLFormElement) {\n    const { target: form, detail: { fetchOptions } } = event\n\n    form.addEventListener(\"turbo:submit-start\", ({ detail: { formSubmission: { submitter } } }) => {\n      const body = isBodyInit(fetchOptions.body) ? fetchOptions.body : new URLSearchParams()\n      const method = determineFetchMethod(submitter, body, form)\n\n      if (!/get/i.test(method)) {\n        if (/post/i.test(method)) {\n          body.delete(\"_method\")\n        } else {\n          body.set(\"_method\", method)\n        }\n\n        fetchOptions.method = \"post\"\n      }\n    }, { once: true })\n  }\n}\n\nfunction determineFetchMethod(submitter, body, form) {\n  const formMethod = determineFormMethod(submitter)\n  const overrideMethod = body.get(\"_method\")\n  const method = form.getAttribute(\"method\") || \"get\"\n\n  if (typeof formMethod == \"string\") {\n    return formMethod\n  } else if (typeof overrideMethod == \"string\") {\n    return overrideMethod\n  } else {\n    return method\n  }\n}\n\nfunction determineFormMethod(submitter) {\n  if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) {\n    // Rails 7 ActionView::Helpers::FormBuilder#button method has an override\n    // for formmethod if the button does not have name or value attributes\n    // set, which is the default. This means that if you use <%= f.button\n    // formmethod: :delete %>, it will generate a <button name=\"_method\"\n    // value=\"delete\" formmethod=\"post\">. Therefore, if the submitter's name\n    // is already _method, it's value attribute already contains the desired\n    // method.\n    if (submitter.name === '_method') {\n      return submitter.value\n    } else if (submitter.hasAttribute(\"formmethod\")) {\n      return submitter.formMethod\n    } else {\n      return null\n    }\n  } else {\n    return null\n  }\n}\n\nfunction isBodyInit(body) {\n  return body instanceof FormData || body instanceof URLSearchParams\n}\n", "import \"./cable_stream_source_element\"\n\nimport * as Turbo from \"@hotwired/turbo\"\nexport { Turbo }\n\nimport * as cable from \"./cable\"\nexport { cable }\n\nimport { encodeMethodIntoRequestBody } from \"./fetch_requests\"\n\nwindow.Turbo = Turbo\n\naddEventListener(\"turbo:before-fetch-request\", encodeMethodIntoRequestBody)\n", "import \"controllers\"\nimport \"@hotwired/turbo-rails\"\nimport { Turbo } from \"@hotwired/turbo-rails\"\n\n// Custom Turbo Stream action that performs a full-page browser navigation.\n// Useful for cross-origin redirects (e.g. www.* -> app.*) which Turbo's own\n// Visit cannot perform.\nTurbo.StreamActions.redirect_to = function () {\n  const url = this.getAttribute(\"url\")\n  if (url) {\n    window.location.href = url\n  }\n}\n\n// Helper function to safely initialize Preline\nfunction initializePreline() {\n  if (typeof HSStaticMethods !== 'undefined' && HSStaticMethods.autoInit) {\n    HSStaticMethods.autoInit()\n  } else {\n    // Retry after a short delay if Preline isn't ready yet\n    setTimeout(() => {\n      if (typeof HSStaticMethods !== 'undefined' && HSStaticMethods.autoInit) {\n        HSStaticMethods.autoInit()\n      }\n    }, 100)\n  }\n}\n\n// Initialize on initial page load - don't wait for anything\ndocument.addEventListener('DOMContentLoaded', () => {\n  initializePreline()\n})\n\n// Initialize on initial page load\ndocument.addEventListener('turbo:load', () => {\n  initializePreline()\n})\n\n// Initialize on frame loads\ndocument.addEventListener('turbo:frame-load', () => {\n  initializePreline()\n})\n\n// Initialize after Turbo renders new content\ndocument.addEventListener('turbo:render', () => {\n  initializePreline()\n})\n\n// Handle popstate events (browser back/forward) for insights pages\n// This ensures filters, tabs, and content update correctly when user navigates back/forward\nlet popstateHandler = null\n\nfunction isInsightsPageWithSection() {\n  const pathParts = window.location.pathname.split('/').filter(Boolean)\n  const insightsIndex = pathParts.indexOf('insights')\n\n  if (insightsIndex === -1) {\n    return false\n  }\n\n  // Valid sections that indicate this is a story/insights page\n  const validSections = ['overview', 'listings', 'occupancy_analysis', 'pricing_revenue',\n                         'supply_demand', 'submarkets', 'top_listings', 'related_markets']\n\n  // Check if the last part of the path is a valid section\n  const lastPart = pathParts[pathParts.length - 1]\n  return validSections.includes(lastPart)\n}\n\ndocument.addEventListener('turbo:load', () => {\n  // Remove previous handler if it exists\n  if (popstateHandler) {\n    window.removeEventListener('popstate', popstateHandler)\n  }\n\n  // Only add handler if we're on an insights page with a section\n  if (isInsightsPageWithSection()) {\n    popstateHandler = (event) => {\n      // Dispatch event to sync tabs (story_tabs_controller will listen)\n      window.dispatchEvent(new CustomEvent('story:syncFromUrl'))\n\n      // Use Turbo to visit the current URL (which changed via browser history)\n      // This will trigger Turbo navigation and update all frames automatically\n      Turbo.visit(window.location.href, { action: 'replace' })\n    }\n    window.addEventListener('popstate', popstateHandler)\n  }\n})\n\n// Clean up on page unload\ndocument.addEventListener('turbo:before-cache', () => {\n  if (popstateHandler) {\n    window.removeEventListener('popstate', popstateHandler)\n    popstateHandler = null\n  }\n})"],
  "mappings": "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",
  "names": ["extend", "dest", "i", "j", "len", "src", "create", "F", "proto", "bind", "fn", "obj", "slice", "args", "lastId", "stamp", "throttle", "time", "context", "lock", "wrapperFn", "later", "wrapNum", "x", "range", "includeMax", "max", "min", "d", "falseFn", "formatNum", "num", "precision", "pow", "trim", "str", "splitWords", "setOptions", "options", "getParamString", "existingUrl", "uppercase", "params", "templateRe", "template", "data", "key", "value", "isArray", "indexOf", "array", "el", "emptyImageUrl", "getPrefixed", "name", "lastTime", "timeoutDefer", "timeToCall", "requestFn", "cancelFn", "id", "requestAnimFrame", "immediate", "cancelAnimFrame", "Class", "props", "NewClass", "Util.setOptions", "parentProto", "Util.create", "Util.extend", "checkDeprecatedMixinEvents", "parentOptions", "init", "includes", "Util.isArray", "Events", "types", "type", "Util.splitWords", "removeAll", "_once", "newListener", "listeners", "Util.falseFn", "index", "listener", "propagate", "event", "l", "_fn", "Util.stamp", "e", "Evented", "Point", "y", "round", "trunc", "v", "point", "toPoint", "Bounds", "a", "b", "points", "min2", "max2", "toBounds", "bounds", "xIntersects", "yIntersects", "xOverlaps", "yOverlaps", "bufferRatio", "heightBuffer", "widthBuffer", "LatLngBounds", "corner1", "corner2", "latlngs", "sw", "ne", "sw2", "ne2", "LatLng", "toLatLng", "toLatLngBounds", "latIntersects", "lngIntersects", "latOverlaps", "lngOverlaps", "maxMargin", "lat", "lng", "alt", "margin", "Util.formatNum", "other", "Earth", "sizeInMeters", "latAccuracy", "lngAccuracy", "c", "CRS", "latlng", "zoom", "projectedPoint", "scale", "untransformedPoint", "s", "Util.wrapNum", "center", "newCenter", "latShift", "lngShift", "newSw", "newNe", "latlng1", "latlng2", "rad", "lat1", "lat2", "sinDLat", "sinDLon", "earthRadius", "SphericalMercator", "sin", "Transformation", "toTransformation", "EPSG3857", "EPSG900913", "svgCreate", "pointsToPath", "rings", "closed", "len2", "p", "Browser", "style", "ie", "ielt9", "edge", "webkit", "userAgentContains", "android", "android23", "webkitVer", "androidStock", "opera", "chrome", "gecko", "safari", "phantom", "opera12", "win", "ie3d", "webkit3d", "gecko3d", "any3d", "mobile", "mobileWebkit", "mobileWebkit3d", "msPointer", "pointer", "touchNative", "touch", "mobileOpera", "mobileGecko", "retina", "passiveEvents", "supportsPassiveOption", "opts", "canvas", "svg", "inlineSvg", "div", "vml", "shape", "mac", "linux", "POINTER_DOWN", "POINTER_MOVE", "POINTER_UP", "POINTER_CANCEL", "pEvent", "handle", "_onPointerStart", "_handlePointer", "_pointers", "_pointerDocListener", "addPointerListener", "handler", "_addPointerDocListener", "removePointerListener", "_globalPointerDown", "_globalPointerMove", "_globalPointerUp", "DomEvent.preventDefault", "makeDblclick", "newEvent", "prop", "delay", "addDoubleTapListener", "last", "detail", "simDblclick", "path", "DomEvent.getPropagationPath", "now", "removeDoubleTapListener", "handlers", "TRANSFORM", "testProp", "TRANSITION", "TRANSITION_END", "get", "getStyle", "css", "tagName", "className", "container", "remove", "parent", "empty", "toFront", "toBack", "hasClass", "getClass", "addClass", "classes", "setClass", "removeClass", "Util.trim", "setOpacity", "_setOpacityIE", "filter", "filterName", "setTransform", "offset", "pos", "setPosition", "getPosition", "disableTextSelection", "enableTextSelection", "_userSelect", "DomEvent.on", "DomEvent.off", "userSelectProperty", "disableImageDrag", "enableImageDrag", "_outlineElement", "_outlineStyle", "preventOutline", "element", "restoreOutline", "getSizedParentNode", "getScale", "rect", "on", "addOne", "eventsKey", "off", "batchRemove", "removeOne", "Util.indexOf", "filterFn", "mouseSubst", "originalHandler", "isExternalTarget", "stopPropagation", "disableScrollPropagation", "disableClickPropagation", "preventDefault", "stop", "getPropagationPath", "ev", "getMousePosition", "wheelPxFactor", "getWheelDelta", "related", "PosAnimation", "newPos", "duration", "easeLinearity", "DomUtil.getPosition", "Util.requestAnimFrame", "elapsed", "progress", "DomUtil.setPosition", "Util.cancelAnimFrame", "t", "Map", "Util.bind", "DomUtil.TRANSITION", "DomUtil.TRANSITION_END", "moved", "delta", "viewHalf", "containerPoint", "centerOffset", "paddingTL", "paddingBR", "paddingOffset", "swPoint", "nePoint", "target", "DomUtil.addClass", "targetCenter", "targetZoom", "from", "to", "size", "startZoom", "w0", "w1", "u1", "rho", "rho2", "r", "s1", "s2", "t1", "b1", "sq", "log", "sinh", "n", "cosh", "tanh", "r0", "w", "u", "easeOut", "start", "S", "frame", "oldZoom", "pixelCenter", "pixelPoint", "pixelBounds", "paddedBounds", "paddedSize", "oldSize", "newSize", "oldCenter", "onResponse", "onError", "error", "message", "HandlerClass", "DomUtil.remove", "pane", "DomUtil.create", "inside", "padding", "nw", "se", "boundsSize", "snap", "scalex", "scaley", "topLeftPoint", "toZoom", "fromZoom", "crs", "layerPoint", "DomEvent.getMousePosition", "DomUtil.get", "position", "DomUtil.getStyle", "panes", "noMoveStart", "loading", "zoomChanged", "supressEvent", "onOff", "targets", "isHover", "dragging", "DomEvent.isExternalTarget", "DomUtil.preventOutline", "canvasTargets", "synth", "filtered", "isMarker", "callback", "pixelOrigin", "topLeft", "latLngBounds", "centerPoint", "viewBounds", "newBounds", "pxBounds", "maxBounds", "projectedMaxBounds", "minOffset", "maxOffset", "dx", "dy", "left", "right", "DomUtil.removeClass", "proxy", "DomUtil.TRANSFORM", "transform", "DomUtil.setTransform", "z", "startAnim", "noUpdate", "createMap", "Control", "map", "corner", "control", "corners", "createCorner", "vSide", "hSide", "Layers", "layerA", "layerB", "nameA", "nameB", "baseLayers", "overlays", "layer", "acceptableHeight", "collapsed", "DomEvent.disableClickPropagation", "DomEvent.disableScrollPropagation", "section", "link", "overlay", "DomUtil.empty", "baseLayersPresent", "overlaysPresent", "baseLayersCount", "checked", "radioHtml", "radioFragment", "label", "input", "holder", "inputs", "addedLayers", "removedLayers", "that", "layers", "Zoom", "zoomName", "html", "title", "DomEvent.stop", "Scale", "maxMeters", "meters", "maxFeet", "maxMiles", "miles", "feet", "text", "ratio", "pow10", "ukrainianFlag", "Attribution", "prefix", "attribs", "prefixAndAttribs", "attribution", "Handler", "Mixin", "START", "Draggable", "dragStartTarget", "DomUtil.hasClass", "DomUtil.disableImageDrag", "DomUtil.disableTextSelection", "first", "sizedParent", "DomUtil.getSizedParentNode", "DomUtil.getScale", "mouseevent", "noInertia", "DomUtil.enableImageDrag", "DomUtil.enableTextSelection", "fireDragend", "clipPolygon", "clippedPoints", "edges", "k", "LineUtil._getBitCode", "LineUtil._getEdgeIntersection", "polygonCenter", "p1", "p2", "f", "area", "LineUtil.isFlat", "centroidLatLng", "areaBounds", "centroid", "latlngCenter", "coords", "latSum", "lngSum", "simplify", "tolerance", "sqTolerance", "_reducePoints", "_simplifyDP", "pointToSegmentDistance", "_sqClosestPointOnSegment", "closestPointOnSegment", "ArrayConstructor", "markers", "_simplifyDPStep", "newPoints", "maxSqDist", "sqDist", "reducedPoints", "prev", "_sqDist", "_lastCode", "clipSegment", "useLastCode", "codeA", "_getBitCode", "codeB", "codeOut", "newCode", "_getEdgeIntersection", "code", "dot", "isFlat", "_flat", "polylineCenter", "halfDist", "segDist", "dist", "LonLat", "Mercator", "tmp", "con", "ts", "phi", "dphi", "EPSG3395", "EPSG4326", "Simple", "Layer", "targetEl", "events", "method", "minZoom", "maxZoom", "oldZoomSpan", "LayerGroup", "layerId", "methodName", "zIndex", "layerGroup", "FeatureGroup", "featureGroup", "Icon", "oldIcon", "img", "sizeOption", "anchor", "icon", "IconDefault", "strip", "re", "idx", "match", "MarkerDrag", "marker", "speed", "iconPos", "origin", "panBounds", "movement", "shadow", "Marker", "latLng", "oldLatLng", "classToAdd", "addIcon", "newShadow", "addShadow", "opt", "draggable", "opacity", "DomUtil.setOpacity", "iconOpts", "Path", "CircleMarker", "radius", "r2", "circleMarker", "Circle", "legacyOptions", "half", "latR", "top", "bottom", "lngR", "circle", "Polyline", "minDistance", "minPoint", "closest", "LineUtil._sqClosestPointOnSegment", "jLen", "LineUtil.polylineCenter", "result", "flat", "projectedBounds", "ring", "parts", "segment", "LineUtil.clipSegment", "LineUtil.simplify", "part", "LineUtil.pointToSegmentDistance", "polyline", "LineUtil._flat", "Polygon", "PolyUtil.polygonCenter", "clipped", "PolyUtil.clipPolygon", "polygon", "GeoJSON", "geojson", "features", "feature", "geometryToLayer", "asFeature", "geometry", "pointToLayer", "_coordsToLatLng", "coordsToLatLng", "_pointToLayer", "coordsToLatLngs", "geoLayer", "featureLayer", "pointToLayerFn", "levelsDeep", "latLngToCoords", "latLngsToCoords", "getFeature", "newGeometry", "PointToGeoJSON", "multi", "holes", "isGeometryCollection", "jsons", "json", "geoJSON", "geoJson", "ImageOverlay", "url", "styleOpts", "DomUtil.toFront", "DomUtil.toBack", "wasElementSupplied", "image", "errorUrl", "imageOverlay", "VideoOverlay", "vid", "sourceElements", "sources", "source", "videoOverlay", "video", "SVGOverlay", "svgOverlay", "DivOverlay", "content", "node", "OverlayClass", "old", "Popup", "DomEvent.stopPropagation", "wrapper", "closeButton", "width", "height", "maxHeight", "scrolledClass", "marginBottom", "containerHeight", "containerWidth", "layerPos", "containerPos", "popup", "Tooltip", "subX", "subY", "tooltipPoint", "direction", "tooltipWidth", "tooltipHeight", "tooltip", "DivIcon", "bgPos", "divIcon", "GridLayer", "tileZoom", "Util.throttle", "compare", "edgeZIndex", "nextFrame", "willPrune", "tile", "fade", "level", "x2", "y2", "z2", "coords2", "animating", "noPrune", "tileZoomChanged", "translate", "tileSize", "mapZoom", "halfSize", "tileRange", "tileCenter", "queue", "noPruneRange", "fragment", "tileBounds", "nwPoint", "sePoint", "bp", "tilePos", "err", "newCoords", "gridLayer", "TileLayer", "noRedraw", "done", "invertedY", "Util.template", "zoomReverse", "zoomOffset", "tilePoint", "Util.emptyImageUrl", "tileLayer", "TileLayerWMS", "wmsParams", "realRetina", "projectionKey", "bbox", "tileLayerWMS", "Renderer", "currentCenterPoint", "topLeftOffset", "Canvas", "m", "order", "next", "dashArray", "dashValue", "ctx", "clickedLayer", "candidateHoveredLayer", "vmlCreate", "vmlMixin", "stroke", "fill", "SVG", "arc", "renderer", "Rectangle", "rectangle", "BoxZoom", "DoubleClickZoom", "Drag", "pxCenter", "pxWorldCenter", "threshold", "limit", "worldWidth", "halfWidth", "newX1", "newX2", "newX", "ease", "speedVector", "limitedSpeed", "limitedSpeedVector", "decelerationDuration", "Keyboard", "body", "docEl", "panDelta", "keys", "codes", "zoomDelta", "newLatLng", "ScrollWheelZoom", "DomEvent.getWheelDelta", "debounce", "d2", "d3", "d4", "tapHoldDelay", "TapHold", "cancelClickPrevent", "simulatedEvent", "TouchZoom", "moveFn", "require_wicket", "__commonJSMin", "exports", "module", "root", "factory", "beginsWith", "endsWith", "Wkt", "obj", "str", "sub", "initializer", "fullStr", "trimmed", "noParens", "a", "b", "result", "config", "i", "j", "k", "coords", "iring", "oring", "cs", "json", "ring", "rings", "type", "s", "wkt", "prefix", "matches", "components", "pieces", "data", "point", "multipoint", "parts", "linestring", "multilinestring", "polygon", "multipolygon", "box", "points", "multipoints", "line", "lines", "subcomponents", "split", "n", "x_cord", "y_cord", "polygons", "require_wicket_leaflet", "__commonJSMin", "exports", "module", "root", "factory", "Wkt", "coords", "i", "verts", "config", "component", "coord", "layers", "latlngs", "comps", "reverse", "lat", "lng", "obj", "attr", "coordsFromLatLngs", "features", "rings", "tmp", "boundary", "arr", "mpgon", "mpline", "mpoint", "require_geostats_min", "__commonJSMin", "exports", "module", "v", "m", "a", "b", "c", "e", "d", "f", "g", "h", "l", "k", "r", "u", "n", "p", "q", "w", "adapters_default", "init_adapters", "__esmMin", "logger_default", "init_logger", "__esmMin", "init_adapters", "messages", "adapters_default", "now", "secondsSince", "ConnectionMonitor", "connection_monitor_default", "init_connection_monitor", "__esmMin", "init_logger", "time", "connection", "logger_default", "staleThreshold", "reconnectionBackoffRate", "backoff", "jitter", "internal_default", "init_internal", "__esmMin", "message_types", "protocols", "supportedProtocols", "indexOf", "Connection", "connection_default", "init_connection", "__esmMin", "init_adapters", "init_connection_monitor", "init_internal", "init_logger", "internal_default", "consumer", "connection_monitor_default", "data", "logger_default", "socketProtocols", "adapters_default", "allowReconnect", "error", "states", "state", "eventName", "handler", "event", "identifier", "message", "reason", "reconnect", "type", "extend", "Subscription", "init_subscription", "__esmMin", "object", "properties", "key", "value", "consumer", "params", "mixin", "action", "data", "SubscriptionGuarantor", "subscription_guarantor_default", "init_subscription_guarantor", "__esmMin", "init_logger", "subscriptions", "subscription", "logger_default", "s", "Subscriptions", "init_subscriptions", "__esmMin", "init_logger", "init_subscription", "init_subscription_guarantor", "consumer", "subscription_guarantor_default", "channelName", "mixin", "channel", "params", "subscription", "Subscription", "identifier", "s", "callbackName", "args", "subscriptions", "logger_default", "command", "createWebSocketURL", "url", "a", "Consumer", "init_consumer", "__esmMin", "init_connection", "init_subscriptions", "Subscriptions", "connection_default", "data", "subprotocol", "src_exports", "__export", "connection_default", "connection_monitor_default", "Consumer", "internal_default", "Subscription", "subscription_guarantor_default", "Subscriptions", "adapters_default", "createConsumer", "createWebSocketURL", "getConfig", "logger_default", "url", "name", "element", "init_src", "__esmMin", "init_adapters", "init_connection", "init_connection_monitor", "init_consumer", "init_internal", "init_logger", "init_subscription", "init_subscription_guarantor", "init_subscriptions", "EventListener", "eventTarget", "eventName", "eventOptions", "binding", "event", "extendedEvent", "extendEvent", "left", "right", "leftIndex", "rightIndex", "stopImmediatePropagation", "Dispatcher", "application", "eventListener", "listeners", "map", "clearEventListeners", "error", "message", "detail", "eventListenerMap", "cacheKey", "parts", "key", "defaultActionDescriptorFilters", "value", "element", "descriptorPattern", "parseActionDescriptorString", "descriptorString", "matches", "keyFilter", "parseEventTarget", "parseEventOptions", "eventTargetName", "options", "token", "stringifyEventTarget", "camelize", "_", "char", "namespaceCamelize", "capitalize", "dasherize", "tokenize", "isSomething", "object", "hasProperty", "property", "allModifiers", "Action", "index", "descriptor", "schema", "getDefaultEventNameForElement", "eventFilter", "filters", "standardFilter", "params", "pattern", "name", "match", "typecast", "meta", "ctrl", "alt", "shift", "modifier", "defaultEventNames", "e", "tagName", "Binding", "context", "action", "actionEvent", "method", "actionDescriptorFilters", "controller", "passes", "filter", "target", "currentTarget", "identifier", "ElementObserver", "delegate", "mutations", "callback", "mutation", "attributeName", "nodes", "node", "tree", "processor", "AttributeObserver", "add", "fetch", "del", "prune", "values", "Multimap", "set", "size", "_key", "_values", "SelectorObserver", "element", "selector", "delegate", "details", "ElementObserver", "Multimap", "callback", "matches", "tree", "match", "selectors", "_attributeName", "matchedBefore", "StringMapObserver", "mutations", "attributeName", "mutation", "oldValue", "key", "value", "attribute", "TokenListObserver", "AttributeObserver", "unmatchedTokens", "matchedTokens", "tokens", "token", "previousTokens", "currentTokens", "firstDifferingIndex", "zip", "previousToken", "currentToken", "tokensAreEqual", "tokenString", "parseTokenString", "content", "index", "left", "right", "length", "_", "ValueListObserver", "parseResult", "valuesByToken", "error", "BindingObserver", "context", "action", "binding", "Binding", "Action", "ValueObserver", "receiver", "descriptor", "name", "defaultValue", "writer", "rawValue", "rawOldValue", "changedMethodName", "changedMethod", "valueDescriptorMap", "descriptors", "hasMethodName", "capitalize", "TargetObserver", "_a", "readInheritableStaticArrayValues", "constructor", "propertyName", "ancestors", "getAncestorsForConstructor", "values", "getOwnStaticArrayValues", "readInheritableStaticObjectPairs", "pairs", "getOwnStaticObjectPairs", "definition", "OutletObserver", "outletName", "observer", "_selector", "outlet", "hasOutlet", "hasOutletController", "_element", "selectorObserver", "attributeObserver", "dependencies", "module", "identifiers", "Context", "scope", "functionName", "detail", "identifier", "controller", "message", "namespaceCamelize", "methodName", "args", "bless", "shadow", "getBlessedProperties", "properties", "shadowConstructor", "extend", "shadowProperties", "getShadowProperties", "blessedProperties", "blessing", "prototype", "getOwnKeys", "getShadowedDescriptor", "shadowingDescriptor", "object", "extendWithReflect", "extended", "testReflectExtension", "b", "blessDefinition", "Module", "application", "ClassMap", "tokenize", "DataMap", "dasherize", "Guide", "logger", "warnedKeys", "attributeValueContainsToken", "TargetSet", "targetName", "targetNames", "target", "targets", "targetDescriptor", "revisedAttributeName", "OutletSet", "controllerElement", "outletNames", "outlets", "controllerAttribute", "Scope", "_Scope", "schema", "ScopeObserver", "scopesByIdentifier", "referenceCount", "Router", "contexts", "afterLoad", "defaultSchema", "objectFromEntries", "c", "n", "array", "memo", "k", "v", "Application", "Dispatcher", "defaultActionDescriptorFilters", "domReady", "controllerConstructor", "filter", "head", "rest", "resolve", "ClassPropertiesBlessing", "classDefinition", "propertiesForClassDefinition", "classes", "OutletPropertiesBlessing", "outletDefinition", "propertiesForOutletDefinition", "getOutletController", "getControllerAndEnsureConnectedScope", "outletController", "camelizedName", "outletElement", "TargetPropertiesBlessing", "targetDefinition", "propertiesForTargetDefinition", "ValuePropertiesBlessing", "valueDefinitionPairs", "propertyDescriptorMap", "result", "valueDefinitionPair", "valueDescriptor", "parseValueDefinitionPair", "propertiesForValueDefinitionPair", "read", "write", "typeDefinition", "valueDescriptorForTokenAndTypeDefinition", "parseValueTypeConstant", "constant", "parseValueTypeDefault", "parseValueTypeObject", "payload", "typeObject", "hasType", "isSomething", "hasDefault", "fullObject", "onlyType", "onlyDefault", "typeFromObject", "typeFromDefaultValue", "propertyPath", "parseValueTypeDefinition", "typeFromConstant", "type", "defaultValueForDefinition", "defaultValuesByType", "hasProperty", "constantFromType", "camelize", "readers", "writers", "writeString", "writeJSON", "Controller", "_identifier", "_application", "eventName", "prefix", "bubbles", "cancelable", "event", "application", "Application", "admin_autocomplete_boost_controller_default", "Controller", "event", "suggestion", "response", "data", "input", "displayName", "polygonInfo", "polygonType", "polygonCountry", "error", "button", "a", "adr_tier_controller_default", "Controller", "globalMax", "seriesData", "date", "value", "event", "tier", "button", "buttonTier", "chartData", "tooltipItems", "dataIndex", "dateString", "ctx", "dates", "todayValue", "localeValue", "currencyCodeValue", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "currentDate", "now", "context", "chart", "amenities_chart_controller_default", "Controller", "ctx", "percentages", "count", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "context", "chart", "value", "amenities_dropdown_controller_default", "Controller", "collectionItem", "item", "event", "e", "checkbox", "amplitude_controller_default", "Controller", "plugin", "event", "name", "properties", "value", "identifyEvent", "eventName", "eventProperties", "baseProperties", "form", "formData", "formProperties", "subjectField", "emailField", "messageField", "allProperties", "propsString", "application_controller_default", "Controller", "event", "cityName", "filtersExplainerModal", "authSource", "target", "targetElement", "resolve", "properties", "sectionName", "url", "sectionId", "message", "flashMessage", "container", "source", "polygonId", "countryName", "form", "eventName", "auth0_controller_default", "Controller", "e", "event", "auth_controller_default", "Controller", "source", "properties", "event", "billingType", "action", "planId", "returnToPage", "form", "csrfToken", "csrfInput", "screenHintInput", "localeInput", "originInput", "url", "parseSearchedAt", "value", "parsed", "LEGACY_INSIGHTS_OFFSET_MS", "insightSearchedAt", "item", "index", "total", "mergeRecentSearches", "insights", "calculator", "limit", "normalizedInsights", "normalizedCalculator", "merged", "a", "b", "filterRecentSearches", "items", "query", "normalizedQuery", "countryCodeFromPlace", "place", "components", "component", "code", "countryCodeFromGeocoderResult", "result", "mapsLoadPromise", "resolvedGoogleMapsApiKey", "ensureGoogleMapsBootstrap", "options", "g", "h", "p", "c", "l", "q", "m", "b", "d", "r", "e", "u", "resolve", "reject", "a", "k", "t", "lib", "args", "loadGoogleMaps", "apiKey", "language", "error", "autocomplete_controller_default", "Controller", "recentHeader", "noRecentSearchesMessage", "startSearchingMessage", "searchResultsHeader", "recentActivity", "locations", "obj", "datasets", "query", "syncCallback", "filtered", "filterRecentSearches", "context", "data", "asyncCallback", "ev", "suggestion", "currentHost", "targetHost", "protocol", "targetUrl", "path", "suffix", "e", "searchTerm", "$menu", "isMenuVisible", "$firstSuggestion", "$calculatorCta", "raw", "escapedAddress", "message", "event", "address", "apiKey", "resolvedGoogleMapsApiKey", "language", "maps", "loadGoogleMaps", "Geocoder", "geocoder", "results", "location", "lat", "lng", "country", "countryCodeFromGeocoderResult", "params", "error", "text", "div", "$controller", "$iconContainer", "$headerIconContainer", "$mobileIconContainer", "$input", "$container", "$loadingIndicator", "storageItemKey", "stored", "activityItem", "item", "maxItems", "retryError", "limit", "mergeRecentSearches", "value", "parsed", "normalized", "index", "slug", "bedroom_count_chart_controller_default", "Controller", "ctx", "total", "sum", "value", "percentages", "count", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "context", "chart", "calendar_controller_default", "Controller", "info", "blocking_reason", "review", "discount", "tooltip", "dateObj", "date", "e", "a", "chart_controller_default", "Controller", "event", "tierKey", "seriesKey", "datasetIndex", "meta", "button", "labelText", "ctx", "hasMultipleSeries", "chartData", "b", "dates", "date", "now", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "datasets", "seriesConfig", "key", "data", "index", "config", "seriesColor", "bedroomColors", "displayLabel", "value", "context", "chart", "e", "legendItem", "tooltipItems", "dataIndex", "dateString", "titleOptions", "datasetLabel", "formattedValue", "comp_set_list_row_controller_default", "Controller", "event", "url", "contact_form_controller_default", "Controller", "event", "name", "replyTo", "subject", "message", "bodyParts", "body", "params", "mailto", "link", "eventName", "properties", "email", "propsString", "daily_occupancy_chart_controller_default", "Controller", "ctx", "formattedBookedNights", "date", "today", "todayIndex", "barColors", "formattedDate", "isBooked", "bookedStatus", "isTodayArray", "context", "index", "displayedLabel", "currentYear", "isToday", "label", "value", "dateString", "desktop_filters_controller_default", "Controller", "el", "row", "detection_simulator_controller_default", "Controller", "event", "step", "activeStep", "button", "index", "panel", "exp", "dropdown_controller_default", "Controller", "event", "range", "months", "label", "labelElement", "button", "email_exists_modal_controller_default", "Controller", "emailDisplay", "modal", "attempt", "google", "password", "signinLink", "button", "event", "loadingTimeoutId", "streamHideDebounceId", "streamHideFallbackId", "filtersLoadingVisible", "documentLoadingListenersAttached", "showFiltersLoadingOverlay", "existingOverlay", "loadingOverlay", "clearFiltersLoadingTimers", "hideFiltersLoadingOverlay", "hideFiltersLoadingOverlayAfterPaint", "waitForPendingTurboStreams", "callback", "check", "scheduleHideAfterFilterStreams", "scheduleHideFallback", "delayMs", "attachFiltersLoadingListeners", "event", "form", "filters_container_controller_default", "Controller", "link", "isFilterAction", "linkUrl", "currentSection", "pathParts", "insightsIndex", "isCustomPolygon", "e", "formAction", "formUrl", "value", "key", "sourceUrl", "currentUrl", "nonFilterParams", "allFilterKeys", "checkbox", "params", "normalizedKey", "current", "validSections", "sectionPart", "lastPart", "filters_explainer_controller_default", "Controller", "event", "pricingModal", "eventName", "properties", "gallery_controller_default", "Controller", "event", "index", "img", "mappedIndex", "urls", "NO_PHOTO_URL", "foundAny", "pending", "maybeFinalizeIfNone", "url", "ok", "resolve", "google_ads_controller_default", "Controller", "event", "value", "name", "goal", "payload", "google_one_tap_controller_default", "Controller", "onReady", "event", "notification", "skippedReason", "dismissedReason", "response", "form", "csrfToken", "csrfInput", "credentialInput", "returnUrlInput", "google_places_controller_default", "Controller", "fromValue", "resolvedGoogleMapsApiKey", "v", "apiKey", "maps", "loadGoogleMaps", "PlaceAutocompleteElement", "q", "input", "message", "event", "placePrediction", "place", "location", "lat", "lng", "label", "country", "countryCodeFromPlace", "e", "quantileSorted", "x", "p", "const", "idx", "quickselect", "arr", "k", "left", "right", "n", "m", "z", "s", "sd", "newLeft", "newRight", "t", "i", "j", "swap", "tmp", "quantile", "copy", "multiQuantileSelect", "results", "quantileIndex", "quantileSelect", "indices", "compare", "stack", "r", "l", "a", "b", "len", "BayesianClassifier", "item", "category", "k", "const", "v", "odds", "oddsSums", "combination", "PerceptronModel", "features", "score", "i", "label", "prediction", "gradient", "const", "g", "LOGSQRT2PI", "const", "SQRT_2PI", "const", "SQRT_2PI", "cumulativeDistribution", "z", "sum", "tmp", "i", "standardNormalTable", "L", "import_wicket_leaflet", "import_wicket", "libh3", "Module", "moduleOverrides", "key", "hasOwnProperty", "arguments_", "scriptDirectory", "locateFile", "path", "readAsync", "document", "currentScript", "src", "indexOf", "substr", "lastIndexOf", "url", "onload", "onerror", "xhr", "XMLHttpRequest", "open", "responseType", "status", "response", "data", "tryParseAsDataURI", "buffer", "send", "out", "console", "log", "bind", "err", "warn", "tempRet0", "setTempRet0", "value", "getTempRet0", "GLOBAL_BASE", "setValue", "ptr", "type", "noSafe", "charAt", "length", "HEAP8", "HEAP16", "HEAP32", "tempI64", "tempDouble", "Math_abs", "Math_min", "Math_floor", "Math_ceil", "HEAPF32", "HEAPF64", "abort", "getValue", "ABORT", "assert", "condition", "text", "getCFunc", "ident", "func", "ccall", "returnType", "argTypes", "args", "opts", "toC", "str", "ret", "len", "stackAlloc", "stringToUTF8", "arr", "writeArrayToMemory", "convertReturnValue", "UTF8ToString", "Boolean", "cArgs", "stack", "i", "converter", "stackSave", "apply", "stackRestore", "cwrap", "numericArgs", "every", "numericRet", "arguments", "UTF8Decoder", "TextDecoder", "undefined", "UTF8ArrayToString", "u8Array", "idx", "maxBytesToRead", "endIdx", "endPtr", "subarray", "decode", "u0", "String", "fromCharCode", "u1", "u2", "ch", "HEAPU8", "stringToUTF8Array", "outU8Array", "outIdx", "maxBytesToWrite", "startIdx", "u", "charCodeAt", "outPtr", "UTF16Decoder", "array", "set", "alignUp", "x", "multiple", "HEAPU16", "HEAPU32", "updateGlobalBufferAndViews", "buf", "Int8Array", "Int16Array", "Int32Array", "Uint8Array", "Uint16Array", "Uint32Array", "Float32Array", "Float64Array", "DYNAMIC_BASE", "DYNAMICTOP_PTR", "INITIAL_TOTAL_MEMORY", "ArrayBuffer", "byteLength", "callRuntimeCallbacks", "callbacks", "callback", "shift", "arg", "__ATPRERUN__", "__ATINIT__", "__ATMAIN__", "__ATPOSTRUN__", "preRun", "addOnPreRun", "initRuntime", "preMain", "postRun", "addOnPostRun", "cb", "unshift", "Math", "abs", "ceil", "floor", "min", "runDependencies", "runDependencyWatcher", "dependenciesFulfilled", "addRunDependency", "id", "removeRunDependency", "clearInterval", "memoryInitializer", "dataURIPrefix", "isDataURI", "filename", "prototype", "startsWith", "tempDoublePtr", "demangle", "demangleAll", "regex", "replace", "y", "jsStackTrace", "Error", "e", "toString", "stackTrace", "js", "___assert_fail", "line", "_emscripten_get_heap_size", "_emscripten_memcpy_big", "dest", "num", "___setErrNo", "abortOnCannotGrowMemory", "requestedSize", "emscripten_realloc_buffer", "size", "newBuffer", "_emscripten_replace_memory", "_emscripten_resize_heap", "oldSize", "PAGE_MULTIPLE", "LIMIT", "MIN_TOTAL_MEMORY", "newSize", "max", "replacement", "decodeBase64", "atob", "input", "keyStr", "output", "chr1", "chr2", "chr3", "enc1", "enc2", "enc3", "enc4", "intArrayFromBase64", "s", "decoded", "bytes", "slice", "asmGlobalArg", "asmLibraryArg", "asm", "global", "env", "a", "b", "c", "d", "f", "o", "g", "p", "q", "r", "sqrt", "pow", "t", "cos", "sin", "v", "tan", "w", "acos", "asin", "atan", "z", "atan2", "A", "B", "imul", "C", "D", "E", "clz32", "G", "H", "I", "J", "K", "L", "M", "h", "N", "T", "W", "X", "Y", "Z", "_", "$", "ic", "rd", "ld", "aa", "ba", "j", "k", "ca", "Bd", "da", "kd", "jd", "l", "m", "n", "xb", "ea", "td", "sd", "Sa", "vd", "Fb", "Lb", "wd", "Hb", "ma", "sa", "Jb", "Gb", "na", "fa", "ga", "ha", "Ec", "za", "ia", "F", "Aa", "md", "Mb", "ja", "Fc", "Pb", "Gc", "ka", "_c", "Qb", "dd", "bd", "cd", "$c", "la", "ad", "qc", "rc", "ed", "tc", "sc", "oa", "pa", "qa", "ra", "ta", "ua", "va", "wa", "xa", "ya", "Ub", "ac", "xd", "yd", "Ba", "Ca", "Da", "Ea", "Fa", "Ga", "Ha", "Ia", "Ja", "hd", "Ka", "La", "Ma", "Na", "Oa", "Pa", "Qa", "Ra", "Ta", "Ua", "Va", "Wa", "Xa", "Ya", "Za", "_a", "$a", "vb", "ab", "bb", "db", "ub", "eb", "fb", "gb", "Uc", "Ob", "mb", "qb", "hb", "ib", "jb", "Zb", "cc", "Tc", "Sc", "kb", "Pc", "dc", "lb", "nb", "ob", "Qc", "pb", "rb", "Rc", "sb", "tb", "wb", "Cc", "pd", "yb", "Xb", "Yb", "zb", "Ab", "Bb", "Ad", "Cb", "Db", "Eb", "Ib", "Kb", "Nb", "Rb", "Sb", "Tb", "Vb", "Wb", "_b", "$b", "bc", "ec", "fc", "gc", "hc", "jc", "kc", "lc", "mc", "nc", "oc", "pc", "uc", "vc", "wc", "xc", "yc", "zc", "Ac", "Bc", "zd", "ud", "Dc", "Hc", "Ic", "Jc", "Kc", "Lc", "Mc", "Nc", "Oc", "Vc", "Wc", "Xc", "Yc", "Zc", "fd", "gd", "Cd", "Dd", "nd", "od", "qd", "___divdi3", "___muldi3", "___remdi3", "___uremdi3", "_areNeighborCells", "_bitshift64Ashr", "_bitshift64Lshr", "_bitshift64Shl", "_calloc", "_cellAreaKm2", "_cellAreaM2", "_cellAreaRads2", "_cellToBoundary", "_cellToCenterChild", "_cellToChildPos", "_cellToChildren", "_cellToChildrenSize", "_cellToLatLng", "_cellToLocalIj", "_cellToParent", "_cellToVertex", "_cellToVertexes", "_cellsToDirectedEdge", "_cellsToLinkedMultiPolygon", "_childPosToCell", "_compactCells", "_destroyLinkedMultiPolygon", "_directedEdgeToBoundary", "_directedEdgeToCells", "_edgeLengthKm", "_edgeLengthM", "_edgeLengthRads", "_free", "_getBaseCellNumber", "_getDirectedEdgeDestination", "_getDirectedEdgeOrigin", "_getHexagonAreaAvgKm2", "_getHexagonAreaAvgM2", "_getHexagonEdgeLengthAvgKm", "_getHexagonEdgeLengthAvgM", "_getIcosahedronFaces", "_getNumCells", "_getPentagons", "_getRes0Cells", "_getResolution", "_greatCircleDistanceKm", "_greatCircleDistanceM", "_greatCircleDistanceRads", "_gridDisk", "_gridDiskDistances", "_gridDistance", "_gridPathCells", "_gridPathCellsSize", "_gridRingUnsafe", "_i64Add", "_i64Subtract", "_isPentagon", "_isResClassIII", "_isValidCell", "_isValidDirectedEdge", "_isValidVertex", "_latLngToCell", "_llvm_maxnum_f64", "_llvm_minnum_f64", "_llvm_round_f64", "_localIjToCell", "_malloc", "_maxFaceCount", "_maxGridDiskSize", "_maxPolygonToCellsSize", "_memcpy", "_memset", "_originToDirectedEdges", "_pentagonCount", "_polygonToCells", "_readInt64AsDoubleFromPointer", "_res0CellCount", "_round", "_sbrk", "_sizeOfCellBoundary", "_sizeOfCoordIJ", "_sizeOfGeoLoop", "_sizeOfGeoPolygon", "_sizeOfH3Index", "_sizeOfLatLng", "_sizeOfLinkedGeoPolygon", "_uncompactCells", "_uncompactCellsSize", "_vertexToLatLng", "establishStackSpace", "applyMemoryInitializer", "doBrowserLoad", "memoryInitializerBytes", "useRequest", "request", "setTimeout", "addEventListener", "calledRun", "runCaller", "run", "doRun", "what", "pop", "NUMBER", "H3_ERROR", "BOOLEAN", "H3_LOWER", "H3_UPPER", "RESOLUTION", "POINTER", "BINDINGS", "E_SUCCESS", "E_FAILED", "E_DOMAIN", "E_LATLNG_DOMAIN", "E_RES_DOMAIN", "E_CELL_INVALID", "E_DIR_EDGE_INVALID", "E_UNDIR_EDGE_INVALID", "E_VERTEX_INVALID", "E_PENTAGON", "E_DUPLICATE_INPUT", "E_NOT_NEIGHBORS", "E_RES_MISMATCH", "E_MEMORY_ALLOC", "E_MEMORY_BOUNDS", "E_OPTION_INVALID", "H3_ERROR_MSGS", "const", "E_UNKNOWN_UNIT", "E_ARRAY_LENGTH", "E_NULL_INDEX", "JS_ERROR_MESSAGES", "UNKNOWN_ERROR_MSG", "createError", "messages", "errCode", "meta", "hasValue", "code", "H3LibraryError", "throwIfError", "errCode", "H3LibraryError", "const", "H3", "BINDINGS", "forEach", "def", "C", "cwrap", "BASE_16", "const", "SZ_DBL", "const", "SZ_H3INDEX", "H3", "sizeOfH3Index", "SZ_LATLNG", "sizeOfLatLng", "SZ_CELLBOUNDARY", "sizeOfCellBoundary", "SZ_GEOPOLYGON", "sizeOfGeoPolygon", "SZ_GEOLOOP", "sizeOfGeoLoop", "SZ_LINKED_GEOPOLYGON", "sizeOfLinkedGeoPolygon", "SZ_COORDIJ", "sizeOfCoordIJ", "const", "MAX_JS_ARRAY_LENGTH", "Math", "pow", "const", "INVALID_HEXIDECIMAL_CHAR", "h3IndexToSplitLong", "h3Index", "Array", "isArray", "length", "Number", "isInteger", "test", "upper", "parseInt", "substring", "BASE_16", "lower", "const", "UPPER_BIT_DIVISOR", "Math", "pow", "readSingleCoord", "cAddress", "radsToDegs", "C", "getValue", "readLatLng", "SZ_DBL", "readLatLngGeoJson", "readCellBoundary", "cellBoundary", "geoJsonCoords", "closedLoop", "numVerts", "vertsPos", "out", "readCoord", "i", "push", "cellToBoundary", "h3Index", "formatAsGeoJson", "cellBoundary", "C", "_malloc", "SZ_CELLBOUNDARY", "h3IndexToSplitLong", "lower", "upper", "throwIfError", "H3", "readCellBoundary", "_free", "radsToDegs", "rad", "Math", "PI", "h3_map_controller_default", "Controller", "element", "e", "index", "$row", "geometry", "polygonId", "wkt", "Wkt", "polygon", "event", "bounds", "style", "highlighted", "$tableContainer", "rowTop", "containerTop", "containerHeight", "rowHeight", "scrollTop", "hexagonCenter", "hexBoundary", "bestPolygonId", "maxVerticesInside", "verticesInside", "point", "h3Index", "controller", "queryParams", "response", "html", "error", "isPreview", "map", "tiles", "percentile", "arr", "p", "quantile", "percentiles", "palette", "bins", "i", "end", "d", "obj", "getColor", "value", "translations", "currencySymbol", "locale", "pluralizeAirbnb", "count", "n", "category", "flatKey", "formatValue", "attribute", "createTooltipHTML", "cell", "formattedValue", "neighborhoodName", "cellToBoundary", "sum", "containingPolygon", "submarketName", "allBounds", "lastTooltip", "hexagonCenters", "boundary", "gridSize", "grid", "center", "key", "maxCount", "densestArea", "lat", "lng", "h3_map_preview_controller_default", "Controller", "event", "h3Index", "currentUrl", "params", "newPath", "newUrl", "image_fallback_controller_default", "Controller", "images", "batchSize", "index", "processBatch", "img", "event", "currentSrc", "attempts", "fallbackUrls", "galleryController", "nextUrl", "url", "listingUuid", "error", "pathMatch", "anchor", "href", "hrefMatch", "STORAGE_KEY", "insights_city_tracking_controller_default", "Controller", "previousPolygonId", "isCityChange", "properties", "amplitude", "L", "import_wicket_leaflet", "import_wicket", "insights_map_controller_default", "Controller", "key", "locale", "otherMap", "zoom", "center", "event", "bounds", "controller", "url", "markers", "wkt", "Wkt", "map", "enableScrollZoomOnInteract", "mainPolygon", "circle", "obj", "mainMarker", "listing", "e", "listings", "symbol", "adrN", "hasAdr", "adrLabel", "width", "height", "tone", "expanded", "expandedClass", "values", "fromAdrN", "fromAdr", "n", "a", "b", "at", "q", "min", "max", "span", "host", "el", "row", "tier", "breaks", "show", "title", "rows", "swatches", "t", "b1", "b2", "b3", "f", "v", "visible", "items", "item", "index", "tierIndex", "on", "marker", "value", "k", "compact", "stops", "i", "u", "mix", "c0", "c1", "rgb", "c", "bg", "border", "fg", "r", "g", "channel", "s", "label", "merge", "valid", "existingListings", "bindMorphHover", "morph", "inflate", "size", "w", "h", "pt", "pad", "rect", "ratio", "mapSize", "candidates", "maxPills", "placed", "pinnedCount", "inView", "shouldPin", "atCap", "collides", "other", "z", "force", "latlng", "content", "formatted", "popup", "p", "newAttribute", "attributeKey", "percentile", "arr", "quantile", "percentiles", "palette", "bins", "end", "d", "getColor", "lastTooltip", "cell", "latlngs", "cellToBoundary", "lat", "lng", "color", "hexagon", "translations", "currencySymbol", "displayKey", "attributeLabel", "formattedValue", "tooltipValue", "tooltipHTML", "boundsParam", "coords", "pinCoords", "corePins", "searchCoords", "padding", "topLeft", "bottomRight", "pinWidth", "targetWidth", "ranked", "coord", "p75Index", "softMax", "entry", "lats", "lngs", "mid", "search", "maxPinDistanceM", "thresholdM", "FocusControl", "button", "searchInView", "anyPinInView", "mode", "investment_calculator_landing_controller_default", "Controller", "event", "lat", "lng", "label", "country", "params", "select", "value", "investment_calculator_preview_tracking_controller_default", "Controller", "properties", "event", "dismissMethod", "name", "investment_calculator_recent_searches_controller_default", "Controller", "apiKey", "resolvedGoogleMapsApiKey", "lang", "loadGoogleMaps", "event", "landing_page_tracking_controller_default", "Controller", "properties", "event", "link_interceptor_controller_default", "Controller", "event", "link", "startUrl", "listings_chart_controller_default", "Controller", "ctx", "lineLabel", "fallback", "value", "lines", "index", "data", "item", "baseOptions", "values", "chart", "legend", "options", "fitValue", "map_expand_controller_default", "Controller", "e", "event", "leafletContainer", "map_modal_controller_default", "Controller", "element", "event", "parent", "mapIndex", "overviewFrame", "callback", "checkReady", "instance", "attempts", "checkInterval", "onFrameLoad", "maxAttempts", "waitForMap", "rect", "computedStyle", "modalMapContainer", "existingPlaceholder", "mapElement", "orphanedPlaceholder", "placeholder", "targetParent", "stage", "map_switcher_controller_default", "Controller", "savedType", "type", "savePreference", "event", "newAttribute", "lockedAttributes", "a", "metric_chart_switcher_controller_default", "Controller", "event", "metric", "card", "chartData", "dates", "date", "value", "tooltipItems", "dataIndex", "dateString", "ctx", "todayValue", "localeValue", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "currentDate", "now", "context", "chart", "minimal_chart_controller_default", "Controller", "ctx", "chartData", "dates", "date", "labels", "dataset", "value", "tooltipItems", "dataIndex", "dateString", "formattedDate", "context", "formattedValue", "index", "event", "activeElements", "mobile_comp_set_filters_controller_default", "Controller", "event", "form", "formData", "compSet", "bedrooms", "capacity", "params", "mobile_filters_controller_default", "Controller", "urlParams", "amenitiesContainer", "button", "key", "value", "event", "amenity", "item", "form", "paddle_controller_default", "Controller", "name", "data", "billingType", "newCountryCode", "newCurrencyCode", "countryChanged", "currencyChanged", "urlParams", "event", "planId", "discountId", "currencyCode", "price", "currentCurrency", "priceAmount", "formattedPrice", "subtotal", "taxAmount", "taxFormatted", "totalAmount", "taxInclusive", "discount", "discountAmount", "priceOptions", "lineItem", "totals", "formattedTotals", "subtotalAmount", "unitPriceDisplay", "priceText", "error", "amountDueText", "totalText", "amount", "paddleOptions", "checkout", "explicitDiscountId", "value", "days", "expires", "nameEQ", "ca", "i", "c", "paywall_controller_default", "Controller", "import_wicket", "import_wicket_leaflet", "polygon_editor_controller_default", "Controller", "container", "e", "firstPoint", "latlng", "lastVertex", "closedVertices", "wkt", "Wkt", "bounds", "error", "target", "ll", "m", "handleMouseMove", "currentMousePos", "offset", "newLatlngs", "marker", "index", "startPos", "handleMouseUp", "currentLatlngs", "latlngs", "newLatlng", "i", "nextIndex", "midLat", "midLng", "middleIndex", "coordinates", "first", "last", "wktString", "c", "polygon_navigation_controller_default", "Controller", "event", "polygonUuid", "polygonSlug", "polygonName", "childUrl", "import_wicket", "import_wicket_leaflet", "import_geostats", "polygons_map_controller_default", "Controller", "response", "data", "polygons", "error", "container", "parentWkt", "Wkt", "polygonsData", "availableListingsValues", "p", "val", "colorRanges", "allBounds", "hasValidBounds", "polygonData", "wkt", "availableListings", "fillColor", "strokeColor", "polygon", "formattedListings", "tooltipContent", "bounds", "palette", "breaks", "geostats", "i", "min", "max", "label", "value", "range", "legend", "div", "item", "listings", "createLabel", "roundedMin", "roundedMax", "hasPolygonsInRange", "isHighestTier", "portfolio_controller_default", "Controller", "input", "event", "value", "matches", "userId", "error", "template", "userIds", "id", "form", "url", "csrfToken", "submitButton", "response", "data", "message", "type", "notification", "button", "listingId", "detailsRow", "row", "listingRow", "isExpanding", "rect", "scrollTop", "offset", "targetScrollPosition", "frame", "btn", "plans", "pricing_controller_default", "Controller", "displayAnnually", "annuallyTarget", "monthlyTarget", "event", "plan", "pricing_modal_controller_default", "Controller", "modal", "event", "title", "subtitle", "primary_intent_controller_default", "Controller", "storedIntent", "e", "intent", "event", "button", "csrfToken", "response", "data", "error", "exploreMarketsIntent", "exploreMarketsIntentOther", "intentLabels", "hasText", "text", "exploreIntent", "otherText", "payload", "el", "rating_count_distribution_chart_controller_default", "Controller", "ctx", "percentages", "val", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "context", "chart", "value", "rating_distribution_chart_controller_default", "Controller", "ctx", "colors", "datasets", "val", "ratingData", "index", "data", "context", "stars", "value", "recent_searches_controller_default", "Controller", "parsed", "value", "insights", "autocomplete_controller_default", "calculator", "recentSearches", "mergeRecentSearches", "search", "index", "itemHtml", "isLast", "rowClass", "locationName", "subtitle", "icon", "currentHost", "targetHost", "type", "text", "div", "event", "revenue_histogram_controller_default", "Controller", "ctx", "buckets", "data", "bucket", "bucketSize", "listingRevenue", "highlightColors", "listingBucketIndex", "currencySymbol", "tooltipItems", "item", "datapoint", "context", "bucketIndex", "a", "revenue_tier_controller_default", "Controller", "series", "key", "data", "b", "dateString", "date", "options", "globalMax", "seriesData", "value", "event", "tier", "theme", "button", "buttonTier", "chartData", "tooltipItems", "dataIndex", "ctx", "dates", "todayValue", "localeValue", "currencyCodeValue", "width", "height", "gradient", "accent", "getGradient", "chartArea", "chartWidth", "chartHeight", "context", "chart", "currentDate", "now", "scroll_reveal_controller_default", "Controller", "entries", "entry", "el", "signup_form_controller_default", "Controller", "currentLength", "isPasswordValid", "template", "event", "slide_panel_controller_default", "Controller", "event", "smooth_scroll_controller_default", "Controller", "event", "targetId", "targetElement", "sortable_table_controller_default", "Controller", "event", "column", "direction", "datasetKey", "tbody", "left", "right", "leftValue", "rightValue", "missingComparison", "row", "leftMissing", "rightMissing", "value", "suffix", "_", "char", "header", "isActive", "icon", "story_nav_controller_default", "Controller", "story_tabs_controller_default", "Controller", "activeTab", "tab", "tabElement", "panelId", "id", "panel", "activePanel", "tabLink", "isMobileTab", "icon", "event", "link", "href", "linkUrl", "e", "marketOverviewFrame", "triggerResize", "scrollContainer", "containerRect", "tabRect", "containerScrollLeft", "containerWidth", "tabLeft", "tabWidth", "scrollTarget", "activeMobileTab", "isMobile", "isActive", "mobileNavFrame", "sectionId", "targetTab", "pathParts", "urlSectionToPanelId", "urlSection", "submarkets_controller_default", "Controller", "event", "button", "subscription_modal_controller_default", "Controller", "event", "userId", "userEmail", "import_leaflet", "import_wicket", "top_listings_controller_default", "Controller", "Wkt", "L", "c", "index", "label", "marker", "bounds", "selected", "originalHtml", "event", "pan", "scroll", "listing", "import_wicket", "import_wicket_leaflet", "wkt_map_controller_default", "Controller", "response", "data", "extractedWkt", "error", "container", "wkt", "Wkt", "polygon", "first", "application", "admin_autocomplete_boost_controller_default", "adr_tier_controller_default", "amenities_chart_controller_default", "amenities_dropdown_controller_default", "amplitude_controller_default", "application_controller_default", "auth0_controller_default", "auth_controller_default", "autocomplete_controller_default", "bedroom_count_chart_controller_default", "calendar_controller_default", "chart_controller_default", "comp_set_list_row_controller_default", "contact_form_controller_default", "daily_occupancy_chart_controller_default", "desktop_filters_controller_default", "detection_simulator_controller_default", "dropdown_controller_default", "email_exists_modal_controller_default", "filters_container_controller_default", "filters_explainer_controller_default", "gallery_controller_default", "google_ads_controller_default", "google_one_tap_controller_default", "google_places_controller_default", "h3_map_controller_default", "h3_map_preview_controller_default", "image_fallback_controller_default", "insights_city_tracking_controller_default", "insights_map_controller_default", "investment_calculator_landing_controller_default", "investment_calculator_preview_tracking_controller_default", "investment_calculator_recent_searches_controller_default", "landing_page_tracking_controller_default", "link_interceptor_controller_default", "listings_chart_controller_default", "map_expand_controller_default", "map_modal_controller_default", "map_switcher_controller_default", "metric_chart_switcher_controller_default", "minimal_chart_controller_default", "mobile_comp_set_filters_controller_default", "mobile_filters_controller_default", "paddle_controller_default", "paywall_controller_default", "polygon_editor_controller_default", "polygon_navigation_controller_default", "polygons_map_controller_default", "portfolio_controller_default", "pricing_controller_default", "pricing_modal_controller_default", "primary_intent_controller_default", "rating_count_distribution_chart_controller_default", "rating_distribution_chart_controller_default", "recent_searches_controller_default", "revenue_histogram_controller_default", "revenue_tier_controller_default", "scroll_reveal_controller_default", "signup_form_controller_default", "slide_panel_controller_default", "smooth_scroll_controller_default", "sortable_table_controller_default", "story_nav_controller_default", "story_tabs_controller_default", "submarkets_controller_default", "subscription_modal_controller_default", "top_listings_controller_default", "wkt_map_controller_default", "turbo_es2017_esm_exports", "__export", "FetchEnctype", "FetchMethod", "FetchRequest", "FetchResponse", "FrameElement", "FrameLoadingStyle", "FrameRenderer", "PageRenderer", "PageSnapshot", "StreamActions", "StreamElement", "StreamSourceElement", "cache", "config", "connectStreamSource", "disconnectStreamSource", "fetchWithTurboHeaders", "fetchEnctypeFromString", "fetchMethodFromString", "isSafe", "morphBodyElements", "morphChildren", "morphElements", "morphTurboFrameElements", "sessionNavigator", "registerAdapter", "renderStreamMessage", "session", "setConfirmMethod", "setFormMode", "setProgressBarDelay", "start", "visit", "_FrameElement", "name", "value", "frameLoadingStyleFromString", "style", "drive", "activateScriptElement", "element", "createdScriptElement", "cspNonce", "getCspNonce", "copyElementAttributes", "destinationElement", "sourceElement", "createDocumentFragment", "html", "template", "dispatch", "eventName", "target", "cancelable", "detail", "event", "cancelEvent", "nextRepaint", "nextEventLoopTick", "nextAnimationFrame", "resolve", "parseHTMLDocument", "unindent", "strings", "values", "lines", "interpolate", "match", "indent", "line", "result", "string", "i", "uuid", "_", "getAttribute", "attributeName", "elements", "hasAttribute", "markAsBusy", "clearBusyState", "waitForLoad", "timeoutInMilliseconds", "onComplete", "getHistoryMethodForAction", "action", "isAction", "getVisitAction", "getMetaElement", "getMetaContent", "nonce", "content", "setMetaContent", "findClosestRecursively", "selector", "elementIsFocusable", "queryAutofocusableElement", "elementOrDocumentFragment", "around", "callback", "reader", "before", "after", "doesNotTargetIFrame", "findLinkFromClickTarget", "link", "linkTarget", "debounce", "fn", "delay", "timeoutId", "args", "submitter", "Config", "#submitter", "forms", "expandURL", "locatable", "getAnchor", "url", "anchorMatch", "getAction$1", "form", "getExtension", "getLastPathComponent", "isPrefixedBy", "baseURL", "prefix", "addTrailingSlash", "locationIsVisitable", "location", "rootLocation", "getLocationForLink", "getRequestURL", "anchor", "toCacheKey", "urlsAreEqual", "left", "right", "getPathComponents", "response", "LimitedSet", "maxSize", "oldestValue", "recentRequests", "options", "modifiedHeaders", "requestUID", "method", "encoding", "#resolveRequestPromise", "_value", "delegate", "requestBody", "enctype", "body", "buildResourceAndBody", "fetchBody", "fetchMethod", "fetchOptions", "#allowRequestToBeIntercepted", "error", "#willDelegateErrorHandling", "fetchResponse", "mimeType", "requestInterception", "resource", "searchParams", "entriesExcludingFiles", "mergeIntoURLSearchParams", "entries", "AppearanceObserver", "StreamMessage", "message", "fragment", "importStreamElements", "streamElement", "inertScriptElement", "identity", "key", "LRUCache", "#toCacheKey", "size", "entry", "index", "PREFETCH_DELAY", "PrefetchCache", "#prefetchTimeout", "#maxAges", "prefetchDelay", "request", "ttl", "cacheTtl", "maxAge", "prefetchCache", "FormSubmissionState", "FormSubmission", "_FormSubmission", "formElement", "mustRedirect", "getMethod", "getAction", "getFormAction", "buildFormData", "getEnctype", "initialized", "requesting", "confirmationMessage", "stopping", "stopped", "token", "getCookieValue", "_request", "responseSucceededWithoutRedirect", "input", "formData", "cookieName", "cookie", "formElementAction", "formAction", "Snapshot", "queryPermanentElementsAll", "id", "getPermanentElementById", "snapshot", "permanentElementMap", "currentPermanentElement", "newPermanentElement", "node", "FormSubmitObserver", "eventTarget", "submissionDoesNotDismissDialog", "submissionDoesNotTargetIFrame", "View", "#resolveRenderPromise", "#resolveInterceptionPromise", "x", "y", "renderer", "isPreview", "shouldRender", "willRender", "shouldInvalidate", "renderInterception", "reason", "direction", "FrameView", "LinkInterceptor", "_event", "LinkClickObserver", "FormLinkClickObserver", "originalEvent", "type", "turboFrame", "turboAction", "turboConfirm", "Bardo", "bardo", "permanentElement", "placeholder", "createPlaceholderForPermanentElement", "clone", "Renderer", "#activeElement", "currentElement", "newElement", "currentSnapshot", "newSnapshot", "reject", "destinationRange", "frameElement", "sourceRange", "renderElement", "block", "readScrollLogicalPosition", "behavior", "readScrollBehavior", "activatedScriptElement", "defaultValue", "Idiomorph", "noOp", "defaults", "elt", "morph", "oldNode", "newContent", "normalizeElement", "newNode", "normalizeParent", "ctx", "createMorphContext", "morphedNodes", "saveAndRestoreFocus", "withHeadBlocking", "morphOuterHTML", "oldParent", "activeElement", "activeElementId", "selectionStart", "selectionEnd", "results", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "removeNodesBetween", "morphNode", "newChildId", "movedChild", "moveBeforeById", "insertedNode", "createNode", "tempNode", "removeNode", "newEmptyChild", "newClonedChild", "startPoint", "softMatch", "nextSibling", "siblingSoftMatchCount", "cursor", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "oldElt", "newElt", "moveBefore", "startInclusive", "endExclusive", "parentNode", "removeElementFromAncestorsIdMaps", "idSet", "handleHeadElement", "morphAttributes", "ignoreValueOfActiveElement", "oldAttributes", "newAttributes", "newAttribute", "ignoreAttribute", "oldAttribute", "syncInputValue", "oldElement", "newValue", "oldValue", "syncBooleanAttribute", "newLiveValue", "oldLiveValue", "ignoreUpdate", "attr", "updateType", "possibleActiveElement", "oldHead", "newHead", "promises", "newCtx", "added", "removed", "preserved", "nodesToAppend", "srcToNewHeadNodes", "newHeadChild", "currentHeadElt", "inNewContent", "isReAppended", "isPreserved", "promise", "_resolve", "removedElement", "persistentIds", "idMap", "createIdMaps", "mergedConfig", "mergeDefaults", "morphStyle", "createPantry", "createActiveElementAndParents", "finalConfig", "pantry", "activeElementAndParents", "findIdElements", "root", "populateIdMapWithTree", "current", "oldContent", "oldIdElements", "newIdElements", "createPersistentIds", "newRoot", "duplicateIds", "oldIdTagNameMap", "tagName", "generatedByIdiomorph", "parseContent", "SlicedParentNode", "dummyParent", "nodes", "nodeList", "referenceNode", "parser", "contentWithSvgsRemoved", "htmlElement", "callbacks", "DefaultIdiomorphCallbacks", "shouldRefreshFrameWithMorphing", "currentFrame", "newFrame", "areFramesCompatibleForRefreshing", "closestFrameReloadableWithMorphing", "#beforeNodeMorphed", "beforeNodeMorphed", "mutationType", "MorphingFrameRenderer", "ProgressBar", "_ProgressBar", "HeadSnapshot", "elementIsNoscript", "elementWithoutNonce", "outerHTML", "details", "elementType", "elementIsTracked", "matchedType", "tracked", "elementIsMetaElementWithName", "elementIsScript", "elementIsStylesheet", "_PageSnapshot", "documentElement", "head", "headSnapshot", "clonedElement", "selectElements", "clonedSelectElements", "source", "option", "clonedPasswordInput", "clonedNoscriptElement", "ViewTransitioner", "#viewTransitionStarted", "#lastOperation", "useViewTransition", "render", "defaultOptions", "TimingMetric", "VisitState", "SystemStatusCode", "Direction", "Visit", "restorationIdentifier", "historyChanged", "referrer", "snapshotHTML", "visitCachedSnapshot", "updateHistory", "shouldCacheSnapshot", "acceptsStreamResponse", "refresh", "actionForHistory", "statusCode", "isSuccessful", "responseHTML", "_response", "redirected", "_error", "scrollPosition", "metric", "BrowserAdapter", "_visit", "_formSubmission", "CacheObserver", "FrameRedirector", "_location", "#shouldRedirect", "frame", "#findFrameElement", "#shouldSubmit", "meta", "History", "state", "additionalData", "restorationData", "turbo", "restorationIndex", "LinkPrefetchObserver", "#prefetchedLink", "#enable", "#tryToPrefetchRequest", "#cancelRequestIfObsolete", "#tryToUsePrefetchedRequest", "#isPrefetchable", "fetchRequest", "#cacheTtl", "#cancelPrefetchRequest", "cached", "turboFrameTarget", "unfetchableLink", "linkToTheSamePage", "linkOptsOut", "nonSafeLink", "eventPrevented", "turboPrefetchParent", "turboMethod", "isUJS", "Navigator", "formSubmission", "visitOptions", "#getActionForFormSubmission", "#getDefaultAction", "PageStage", "PageObserver", "readyState", "ScrollObserver", "position", "StreamMessageRenderer", "getPermanentElementMapForFragment", "withAutofocusFromFragment", "withPreservedFocus", "permanentElementsInDocument", "permanentElementInDocument", "elementInStream", "generatedID", "turboStreams", "elementWithAutofocus", "firstAutofocusableElementInStreams", "willAutofocusId", "elementToAutofocus", "activeElementBeforeRender", "activeElementAfterRender", "restoreFocusTo", "elementToFocus", "nodeListOfStreamElements", "StreamObserver", "#started", "fetchResponseFromEvent", "fetchResponseIsStream", "ErrorRenderer", "replaceableElement", "#setLanguage", "dir", "lang", "mergedHeadElements", "newStylesheetElements", "loadingElements", "newHeadElements", "elementList", "noscriptElement", "MorphingPageRenderer", "SnapshotCache", "PageView", "rendererClass", "cachedSnapshot", "Preloader", "snapshotCache", "#preloadAll", "Cache", "#setCacheControl", "Session", "#pageRefreshDebouncePeriod", "adapter", "requestId", "scroll", "isRecentRequest", "isCurrentUrl", "isUnsafe", "isStream", "frameTarget", "extendURLWithDeprecatedProperties", "defaultPrevented", "_snapshot", "_isPreview", "renderMethod", "ev", "newBody", "timing", "submitterIsNavigatable", "container", "withinFrame", "deprecatedLocationPropertyDescriptors", "confirmMethod", "mode", "currentBody", "Turbo", "TurboFrameMissingError", "FrameController", "_fetchResponse", "#currentFetchRequest", "#resolveVisitPromise", "#connected", "#hasBeenLoaded", "#ignoredAttributes", "#shouldMorphFrame", "#loadSourceURL", "#isIgnoringChangesTo", "src", "#visit", "document", "#loadFrameResponse", "#handleUnvisitableFrameResponse", "#shouldInterceptNavigation", "#navigateFrame", "_renderMethod", "_newElement", "newFrameElement", "#willHandleFrameMissingFromResponse", "#handleFrameMissingFromResponse", "#withCurrentNavigationElement", "pageSnapshot", "#visitResponse", "#throwFrameMissingError", "wrapped", "#getFrameElementById", "activateElement", "#formActionIsVisitable", "sourceURL", "#ignoringChangesToAttribute", "currentURL", "e", "targetElement", "_StreamElement", "c", "existingChildren", "newChildrenIds", "actionFunction", "#raise", "scriptElement", "consumer", "getConsumer", "setConsumer", "createConsumer", "newConsumer", "subscribeTo", "channel", "mixin", "subscriptions", "walk", "obj", "acc", "key", "camel", "m", "x", "TurboCableStreamSourceElement", "connectStreamSource", "subscribeTo", "disconnectStreamSource", "data", "event", "channel", "signed_stream_name", "walk", "encodeMethodIntoRequestBody", "event", "form", "fetchOptions", "submitter", "body", "isBodyInit", "method", "determineFetchMethod", "formMethod", "determineFormMethod", "overrideMethod", "turbo_es2017_esm_exports", "encodeMethodIntoRequestBody", "turbo_es2017_esm_exports", "url", "initializePreline", "popstateHandler", "isInsightsPageWithSection", "pathParts", "validSections", "lastPart", "event"]
}
