{ "version": 3, "sources": ["../../../node_modules/@hotwired/turbo-rails/node_modules/@rails/actioncable/src/adapters.js", "../../../node_modules/@hotwired/turbo-rails/node_modules/@rails/actioncable/src/logger.js", "../../../node_modules/@hotwired/turbo-rails/node_modules/@rails/actioncable/src/connection_monitor.js", "../../../node_modules/@hotwired/turbo-rails/node_modules/@rails/actioncable/src/internal.js", "../../../node_modules/@hotwired/turbo-rails/node_modules/@rails/actioncable/src/connection.js", "../../../node_modules/@hotwired/turbo-rails/node_modules/@rails/actioncable/src/subscription.js", "../../../node_modules/@hotwired/turbo-rails/node_modules/@rails/actioncable/src/subscription_guarantor.js", "../../../node_modules/@hotwired/turbo-rails/node_modules/@rails/actioncable/src/subscriptions.js", "../../../node_modules/@hotwired/turbo-rails/node_modules/@rails/actioncable/src/consumer.js", "../../../node_modules/@hotwired/turbo-rails/node_modules/@rails/actioncable/src/index.js", "../../../node_modules/glightbox/dist/js/glightbox.min.js", "../../../node_modules/slim-select/dist/slimselect.js", "../../../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/intl-tel-input/build/js/intlTelInput.js", "../../../node_modules/intl-tel-input/build/js/utils.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", "../../../node_modules/@rails/activestorage/app/assets/javascripts/activestorage.esm.js", "../../../node_modules/@rails/actiontext/app/assets/javascripts/actiontext.esm.js", "../../../node_modules/@hotwired/stimulus/dist/stimulus.js", "../../../node_modules/tailwindcss-stimulus-components/node_modules/@hotwired/stimulus/dist/stimulus.js", "../../../node_modules/tailwindcss-stimulus-components/src/alert.js", "../../../node_modules/tailwindcss-stimulus-components/src/autosave.js", "../../../node_modules/tailwindcss-stimulus-components/src/dropdown.js", "../../../node_modules/tailwindcss-stimulus-components/src/modal.js", "../../../node_modules/tailwindcss-stimulus-components/src/tabs.js", "../../../node_modules/tailwindcss-stimulus-components/src/toggle.js", "../../../node_modules/tailwindcss-stimulus-components/src/popover.js", "../../../node_modules/tailwindcss-stimulus-components/src/slideover.js", "../../../node_modules/tailwindcss-stimulus-components/src/color_preview.js", "../../javascript/controllers/application.js", "../../../node_modules/stimulus-autocomplete/src/autocomplete.js", "../../../node_modules/stimulus-reveal-controller/dist/stimulus-reveal-controller.es.js", "../../javascript/controllers/reveal_controller.js", "../../javascript/controllers/mobile_menu_controller.js", "../../../node_modules/tabulator-tables/src/js/core/CoreFeature.js", "../../../node_modules/tabulator-tables/src/js/core/tools/Helpers.js", "../../../node_modules/tabulator-tables/src/js/core/tools/Popup.js", "../../../node_modules/tabulator-tables/src/js/core/Module.js", "../../../node_modules/tabulator-tables/src/js/modules/Accessor/defaults/accessors.js", "../../../node_modules/tabulator-tables/src/js/modules/Accessor/Accessor.js", "../../../node_modules/tabulator-tables/src/js/modules/Ajax/defaults/config.js", "../../../node_modules/tabulator-tables/src/js/modules/Ajax/defaults/urlGenerator.js", "../../../node_modules/tabulator-tables/src/js/modules/Ajax/defaults/loaderPromise.js", "../../../node_modules/tabulator-tables/src/js/modules/Ajax/defaults/contentTypeFormatters.js", "../../../node_modules/tabulator-tables/src/js/modules/Ajax/Ajax.js", "../../../node_modules/tabulator-tables/src/js/modules/Clipboard/defaults/pasteActions.js", "../../../node_modules/tabulator-tables/src/js/modules/Clipboard/defaults/pasteParsers.js", "../../../node_modules/tabulator-tables/src/js/modules/Clipboard/extensions/keybindings/bindings.js", "../../../node_modules/tabulator-tables/src/js/modules/Clipboard/extensions/keybindings/actions.js", "../../../node_modules/tabulator-tables/src/js/modules/Clipboard/extensions/extensions.js", "../../../node_modules/tabulator-tables/src/js/modules/Clipboard/Clipboard.js", "../../../node_modules/tabulator-tables/src/js/modules/ColumnCalcs/CalcComponent.js", "../../../node_modules/tabulator-tables/src/js/core/cell/CellComponent.js", "../../../node_modules/tabulator-tables/src/js/core/cell/Cell.js", "../../../node_modules/tabulator-tables/src/js/core/column/ColumnComponent.js", "../../../node_modules/tabulator-tables/src/js/core/column/defaults/options.js", "../../../node_modules/tabulator-tables/src/js/core/column/Column.js", "../../../node_modules/tabulator-tables/src/js/core/row/RowComponent.js", "../../../node_modules/tabulator-tables/src/js/core/row/Row.js", "../../../node_modules/tabulator-tables/src/js/modules/ColumnCalcs/defaults/calculations.js", "../../../node_modules/tabulator-tables/src/js/modules/ColumnCalcs/ColumnCalcs.js", "../../../node_modules/tabulator-tables/src/js/modules/DataTree/DataTree.js", "../../../node_modules/tabulator-tables/src/js/modules/Download/defaults/downloaders/csv.js", "../../../node_modules/tabulator-tables/src/js/modules/Download/defaults/downloaders/json.js", "../../../node_modules/tabulator-tables/src/js/modules/Download/defaults/downloaders/pdf.js", "../../../node_modules/tabulator-tables/src/js/modules/Download/defaults/downloaders/xlsx.js", "../../../node_modules/tabulator-tables/src/js/modules/Download/defaults/downloaders/html.js", "../../../node_modules/tabulator-tables/src/js/modules/Download/defaults/downloaders/jsonLines.js", "../../../node_modules/tabulator-tables/src/js/modules/Download/defaults/downloaders.js", "../../../node_modules/tabulator-tables/src/js/modules/Download/Download.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/inputMask.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/input.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/textarea.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/number.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/range.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/date.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/time.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/datetime.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/List.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/list.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/star.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/progress.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/tickCross.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors/adaptable.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/defaults/editors.js", "../../../node_modules/tabulator-tables/src/js/modules/Edit/Edit.js", "../../../node_modules/tabulator-tables/src/js/modules/Export/ExportRow.js", "../../../node_modules/tabulator-tables/src/js/modules/Export/ExportColumn.js", "../../../node_modules/tabulator-tables/src/js/modules/Export/defaults/columnLookups.js", "../../../node_modules/tabulator-tables/src/js/modules/Export/defaults/rowLookups.js", "../../../node_modules/tabulator-tables/src/js/modules/Export/Export.js", "../../../node_modules/tabulator-tables/src/js/modules/Filter/defaults/filters.js", "../../../node_modules/tabulator-tables/src/js/modules/Filter/Filter.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/plaintext.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/html.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/textarea.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/money.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/link.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/image.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/tickCross.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/datetime.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/datetimediff.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/lookup.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/star.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/traffic.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/progress.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/color.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/buttonTick.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/buttonCross.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/toggle.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/rownum.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/handle.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/adaptable.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/array.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters/json.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/defaults/formatters.js", "../../../node_modules/tabulator-tables/src/js/modules/Format/Format.js", "../../../node_modules/tabulator-tables/src/js/modules/FrozenColumns/FrozenColumns.js", "../../../node_modules/tabulator-tables/src/js/modules/FrozenRows/FrozenRows.js", "../../../node_modules/tabulator-tables/src/js/modules/GroupRows/GroupComponent.js", "../../../node_modules/tabulator-tables/src/js/modules/GroupRows/Group.js", "../../../node_modules/tabulator-tables/src/js/modules/GroupRows/GroupRows.js", "../../../node_modules/tabulator-tables/src/js/modules/History/defaults/undoers.js", "../../../node_modules/tabulator-tables/src/js/modules/History/defaults/redoers.js", "../../../node_modules/tabulator-tables/src/js/modules/History/extensions/keybindings/bindings.js", "../../../node_modules/tabulator-tables/src/js/modules/History/extensions/keybindings/actions.js", "../../../node_modules/tabulator-tables/src/js/modules/History/extensions/extensions.js", "../../../node_modules/tabulator-tables/src/js/modules/History/History.js", "../../../node_modules/tabulator-tables/src/js/modules/HtmlTableImport/HtmlTableImport.js", "../../../node_modules/tabulator-tables/src/js/modules/Import/defaults/importers/csv.js", "../../../node_modules/tabulator-tables/src/js/modules/Import/defaults/importers/json.js", "../../../node_modules/tabulator-tables/src/js/modules/Import/defaults/importers/array.js", "../../../node_modules/tabulator-tables/src/js/modules/Import/defaults/importers/xlsx.js", "../../../node_modules/tabulator-tables/src/js/modules/Import/defaults/importers.js", "../../../node_modules/tabulator-tables/src/js/modules/Import/Import.js", "../../../node_modules/tabulator-tables/src/js/modules/Interaction/Interaction.js", "../../../node_modules/tabulator-tables/src/js/modules/Keybindings/defaults/bindings.js", "../../../node_modules/tabulator-tables/src/js/modules/Keybindings/defaults/actions.js", "../../../node_modules/tabulator-tables/src/js/modules/Keybindings/Keybindings.js", "../../../node_modules/tabulator-tables/src/js/modules/Menu/Menu.js", "../../../node_modules/tabulator-tables/src/js/modules/MoveColumns/MoveColumns.js", "../../../node_modules/tabulator-tables/src/js/modules/MoveRows/defaults/senders.js", "../../../node_modules/tabulator-tables/src/js/modules/MoveRows/defaults/receivers.js", "../../../node_modules/tabulator-tables/src/js/modules/MoveRows/MoveRows.js", "../../../node_modules/tabulator-tables/src/js/modules/Mutator/defaults/mutators.js", "../../../node_modules/tabulator-tables/src/js/modules/Mutator/Mutator.js", "../../../node_modules/tabulator-tables/src/js/modules/Page/defaults/pageCounters/rows.js", "../../../node_modules/tabulator-tables/src/js/modules/Page/defaults/pageCounters/pages.js", "../../../node_modules/tabulator-tables/src/js/modules/Page/defaults/pageCounters.js", "../../../node_modules/tabulator-tables/src/js/modules/Page/Page.js", "../../../node_modules/tabulator-tables/src/js/modules/Persistence/defaults/readers.js", "../../../node_modules/tabulator-tables/src/js/modules/Persistence/defaults/writers.js", "../../../node_modules/tabulator-tables/src/js/modules/Persistence/Persistence.js", "../../../node_modules/tabulator-tables/src/js/modules/Popup/Popup.js", "../../../node_modules/tabulator-tables/src/js/modules/Print/Print.js", "../../../node_modules/tabulator-tables/src/js/modules/ReactiveData/ReactiveData.js", "../../../node_modules/tabulator-tables/src/js/modules/ResizeColumns/ResizeColumns.js", "../../../node_modules/tabulator-tables/src/js/modules/ResizeRows/ResizeRows.js", "../../../node_modules/tabulator-tables/src/js/modules/ResizeTable/ResizeTable.js", "../../../node_modules/tabulator-tables/src/js/modules/ResponsiveLayout/extensions/formatters/responsiveCollapse.js", "../../../node_modules/tabulator-tables/src/js/modules/ResponsiveLayout/extensions/extensions.js", "../../../node_modules/tabulator-tables/src/js/modules/ResponsiveLayout/ResponsiveLayout.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRow/extensions/formatters/rowSelection.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRow/extensions/extensions.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRow/SelectRow.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRange/RangeComponent.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRange/Range.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRange/extensions/keybindings/bindings.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRange/extensions/keybindings/actions.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRange/extensions/clipboard/pasteActions.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRange/extensions/clipboard/pasteParsers.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRange/extensions/export/columnLookups.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRange/extensions/export/rowLookups.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRange/extensions/extensions.js", "../../../node_modules/tabulator-tables/src/js/modules/SelectRange/SelectRange.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/defaults/sorters/number.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/defaults/sorters/string.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/defaults/sorters/datetime.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/defaults/sorters/date.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/defaults/sorters/time.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/defaults/sorters/boolean.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/defaults/sorters/array.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/defaults/sorters/exists.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/defaults/sorters/alphanum.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/defaults/sorters.js", "../../../node_modules/tabulator-tables/src/js/modules/Sort/Sort.js", "../../../node_modules/tabulator-tables/src/js/modules/Spreadsheet/GridCalculator.js", "../../../node_modules/tabulator-tables/src/js/modules/Spreadsheet/SheetComponent.js", "../../../node_modules/tabulator-tables/src/js/modules/Spreadsheet/Sheet.js", "../../../node_modules/tabulator-tables/src/js/modules/Spreadsheet/Spreadsheet.js", "../../../node_modules/tabulator-tables/src/js/modules/Tooltip/Tooltip.js", "../../../node_modules/tabulator-tables/src/js/modules/Validate/defaults/validators.js", "../../../node_modules/tabulator-tables/src/js/modules/Validate/Validate.js", "../../../node_modules/tabulator-tables/src/js/core/defaults/options.js", "../../../node_modules/tabulator-tables/src/js/core/tools/OptionsList.js", "../../../node_modules/tabulator-tables/src/js/core/rendering/Renderer.js", "../../../node_modules/tabulator-tables/src/js/core/rendering/renderers/BasicHorizontal.js", "../../../node_modules/tabulator-tables/src/js/core/rendering/renderers/VirtualDomHorizontal.js", "../../../node_modules/tabulator-tables/src/js/core/ColumnManager.js", "../../../node_modules/tabulator-tables/src/js/core/rendering/renderers/BasicVertical.js", "../../../node_modules/tabulator-tables/src/js/core/rendering/renderers/VirtualDomVertical.js", "../../../node_modules/tabulator-tables/src/js/core/RowManager.js", "../../../node_modules/tabulator-tables/src/js/core/FooterManager.js", "../../../node_modules/tabulator-tables/src/js/core/tools/InteractionMonitor.js", "../../../node_modules/tabulator-tables/src/js/core/tools/ComponentFunctionBinder.js", "../../../node_modules/tabulator-tables/src/js/core/tools/DataLoader.js", "../../../node_modules/tabulator-tables/src/js/core/tools/ExternalEventBus.js", "../../../node_modules/tabulator-tables/src/js/core/tools/InternalEventBus.js", "../../../node_modules/tabulator-tables/src/js/core/tools/DeprecationAdvisor.js", "../../../node_modules/tabulator-tables/src/js/core/tools/DependencyRegistry.js", "../../../node_modules/tabulator-tables/src/js/modules/Layout/defaults/modes/fitData.js", "../../../node_modules/tabulator-tables/src/js/modules/Layout/defaults/modes/fitDataGeneral.js", "../../../node_modules/tabulator-tables/src/js/modules/Layout/defaults/modes/fitDataStretch.js", "../../../node_modules/tabulator-tables/src/js/modules/Layout/defaults/modes/fitColumns.js", "../../../node_modules/tabulator-tables/src/js/modules/Layout/defaults/modes.js", "../../../node_modules/tabulator-tables/src/js/modules/Layout/Layout.js", "../../../node_modules/tabulator-tables/src/js/modules/Localize/defaults/langs.js", "../../../node_modules/tabulator-tables/src/js/modules/Localize/Localize.js", "../../../node_modules/tabulator-tables/src/js/modules/Comms/Comms.js", "../../../node_modules/tabulator-tables/src/js/core/tools/TableRegistry.js", "../../../node_modules/tabulator-tables/src/js/core/tools/ModuleBinder.js", "../../../node_modules/tabulator-tables/src/js/core/tools/Alert.js", "../../../node_modules/tabulator-tables/src/js/core/Tabulator.js", "../../../node_modules/tabulator-tables/src/js/core/TabulatorFull.js", "../../../node_modules/tabulator-tables/src/js/core/row/PseudoRow.js", "../../../node_modules/@rails/actioncable/app/assets/javascripts/actioncable.esm.js", "../../javascript/controllers/grid_controller.js", "../../javascript/controllers/slim_controller.js", "../../javascript/controllers/zendesk_chat_controller.js", "../../javascript/controllers/dropdown_controller.js", "../../javascript/controllers/map_controller.js", "../../javascript/controllers/industry_controller.js", "../../javascript/controllers/sub_industry_controller.js", "../../javascript/controllers/location_filter_controller.js", "../../javascript/controllers/faq_controller.js", "../../../node_modules/swiper/shared/ssr-window.esm.mjs", "../../../node_modules/swiper/shared/utils.mjs", "../../../node_modules/swiper/shared/swiper-core.mjs", "../../../node_modules/swiper/modules/virtual.mjs", "../../../node_modules/swiper/modules/keyboard.mjs", "../../../node_modules/swiper/modules/mousewheel.mjs", "../../../node_modules/swiper/shared/create-element-if-not-defined.mjs", "../../../node_modules/swiper/modules/navigation.mjs", "../../../node_modules/swiper/shared/classes-to-selector.mjs", "../../../node_modules/swiper/modules/pagination.mjs", "../../../node_modules/swiper/modules/scrollbar.mjs", "../../../node_modules/swiper/modules/parallax.mjs", "../../../node_modules/swiper/modules/zoom.mjs", "../../../node_modules/swiper/modules/controller.mjs", "../../../node_modules/swiper/modules/a11y.mjs", "../../../node_modules/swiper/modules/history.mjs", "../../../node_modules/swiper/modules/hash-navigation.mjs", "../../../node_modules/swiper/modules/autoplay.mjs", "../../../node_modules/swiper/modules/thumbs.mjs", "../../../node_modules/swiper/modules/free-mode.mjs", "../../../node_modules/swiper/modules/grid.mjs", "../../../node_modules/swiper/modules/manipulation.mjs", "../../../node_modules/swiper/shared/effect-init.mjs", "../../../node_modules/swiper/shared/effect-target.mjs", "../../../node_modules/swiper/shared/effect-virtual-transition-end.mjs", "../../../node_modules/swiper/modules/effect-fade.mjs", "../../../node_modules/swiper/modules/effect-cube.mjs", "../../../node_modules/swiper/shared/create-shadow.mjs", "../../../node_modules/swiper/modules/effect-flip.mjs", "../../../node_modules/swiper/modules/effect-coverflow.mjs", "../../../node_modules/swiper/modules/effect-creative.mjs", "../../../node_modules/swiper/modules/effect-cards.mjs", "../../../node_modules/swiper/swiper-bundle.mjs", "../../../node_modules/@stimulus-components/carousel/dist/stimulus-carousel.mjs", "../../javascript/controllers/carousel_controller.js", "../../javascript/controllers/lightbox_controller.js", "../../javascript/controllers/language_selector_controller.js", "../../../node_modules/@stimulus-components/dialog/dist/stimulus-dialog.mjs", "../../javascript/controllers/dialog_controller.js", "../../../node_modules/intl-tel-input/build/js/i18n/ar/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/ar/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/ar/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/bg/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/bg/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/bg/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/bn/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/bn/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/bn/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/bs/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/bs/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/bs/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/ca/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/ca/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/ca/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/cs/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/cs/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/cs/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/da/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/da/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/da/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/de/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/de/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/de/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/ee/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/ee/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/ee/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/el/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/el/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/el/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/en/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/en/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/en/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/es/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/es/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/es/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/fa/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/fa/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/fa/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/fi/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/fi/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/fi/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/fr/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/fr/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/fr/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/hi/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/hi/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/hi/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/hr/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/hr/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/hr/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/hu/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/hu/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/hu/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/id/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/id/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/id/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/it/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/it/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/it/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/ja/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/ja/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/ja/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/ko/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/ko/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/ko/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/mr/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/mr/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/mr/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/nl/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/nl/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/nl/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/no/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/no/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/no/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/pl/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/pl/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/pl/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/pt/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/pt/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/pt/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/ro/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/ro/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/ro/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/ru/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/ru/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/ru/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/sk/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/sk/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/sk/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/sv/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/sv/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/sv/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/te/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/te/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/te/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/th/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/th/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/th/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/tr/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/tr/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/tr/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/uk/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/uk/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/uk/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/ur/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/ur/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/ur/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/vi/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/vi/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/vi/index.js", "../../../node_modules/intl-tel-input/build/js/i18n/zh/countries.js", "../../../node_modules/intl-tel-input/build/js/i18n/zh/interface.js", "../../../node_modules/intl-tel-input/build/js/i18n/zh/index.js", "../../javascript/controllers/phone_input_controller.js", "../../javascript/controllers/tabs_controller.js", "../../javascript/controllers/index.js", "../../javascript/application.js"], "sourcesContent": ["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 Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport logger from \"./logger\"\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\n a.protocol = a.protocol.replace(\"http\", \"ws\")\n return a.href\n } else {\n return url\n }\n}\n", "import Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport Subscription from \"./subscription\"\nimport Subscriptions from \"./subscriptions\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport adapters from \"./adapters\"\nimport logger from \"./logger\"\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", "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=e||self).GLightbox=t()}(this,(function(){\"use strict\";function e(t){return(e=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=e[s]=e[s]||[],l={all:n,evt:null,found:null};return t&&i&&P(n)>0&&o(n,(function(e,n){if(e.eventName==t&&e.fn.toString()==i.toString())return l.found=!0,l.evt=n,!1})),l}function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.onElement,n=t.withCallback,s=t.avoidDuplicate,l=void 0===s||s,a=t.once,h=void 0!==a&&a,d=t.useCapture,c=void 0!==d&&d,u=arguments.length>2?arguments[2]:void 0,g=i||[];function v(e){T(n)&&n.call(u,e,this),h&&v.destroy()}return C(g)&&(g=document.querySelectorAll(g)),v.destroy=function(){o(g,(function(t){var i=r(t,e,v);i.found&&i.all.splice(i.evt,1),t.removeEventListener&&t.removeEventListener(e,v,c)}))},o(g,(function(t){var i=r(t,e,v);(t.addEventListener&&l&&!i.found||!l)&&(t.addEventListener(e,v,c),i.all.push({eventName:e,fn:v}))})),v}function h(e,t){o(t.split(\" \"),(function(t){return e.classList.add(t)}))}function d(e,t){o(t.split(\" \"),(function(t){return e.classList.remove(t)}))}function c(e,t){return e.classList.contains(t)}function u(e,t){for(;e!==document.body;){if(!(e=e.parentElement))return!1;if(\"function\"==typeof e.matches?e.matches(t):e.msMatchesSelector(t))return e}}function g(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e||\"\"===t)return!1;if(\"none\"===t)return T(i)&&i(),!1;var n=x(),s=t.split(\" \");o(s,(function(t){h(e,\"g\"+t)})),a(n,{onElement:e,avoidDuplicate:!1,once:!0,withCallback:function(e,t){o(s,(function(e){d(t,\"g\"+e)})),T(i)&&i()}})}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(\"\"===t)return e.style.webkitTransform=\"\",e.style.MozTransform=\"\",e.style.msTransform=\"\",e.style.OTransform=\"\",e.style.transform=\"\",!1;e.style.webkitTransform=t,e.style.MozTransform=t,e.style.msTransform=t,e.style.OTransform=t,e.style.transform=t}function f(e){e.style.display=\"block\"}function p(e){e.style.display=\"none\"}function m(e){var t=document.createDocumentFragment(),i=document.createElement(\"div\");for(i.innerHTML=e;i.firstChild;)t.appendChild(i.firstChild);return t}function y(){return{width:window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,height:window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}}function x(){var e,t=document.createElement(\"fakeelement\"),i={animation:\"animationend\",OAnimation:\"oAnimationEnd\",MozAnimation:\"animationend\",WebkitAnimation:\"webkitAnimationEnd\"};for(e in i)if(void 0!==t.style[e])return i[e]}function b(e,t,i,n){if(e())t();else{var s;i||(i=100);var l=setInterval((function(){e()&&(clearInterval(l),s&&clearTimeout(s),t())}),i);n&&(s=setTimeout((function(){clearInterval(l)}),n))}}function S(e,t,i){if(I(e))console.error(\"Inject assets error\");else if(T(t)&&(i=t,t=!1),C(t)&&t in window)T(i)&&i();else{var n;if(-1!==e.indexOf(\".css\")){if((n=document.querySelectorAll('link[href=\"'+e+'\"]'))&&n.length>0)return void(T(i)&&i());var s=document.getElementsByTagName(\"head\")[0],l=s.querySelectorAll('link[rel=\"stylesheet\"]'),o=document.createElement(\"link\");return o.rel=\"stylesheet\",o.type=\"text/css\",o.href=e,o.media=\"all\",l?s.insertBefore(o,l[0]):s.appendChild(o),void(T(i)&&i())}if((n=document.querySelectorAll('script[src=\"'+e+'\"]'))&&n.length>0){if(T(i)){if(C(t))return b((function(){return void 0!==window[t]}),(function(){i()})),!1;i()}}else{var r=document.createElement(\"script\");r.type=\"text/javascript\",r.src=e,r.onload=function(){if(T(i)){if(C(t))return b((function(){return void 0!==window[t]}),(function(){i()})),!1;i()}},document.body.appendChild(r)}}}function w(){return\"navigator\"in window&&window.navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(Android)|(PlayBook)|(BB10)|(BlackBerry)|(Opera Mini)|(IEMobile)|(webOS)|(MeeGo)/i)}function T(e){return\"function\"==typeof e}function C(e){return\"string\"==typeof e}function k(e){return!(!e||!e.nodeType||1!=e.nodeType)}function E(e){return Array.isArray(e)}function A(e){return e&&e.length&&isFinite(e.length)}function L(t){return\"object\"===e(t)&&null!=t&&!T(t)&&!E(t)}function I(e){return null==e}function O(e,t){return null!==e&&hasOwnProperty.call(e,t)}function P(e){if(L(e)){if(e.keys)return e.keys().length;var t=0;for(var i in e)O(e,i)&&t++;return t}return e.length}function M(e){return!isNaN(parseFloat(e))&&isFinite(e)}function z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1,t=document.querySelectorAll(\".gbtn[data-taborder]:not(.disabled)\");if(!t.length)return!1;if(1==t.length)return t[0];\"string\"==typeof e&&(e=parseInt(e));var i=[];o(t,(function(e){i.push(e.getAttribute(\"data-taborder\"))}));var n=Math.max.apply(Math,i.map((function(e){return parseInt(e)}))),s=e<0?1:e+1;s>n&&(s=\"1\");var l=i.filter((function(e){return e>=parseInt(s)})),r=l.sort()[0];return document.querySelector('.gbtn[data-taborder=\"'.concat(r,'\"]'))}function X(e){if(e.events.hasOwnProperty(\"keyboard\"))return!1;e.events.keyboard=a(\"keydown\",{onElement:window,withCallback:function(t,i){var n=(t=t||window.event).keyCode;if(9==n){var s=document.querySelector(\".gbtn.focused\");if(!s){var l=!(!document.activeElement||!document.activeElement.nodeName)&&document.activeElement.nodeName.toLocaleLowerCase();if(\"input\"==l||\"textarea\"==l||\"button\"==l)return}t.preventDefault();var o=document.querySelectorAll(\".gbtn[data-taborder]\");if(!o||o.length<=0)return;if(!s){var r=z();return void(r&&(r.focus(),h(r,\"focused\")))}var a=z(s.getAttribute(\"data-taborder\"));d(s,\"focused\"),a&&(a.focus(),h(a,\"focused\"))}39==n&&e.nextSlide(),37==n&&e.prevSlide(),27==n&&e.close()}})}function Y(e){return Math.sqrt(e.x*e.x+e.y*e.y)}function q(e,t){var i=function(e,t){var i=Y(e)*Y(t);if(0===i)return 0;var n=function(e,t){return e.x*t.x+e.y*t.y}(e,t)/i;return n>1&&(n=1),Math.acos(n)}(e,t);return function(e,t){return e.x*t.y-t.x*e.y}(e,t)>0&&(i*=-1),180*i/Math.PI}var N=function(){function e(i){t(this,e),this.handlers=[],this.el=i}return n(e,[{key:\"add\",value:function(e){this.handlers.push(e)}},{key:\"del\",value:function(e){e||(this.handlers=[]);for(var t=this.handlers.length;t>=0;t--)this.handlers[t]===e&&this.handlers.splice(t,1)}},{key:\"dispatch\",value:function(){for(var e=0,t=this.handlers.length;e=0)console.log(\"ignore drag for this touched element\",e.target.nodeName.toLowerCase());else{this.now=Date.now(),this.x1=e.touches[0].pageX,this.y1=e.touches[0].pageY,this.delta=this.now-(this.last||this.now),this.touchStart.dispatch(e,this.element),null!==this.preTapPosition.x&&(this.isDoubleTap=this.delta>0&&this.delta<=250&&Math.abs(this.preTapPosition.x-this.x1)<30&&Math.abs(this.preTapPosition.y-this.y1)<30,this.isDoubleTap&&clearTimeout(this.singleTapTimeout)),this.preTapPosition.x=this.x1,this.preTapPosition.y=this.y1,this.last=this.now;var t=this.preV;if(e.touches.length>1){this._cancelLongTap(),this._cancelSingleTap();var i={x:e.touches[1].pageX-this.x1,y:e.touches[1].pageY-this.y1};t.x=i.x,t.y=i.y,this.pinchStartLen=Y(t),this.multipointStart.dispatch(e,this.element)}this._preventTap=!1,this.longTapTimeout=setTimeout(function(){this.longTap.dispatch(e,this.element),this._preventTap=!0}.bind(this),750)}}}},{key:\"move\",value:function(e){if(e.touches){var t=this.preV,i=e.touches.length,n=e.touches[0].pageX,s=e.touches[0].pageY;if(this.isDoubleTap=!1,i>1){var l=e.touches[1].pageX,o=e.touches[1].pageY,r={x:e.touches[1].pageX-n,y:e.touches[1].pageY-s};null!==t.x&&(this.pinchStartLen>0&&(e.zoom=Y(r)/this.pinchStartLen,this.pinch.dispatch(e,this.element)),e.angle=q(r,t),this.rotate.dispatch(e,this.element)),t.x=r.x,t.y=r.y,null!==this.x2&&null!==this.sx2?(e.deltaX=(n-this.x2+l-this.sx2)/2,e.deltaY=(s-this.y2+o-this.sy2)/2):(e.deltaX=0,e.deltaY=0),this.twoFingerPressMove.dispatch(e,this.element),this.sx2=l,this.sy2=o}else{if(null!==this.x2){e.deltaX=n-this.x2,e.deltaY=s-this.y2;var a=Math.abs(this.x1-this.x2),h=Math.abs(this.y1-this.y2);(a>10||h>10)&&(this._preventTap=!0)}else e.deltaX=0,e.deltaY=0;this.pressMove.dispatch(e,this.element)}this.touchMove.dispatch(e,this.element),this._cancelLongTap(),this.x2=n,this.y2=s,i>1&&e.preventDefault()}}},{key:\"end\",value:function(e){if(e.changedTouches){this._cancelLongTap();var t=this;e.touches.length<2&&(this.multipointEnd.dispatch(e,this.element),this.sx2=this.sy2=null),this.x2&&Math.abs(this.x1-this.x2)>30||this.y2&&Math.abs(this.y1-this.y2)>30?(e.direction=this._swipeDirection(this.x1,this.x2,this.y1,this.y2),this.swipeTimeout=setTimeout((function(){t.swipe.dispatch(e,t.element)}),0)):(this.tapTimeout=setTimeout((function(){t._preventTap||t.tap.dispatch(e,t.element),t.isDoubleTap&&(t.doubleTap.dispatch(e,t.element),t.isDoubleTap=!1)}),0),t.isDoubleTap||(t.singleTapTimeout=setTimeout((function(){t.singleTap.dispatch(e,t.element)}),250))),this.touchEnd.dispatch(e,this.element),this.preV.x=0,this.preV.y=0,this.zoom=1,this.pinchStartLen=null,this.x1=this.x2=this.y1=this.y2=null}}},{key:\"cancelAll\",value:function(){this._preventTap=!0,clearTimeout(this.singleTapTimeout),clearTimeout(this.tapTimeout),clearTimeout(this.longTapTimeout),clearTimeout(this.swipeTimeout)}},{key:\"cancel\",value:function(e){this.cancelAll(),this.touchCancel.dispatch(e,this.element)}},{key:\"_cancelLongTap\",value:function(){clearTimeout(this.longTapTimeout)}},{key:\"_cancelSingleTap\",value:function(){clearTimeout(this.singleTapTimeout)}},{key:\"_swipeDirection\",value:function(e,t,i,n){return Math.abs(e-t)>=Math.abs(i-n)?e-t>0?\"Left\":\"Right\":i-n>0?\"Up\":\"Down\"}},{key:\"on\",value:function(e,t){this[e]&&this[e].add(t)}},{key:\"off\",value:function(e,t){this[e]&&this[e].del(t)}},{key:\"destroy\",value:function(){return this.singleTapTimeout&&clearTimeout(this.singleTapTimeout),this.tapTimeout&&clearTimeout(this.tapTimeout),this.longTapTimeout&&clearTimeout(this.longTapTimeout),this.swipeTimeout&&clearTimeout(this.swipeTimeout),this.element.removeEventListener(\"touchstart\",this.start),this.element.removeEventListener(\"touchmove\",this.move),this.element.removeEventListener(\"touchend\",this.end),this.element.removeEventListener(\"touchcancel\",this.cancel),this.rotate.del(),this.touchStart.del(),this.multipointStart.del(),this.multipointEnd.del(),this.pinch.del(),this.swipe.del(),this.tap.del(),this.doubleTap.del(),this.longTap.del(),this.singleTap.del(),this.pressMove.del(),this.twoFingerPressMove.del(),this.touchMove.del(),this.touchEnd.del(),this.touchCancel.del(),this.preV=this.pinchStartLen=this.zoom=this.isDoubleTap=this.delta=this.last=this.now=this.tapTimeout=this.singleTapTimeout=this.longTapTimeout=this.swipeTimeout=this.x1=this.x2=this.y1=this.y2=this.preTapPosition=this.rotate=this.touchStart=this.multipointStart=this.multipointEnd=this.pinch=this.swipe=this.tap=this.doubleTap=this.longTap=this.singleTap=this.pressMove=this.touchMove=this.touchEnd=this.touchCancel=this.twoFingerPressMove=null,window.removeEventListener(\"scroll\",this._cancelAllHandler),null}}]),e}();function W(e){var t=function(){var e,t=document.createElement(\"fakeelement\"),i={transition:\"transitionend\",OTransition:\"oTransitionEnd\",MozTransition:\"transitionend\",WebkitTransition:\"webkitTransitionEnd\"};for(e in i)if(void 0!==t.style[e])return i[e]}(),i=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,n=c(e,\"gslide-media\")?e:e.querySelector(\".gslide-media\"),s=u(n,\".ginner-container\"),l=e.querySelector(\".gslide-description\");i>769&&(n=s),h(n,\"greset\"),v(n,\"translate3d(0, 0, 0)\"),a(t,{onElement:n,once:!0,withCallback:function(e,t){d(n,\"greset\")}}),n.style.opacity=\"\",l&&(l.style.opacity=\"\")}function B(e){if(e.events.hasOwnProperty(\"touch\"))return!1;var t,i,n,s=y(),l=s.width,o=s.height,r=!1,a=null,g=null,f=null,p=!1,m=1,x=1,b=!1,S=!1,w=null,T=null,C=null,k=null,E=0,A=0,L=!1,I=!1,O={},P={},M=0,z=0,X=document.getElementById(\"glightbox-slider\"),Y=document.querySelector(\".goverlay\"),q=new _(X,{touchStart:function(t){if(r=!0,(c(t.targetTouches[0].target,\"ginner-container\")||u(t.targetTouches[0].target,\".gslide-desc\")||\"a\"==t.targetTouches[0].target.nodeName.toLowerCase())&&(r=!1),u(t.targetTouches[0].target,\".gslide-inline\")&&!c(t.targetTouches[0].target.parentNode,\"gslide-inline\")&&(r=!1),r){if(P=t.targetTouches[0],O.pageX=t.targetTouches[0].pageX,O.pageY=t.targetTouches[0].pageY,M=t.targetTouches[0].clientX,z=t.targetTouches[0].clientY,a=e.activeSlide,g=a.querySelector(\".gslide-media\"),n=a.querySelector(\".gslide-inline\"),f=null,c(g,\"gslide-image\")&&(f=g.querySelector(\"img\")),(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)>769&&(g=a.querySelector(\".ginner-container\")),d(Y,\"greset\"),t.pageX>20&&t.pageXo){var a=O.pageX-P.pageX;if(Math.abs(a)<=13)return!1}p=!0;var h,d=s.targetTouches[0].clientX,c=s.targetTouches[0].clientY,u=M-d,m=z-c;if(Math.abs(u)>Math.abs(m)?(L=!1,I=!0):(I=!1,L=!0),t=P.pageX-O.pageX,E=100*t/l,i=P.pageY-O.pageY,A=100*i/o,L&&f&&(h=1-Math.abs(i)/o,Y.style.opacity=h,e.settings.touchFollowAxis&&(E=0)),I&&(h=1-Math.abs(t)/l,g.style.opacity=h,e.settings.touchFollowAxis&&(A=0)),!f)return v(g,\"translate3d(\".concat(E,\"%, 0, 0)\"));v(g,\"translate3d(\".concat(E,\"%, \").concat(A,\"%, 0)\"))}},touchEnd:function(){if(r){if(p=!1,S||b)return C=w,void(k=T);var t=Math.abs(parseInt(A)),i=Math.abs(parseInt(E));if(!(t>29&&f))return t<29&&i<25?(h(Y,\"greset\"),Y.style.opacity=1,W(g)):void 0;e.close()}},multipointEnd:function(){setTimeout((function(){b=!1}),50)},multipointStart:function(){b=!0,m=x||1},pinch:function(e){if(!f||p)return!1;b=!0,f.scaleX=f.scaleY=m*e.zoom;var t=m*e.zoom;if(S=!0,t<=1)return S=!1,t=1,k=null,C=null,w=null,T=null,void f.setAttribute(\"style\",\"\");t>4.5&&(t=4.5),f.style.transform=\"scale3d(\".concat(t,\", \").concat(t,\", 1)\"),x=t},pressMove:function(e){if(S&&!b){var t=P.pageX-O.pageX,i=P.pageY-O.pageY;C&&(t+=C),k&&(i+=k),w=t,T=i;var n=\"translate3d(\".concat(t,\"px, \").concat(i,\"px, 0)\");x&&(n+=\" scale3d(\".concat(x,\", \").concat(x,\", 1)\")),v(f,n)}},swipe:function(t){if(!S)if(b)b=!1;else{if(\"Left\"==t.direction){if(e.index==e.elements.length-1)return W(g);e.nextSlide()}if(\"Right\"==t.direction){if(0==e.index)return W(g);e.prevSlide()}}}});e.events.touch=q}var H=function(){function e(i,n){var s=this,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(t(this,e),this.img=i,this.slide=n,this.onclose=l,this.img.setZoomEvents)return!1;this.active=!1,this.zoomedIn=!1,this.dragging=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.img.addEventListener(\"mousedown\",(function(e){return s.dragStart(e)}),!1),this.img.addEventListener(\"mouseup\",(function(e){return s.dragEnd(e)}),!1),this.img.addEventListener(\"mousemove\",(function(e){return s.drag(e)}),!1),this.img.addEventListener(\"click\",(function(e){return s.slide.classList.contains(\"dragging-nav\")?(s.zoomOut(),!1):s.zoomedIn?void(s.zoomedIn&&!s.dragging&&s.zoomOut()):s.zoomIn()}),!1),this.img.setZoomEvents=!0}return n(e,[{key:\"zoomIn\",value:function(){var e=this.widowWidth();if(!(this.zoomedIn||e<=768)){var t=this.img;if(t.setAttribute(\"data-style\",t.getAttribute(\"style\")),t.style.maxWidth=t.naturalWidth+\"px\",t.style.maxHeight=t.naturalHeight+\"px\",t.naturalWidth>e){var i=e/2-t.naturalWidth/2;this.setTranslate(this.img.parentNode,i,0)}this.slide.classList.add(\"zoomed\"),this.zoomedIn=!0}}},{key:\"zoomOut\",value:function(){this.img.parentNode.setAttribute(\"style\",\"\"),this.img.setAttribute(\"style\",this.img.getAttribute(\"data-style\")),this.slide.classList.remove(\"zoomed\"),this.zoomedIn=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.onclose&&\"function\"==typeof this.onclose&&this.onclose()}},{key:\"dragStart\",value:function(e){e.preventDefault(),this.zoomedIn?(\"touchstart\"===e.type?(this.initialX=e.touches[0].clientX-this.xOffset,this.initialY=e.touches[0].clientY-this.yOffset):(this.initialX=e.clientX-this.xOffset,this.initialY=e.clientY-this.yOffset),e.target===this.img&&(this.active=!0,this.img.classList.add(\"dragging\"))):this.active=!1}},{key:\"dragEnd\",value:function(e){var t=this;e.preventDefault(),this.initialX=this.currentX,this.initialY=this.currentY,this.active=!1,setTimeout((function(){t.dragging=!1,t.img.isDragging=!1,t.img.classList.remove(\"dragging\")}),100)}},{key:\"drag\",value:function(e){this.active&&(e.preventDefault(),\"touchmove\"===e.type?(this.currentX=e.touches[0].clientX-this.initialX,this.currentY=e.touches[0].clientY-this.initialY):(this.currentX=e.clientX-this.initialX,this.currentY=e.clientY-this.initialY),this.xOffset=this.currentX,this.yOffset=this.currentY,this.img.isDragging=!0,this.dragging=!0,this.setTranslate(this.img,this.currentX,this.currentY))}},{key:\"onMove\",value:function(e){if(this.zoomedIn){var t=e.clientX-this.img.naturalWidth/2,i=e.clientY-this.img.naturalHeight/2;this.setTranslate(this.img,t,i)}}},{key:\"setTranslate\",value:function(e,t,i){e.style.transform=\"translate3d(\"+t+\"px, \"+i+\"px, 0)\"}},{key:\"widowWidth\",value:function(){return window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth}}]),e}(),V=function(){function e(){var i=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e);var s=n.dragEl,l=n.toleranceX,o=void 0===l?40:l,r=n.toleranceY,a=void 0===r?65:r,h=n.slide,d=void 0===h?null:h,c=n.instance,u=void 0===c?null:c;this.el=s,this.active=!1,this.dragging=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.direction=null,this.lastDirection=null,this.toleranceX=o,this.toleranceY=a,this.toleranceReached=!1,this.dragContainer=this.el,this.slide=d,this.instance=u,this.el.addEventListener(\"mousedown\",(function(e){return i.dragStart(e)}),!1),this.el.addEventListener(\"mouseup\",(function(e){return i.dragEnd(e)}),!1),this.el.addEventListener(\"mousemove\",(function(e){return i.drag(e)}),!1)}return n(e,[{key:\"dragStart\",value:function(e){if(this.slide.classList.contains(\"zoomed\"))this.active=!1;else{\"touchstart\"===e.type?(this.initialX=e.touches[0].clientX-this.xOffset,this.initialY=e.touches[0].clientY-this.yOffset):(this.initialX=e.clientX-this.xOffset,this.initialY=e.clientY-this.yOffset);var t=e.target.nodeName.toLowerCase();e.target.classList.contains(\"nodrag\")||u(e.target,\".nodrag\")||-1!==[\"input\",\"select\",\"textarea\",\"button\",\"a\"].indexOf(t)?this.active=!1:(e.preventDefault(),(e.target===this.el||\"img\"!==t&&u(e.target,\".gslide-inline\"))&&(this.active=!0,this.el.classList.add(\"dragging\"),this.dragContainer=u(e.target,\".ginner-container\")))}}},{key:\"dragEnd\",value:function(e){var t=this;e&&e.preventDefault(),this.initialX=0,this.initialY=0,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.active=!1,this.doSlideChange&&(this.instance.preventOutsideClick=!0,\"right\"==this.doSlideChange&&this.instance.prevSlide(),\"left\"==this.doSlideChange&&this.instance.nextSlide()),this.doSlideClose&&this.instance.close(),this.toleranceReached||this.setTranslate(this.dragContainer,0,0,!0),setTimeout((function(){t.instance.preventOutsideClick=!1,t.toleranceReached=!1,t.lastDirection=null,t.dragging=!1,t.el.isDragging=!1,t.el.classList.remove(\"dragging\"),t.slide.classList.remove(\"dragging-nav\"),t.dragContainer.style.transform=\"\",t.dragContainer.style.transition=\"\"}),100)}},{key:\"drag\",value:function(e){if(this.active){e.preventDefault(),this.slide.classList.add(\"dragging-nav\"),\"touchmove\"===e.type?(this.currentX=e.touches[0].clientX-this.initialX,this.currentY=e.touches[0].clientY-this.initialY):(this.currentX=e.clientX-this.initialX,this.currentY=e.clientY-this.initialY),this.xOffset=this.currentX,this.yOffset=this.currentY,this.el.isDragging=!0,this.dragging=!0,this.doSlideChange=!1,this.doSlideClose=!1;var t=Math.abs(this.currentX),i=Math.abs(this.currentY);if(t>0&&t>=Math.abs(this.currentY)&&(!this.lastDirection||\"x\"==this.lastDirection)){this.yOffset=0,this.lastDirection=\"x\",this.setTranslate(this.dragContainer,this.currentX,0);var n=this.shouldChange();if(!this.instance.settings.dragAutoSnap&&n&&(this.doSlideChange=n),this.instance.settings.dragAutoSnap&&n)return this.instance.preventOutsideClick=!0,this.toleranceReached=!0,this.active=!1,this.instance.preventOutsideClick=!0,this.dragEnd(null),\"right\"==n&&this.instance.prevSlide(),void(\"left\"==n&&this.instance.nextSlide())}if(this.toleranceY>0&&i>0&&i>=t&&(!this.lastDirection||\"y\"==this.lastDirection)){this.xOffset=0,this.lastDirection=\"y\",this.setTranslate(this.dragContainer,0,this.currentY);var s=this.shouldClose();return!this.instance.settings.dragAutoSnap&&s&&(this.doSlideClose=!0),void(this.instance.settings.dragAutoSnap&&s&&this.instance.close())}}}},{key:\"shouldChange\",value:function(){var e=!1;if(Math.abs(this.currentX)>=this.toleranceX){var t=this.currentX>0?\"right\":\"left\";(\"left\"==t&&this.slide!==this.slide.parentNode.lastChild||\"right\"==t&&this.slide!==this.slide.parentNode.firstChild)&&(e=t)}return e}},{key:\"shouldClose\",value:function(){var e=!1;return Math.abs(this.currentY)>=this.toleranceY&&(e=!0),e}},{key:\"setTranslate\",value:function(e,t,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];e.style.transition=n?\"all .2s ease\":\"\",e.style.transform=\"translate3d(\".concat(t,\"px, \").concat(i,\"px, 0)\")}}]),e}();function j(e,t,i,n){var s=e.querySelector(\".gslide-media\"),l=new Image,o=\"gSlideTitle_\"+i,r=\"gSlideDesc_\"+i;l.addEventListener(\"load\",(function(){T(n)&&n()}),!1),l.src=t.href,\"\"!=t.sizes&&\"\"!=t.srcset&&(l.sizes=t.sizes,l.srcset=t.srcset),l.alt=\"\",I(t.alt)||\"\"===t.alt||(l.alt=t.alt),\"\"!==t.title&&l.setAttribute(\"aria-labelledby\",o),\"\"!==t.description&&l.setAttribute(\"aria-describedby\",r),t.hasOwnProperty(\"_hasCustomWidth\")&&t._hasCustomWidth&&(l.style.width=t.width),t.hasOwnProperty(\"_hasCustomHeight\")&&t._hasCustomHeight&&(l.style.height=t.height),s.insertBefore(l,s.firstChild)}function F(e,t,i,n){var s=this,l=e.querySelector(\".ginner-container\"),o=\"gvideo\"+i,r=e.querySelector(\".gslide-media\"),a=this.getAllPlayers();h(l,\"gvideo-container\"),r.insertBefore(m('
'),r.firstChild);var d=e.querySelector(\".gvideo-wrapper\");S(this.settings.plyr.css,\"Plyr\");var c=t.href,u=null==t?void 0:t.videoProvider,g=!1;r.style.maxWidth=t.width,S(this.settings.plyr.js,\"Plyr\",(function(){if(!u&&c.match(/vimeo\\.com\\/([0-9]*)/)&&(u=\"vimeo\"),!u&&(c.match(/(youtube\\.com|youtube-nocookie\\.com)\\/watch\\?v=([a-zA-Z0-9\\-_]+)/)||c.match(/youtu\\.be\\/([a-zA-Z0-9\\-_]+)/)||c.match(/(youtube\\.com|youtube-nocookie\\.com)\\/embed\\/([a-zA-Z0-9\\-_]+)/))&&(u=\"youtube\"),\"local\"===u||!u){u=\"local\";var l='\")}var r=g||m('
'));h(d,\"\".concat(u,\"-video gvideo\")),d.appendChild(r),d.setAttribute(\"data-id\",o),d.setAttribute(\"data-index\",i);var v=O(s.settings.plyr,\"config\")?s.settings.plyr.config:{},f=new Plyr(\"#\"+o,v);f.on(\"ready\",(function(e){a[o]=e.detail.plyr,T(n)&&n()})),b((function(){return e.querySelector(\"iframe\")&&\"true\"==e.querySelector(\"iframe\").dataset.ready}),(function(){s.resize(e)})),f.on(\"enterfullscreen\",R),f.on(\"exitfullscreen\",R)}))}function R(e){var t=u(e.target,\".gslide-media\");\"enterfullscreen\"===e.type&&h(t,\"fullscreen\"),\"exitfullscreen\"===e.type&&d(t,\"fullscreen\")}function G(e,t,i,n){var s,l=this,o=e.querySelector(\".gslide-media\"),r=!(!O(t,\"href\")||!t.href)&&t.href.split(\"#\").pop().trim(),d=!(!O(t,\"content\")||!t.content)&&t.content;if(d&&(C(d)&&(s=m('
'.concat(d,\"
\"))),k(d))){\"none\"==d.style.display&&(d.style.display=\"block\");var c=document.createElement(\"div\");c.className=\"ginlined-content\",c.appendChild(d),s=c}if(r){var u=document.getElementById(r);if(!u)return!1;var g=u.cloneNode(!0);g.style.height=t.height,g.style.maxWidth=t.width,h(g,\"ginlined-content\"),s=g}if(!s)return console.error(\"Unable to append inline slide content\",t),!1;o.style.height=t.height,o.style.width=t.width,o.appendChild(s),this.events[\"inlineclose\"+r]=a(\"click\",{onElement:o.querySelectorAll(\".gtrigger-close\"),withCallback:function(e){e.preventDefault(),l.close()}}),T(n)&&n()}function Z(e,t,i,n){var s=e.querySelector(\".gslide-media\"),l=function(e){var t=e.url,i=e.allow,n=e.callback,s=e.appendTo,l=document.createElement(\"iframe\");return l.className=\"vimeo-video gvideo\",l.src=t,l.style.width=\"100%\",l.style.height=\"100%\",i&&l.setAttribute(\"allow\",i),l.onload=function(){l.onload=null,h(l,\"node-ready\"),T(n)&&n()},s&&s.appendChild(l),l}({url:t.href,callback:n});s.parentNode.style.maxWidth=t.width,s.parentNode.style.height=t.height,s.appendChild(l)}var U=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e),this.defaults={href:\"\",sizes:\"\",srcset:\"\",title:\"\",type:\"\",videoProvider:\"\",description:\"\",alt:\"\",descPosition:\"bottom\",effect:\"\",width:\"\",height:\"\",content:!1,zoomable:!0,draggable:!0},L(i)&&(this.defaults=l(this.defaults,i))}return n(e,[{key:\"sourceType\",value:function(e){var t=e;if(null!==(e=e.toLowerCase()).match(/\\.(jpeg|jpg|jpe|gif|png|apn|webp|avif|svg)/))return\"image\";if(e.match(/(youtube\\.com|youtube-nocookie\\.com)\\/watch\\?v=([a-zA-Z0-9\\-_]+)/)||e.match(/youtu\\.be\\/([a-zA-Z0-9\\-_]+)/)||e.match(/(youtube\\.com|youtube-nocookie\\.com)\\/embed\\/([a-zA-Z0-9\\-_]+)/))return\"video\";if(e.match(/vimeo\\.com\\/([0-9]*)/))return\"video\";if(null!==e.match(/\\.(mp4|ogg|webm|mov)/))return\"video\";if(null!==e.match(/\\.(mp3|wav|wma|aac|ogg)/))return\"audio\";if(e.indexOf(\"#\")>-1&&\"\"!==t.split(\"#\").pop().trim())return\"inline\";return e.indexOf(\"goajax=true\")>-1?\"ajax\":\"external\"}},{key:\"parseConfig\",value:function(e,t){var i=this,n=l({descPosition:t.descPosition},this.defaults);if(L(e)&&!k(e)){O(e,\"type\")||(O(e,\"content\")&&e.content?e.type=\"inline\":O(e,\"href\")&&(e.type=this.sourceType(e.href)));var s=l(n,e);return this.setSize(s,t),s}var r=\"\",a=e.getAttribute(\"data-glightbox\"),h=e.nodeName.toLowerCase();if(\"a\"===h&&(r=e.href),\"img\"===h&&(r=e.src,n.alt=e.alt),n.href=r,o(n,(function(s,l){O(t,l)&&\"width\"!==l&&(n[l]=t[l]);var o=e.dataset[l];I(o)||(n[l]=i.sanitizeValue(o))})),n.content&&(n.type=\"inline\"),!n.type&&r&&(n.type=this.sourceType(r)),I(a)){if(!n.title&&\"a\"==h){var d=e.title;I(d)||\"\"===d||(n.title=d)}if(!n.title&&\"img\"==h){var c=e.alt;I(c)||\"\"===c||(n.title=c)}}else{var u=[];o(n,(function(e,t){u.push(\";\\\\s?\"+t)})),u=u.join(\"\\\\s?:|\"),\"\"!==a.trim()&&o(n,(function(e,t){var s=a,l=new RegExp(\"s?\"+t+\"s?:s?(.*?)(\"+u+\"s?:|$)\"),o=s.match(l);if(o&&o.length&&o[1]){var r=o[1].trim().replace(/;\\s*$/,\"\");n[t]=i.sanitizeValue(r)}}))}if(n.description&&\".\"===n.description.substring(0,1)){var g;try{g=document.querySelector(n.description).innerHTML}catch(e){if(!(e instanceof DOMException))throw e}g&&(n.description=g)}if(!n.description){var v=e.querySelector(\".glightbox-desc\");v&&(n.description=v.innerHTML)}return this.setSize(n,t,e),this.slideConfig=n,n}},{key:\"setSize\",value:function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=\"video\"==e.type?this.checkSize(t.videosWidth):this.checkSize(t.width),s=this.checkSize(t.height);return e.width=O(e,\"width\")&&\"\"!==e.width?this.checkSize(e.width):n,e.height=O(e,\"height\")&&\"\"!==e.height?this.checkSize(e.height):s,i&&\"image\"==e.type&&(e._hasCustomWidth=!!i.dataset.width,e._hasCustomHeight=!!i.dataset.height),e}},{key:\"checkSize\",value:function(e){return M(e)?\"\".concat(e,\"px\"):e}},{key:\"sanitizeValue\",value:function(e){return\"true\"!==e&&\"false\"!==e?e:\"true\"===e}}]),e}(),$=function(){function e(i,n,s){t(this,e),this.element=i,this.instance=n,this.index=s}return n(e,[{key:\"setContent\",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(c(t,\"loaded\"))return!1;var n=this.instance.settings,s=this.slideConfig,l=w();T(n.beforeSlideLoad)&&n.beforeSlideLoad({index:this.index,slide:t,player:!1});var o=s.type,r=s.descPosition,a=t.querySelector(\".gslide-media\"),d=t.querySelector(\".gslide-title\"),u=t.querySelector(\".gslide-desc\"),g=t.querySelector(\".gdesc-inner\"),v=i,f=\"gSlideTitle_\"+this.index,p=\"gSlideDesc_\"+this.index;if(T(n.afterSlideLoad)&&(v=function(){T(i)&&i(),n.afterSlideLoad({index:e.index,slide:t,player:e.instance.getSlidePlayerInstance(e.index)})}),\"\"==s.title&&\"\"==s.description?g&&g.parentNode.parentNode.removeChild(g.parentNode):(d&&\"\"!==s.title?(d.id=f,d.innerHTML=s.title):d.parentNode.removeChild(d),u&&\"\"!==s.description?(u.id=p,l&&n.moreLength>0?(s.smallDescription=this.slideShortDesc(s.description,n.moreLength,n.moreText),u.innerHTML=s.smallDescription,this.descriptionEvents(u,s)):u.innerHTML=s.description):u.parentNode.removeChild(u),h(a.parentNode,\"desc-\".concat(r)),h(g.parentNode,\"description-\".concat(r))),h(a,\"gslide-\".concat(o)),h(t,\"loaded\"),\"video\"!==o){if(\"external\"!==o)return\"inline\"===o?(G.apply(this.instance,[t,s,this.index,v]),void(s.draggable&&new V({dragEl:t.querySelector(\".gslide-inline\"),toleranceX:n.dragToleranceX,toleranceY:n.dragToleranceY,slide:t,instance:this.instance}))):void(\"image\"!==o?T(v)&&v():j(t,s,this.index,(function(){var i=t.querySelector(\"img\");s.draggable&&new V({dragEl:i,toleranceX:n.dragToleranceX,toleranceY:n.dragToleranceY,slide:t,instance:e.instance}),s.zoomable&&i.naturalWidth>i.offsetWidth&&(h(i,\"zoomable\"),new H(i,t,(function(){e.instance.resize()}))),T(v)&&v()})));Z.apply(this,[t,s,this.index,v])}else F.apply(this.instance,[t,s,this.index,v])}},{key:\"slideShortDesc\",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:50,i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=document.createElement(\"div\");n.innerHTML=e;var s=n.innerText,l=i;if((e=s.trim()).length<=t)return e;var o=e.substr(0,t-1);return l?(n=null,o+'... '+i+\"\"):o}},{key:\"descriptionEvents\",value:function(e,t){var i=this,n=e.querySelector(\".desc-more\");if(!n)return!1;a(\"click\",{onElement:n,withCallback:function(e,n){e.preventDefault();var s=document.body,l=u(n,\".gslide-desc\");if(!l)return!1;l.innerHTML=t.description,h(s,\"gdesc-open\");var o=a(\"click\",{onElement:[s,u(l,\".gslide-description\")],withCallback:function(e,n){\"a\"!==e.target.nodeName.toLowerCase()&&(d(s,\"gdesc-open\"),h(s,\"gdesc-closed\"),l.innerHTML=t.smallDescription,i.descriptionEvents(l,t),setTimeout((function(){d(s,\"gdesc-closed\")}),400),o.destroy())}})}})}},{key:\"create\",value:function(){return m(this.instance.settings.slideHTML)}},{key:\"getConfig\",value:function(){k(this.element)||this.element.hasOwnProperty(\"draggable\")||(this.element.draggable=this.instance.settings.draggable);var e=new U(this.instance.settings.slideExtraAttributes);return this.slideConfig=e.parseConfig(this.element,this.instance.settings),this.slideConfig}}]),e}(),J=w(),K=null!==w()||void 0!==document.createTouch||\"ontouchstart\"in window||\"onmsgesturechange\"in window||navigator.msMaxTouchPoints,Q=document.getElementsByTagName(\"html\")[0],ee={selector:\".glightbox\",elements:null,skin:\"clean\",theme:\"clean\",closeButton:!0,startAt:null,autoplayVideos:!0,autofocusVideos:!0,descPosition:\"bottom\",width:\"900px\",height:\"506px\",videosWidth:\"960px\",beforeSlideChange:null,afterSlideChange:null,beforeSlideLoad:null,afterSlideLoad:null,slideInserted:null,slideRemoved:null,slideExtraAttributes:null,onOpen:null,onClose:null,loop:!1,zoomable:!0,draggable:!0,dragAutoSnap:!1,dragToleranceX:40,dragToleranceY:65,preload:!0,oneSlidePerOpen:!1,touchNavigation:!0,touchFollowAxis:!0,keyboardNavigation:!0,closeOnOutsideClick:!0,plugins:!1,plyr:{css:\"https://cdn.plyr.io/3.6.12/plyr.css\",js:\"https://cdn.plyr.io/3.6.12/plyr.js\",config:{ratio:\"16:9\",fullscreen:{enabled:!0,iosNative:!0},youtube:{noCookie:!0,rel:0,showinfo:0,iv_load_policy:3},vimeo:{byline:!1,portrait:!1,title:!1,transparent:!1}}},openEffect:\"zoom\",closeEffect:\"zoom\",slideEffect:\"slide\",moreText:\"See more\",moreLength:60,cssEfects:{fade:{in:\"fadeIn\",out:\"fadeOut\"},zoom:{in:\"zoomIn\",out:\"zoomOut\"},slide:{in:\"slideInRight\",out:\"slideOutLeft\"},slideBack:{in:\"slideInLeft\",out:\"slideOutRight\"},none:{in:\"none\",out:\"none\"}},svg:{close:'',next:' ',prev:''},slideHTML:'
\\n
\\n
\\n
\\n
\\n
\\n
\\n

\\n
\\n
\\n
\\n
\\n
\\n
',lightboxHTML:'
\\n
\\n
\\n
\\n
\\n \\n \\n \\n
\\n
'},te=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e),this.customOptions=i,this.settings=l(ee,i),this.effectsClasses=this.getAnimationClasses(),this.videoPlayers={},this.apiEvents=[],this.fullElementsList=!1}return n(e,[{key:\"init\",value:function(){var e=this,t=this.getSelector();t&&(this.baseEvents=a(\"click\",{onElement:t,withCallback:function(t,i){t.preventDefault(),e.open(i)}})),this.elements=this.getElements()}},{key:\"open\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(0===this.elements.length)return!1;this.activeSlide=null,this.prevActiveSlideIndex=null,this.prevActiveSlide=null;var i=M(t)?t:this.settings.startAt;if(k(e)){var n=e.getAttribute(\"data-gallery\");n&&(this.fullElementsList=this.elements,this.elements=this.getGalleryElements(this.elements,n)),I(i)&&(i=this.getElementIndex(e))<0&&(i=0)}M(i)||(i=0),this.build(),g(this.overlay,\"none\"===this.settings.openEffect?\"none\":this.settings.cssEfects.fade.in);var s=document.body,l=window.innerWidth-document.documentElement.clientWidth;if(l>0){var o=document.createElement(\"style\");o.type=\"text/css\",o.className=\"gcss-styles\",o.innerText=\".gscrollbar-fixer {margin-right: \".concat(l,\"px}\"),document.head.appendChild(o),h(s,\"gscrollbar-fixer\")}h(s,\"glightbox-open\"),h(Q,\"glightbox-open\"),J&&(h(document.body,\"glightbox-mobile\"),this.settings.slideEffect=\"slide\"),this.showSlide(i,!0),1===this.elements.length?(h(this.prevButton,\"glightbox-button-hidden\"),h(this.nextButton,\"glightbox-button-hidden\")):(d(this.prevButton,\"glightbox-button-hidden\"),d(this.nextButton,\"glightbox-button-hidden\")),this.lightboxOpen=!0,this.trigger(\"open\"),T(this.settings.onOpen)&&this.settings.onOpen(),K&&this.settings.touchNavigation&&B(this),this.settings.keyboardNavigation&&X(this)}},{key:\"openAt\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.open(null,e)}},{key:\"showSlide\",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];f(this.loader),this.index=parseInt(t);var n=this.slidesContainer.querySelector(\".current\");n&&d(n,\"current\"),this.slideAnimateOut();var s=this.slidesContainer.querySelectorAll(\".gslide\")[t];if(c(s,\"loaded\"))this.slideAnimateIn(s,i),p(this.loader);else{f(this.loader);var l=this.elements[t],o={index:this.index,slide:s,slideNode:s,slideConfig:l.slideConfig,slideIndex:this.index,trigger:l.node,player:null};this.trigger(\"slide_before_load\",o),l.instance.setContent(s,(function(){p(e.loader),e.resize(),e.slideAnimateIn(s,i),e.trigger(\"slide_after_load\",o)}))}this.slideDescription=s.querySelector(\".gslide-description\"),this.slideDescriptionContained=this.slideDescription&&c(this.slideDescription.parentNode,\"gslide-media\"),this.settings.preload&&(this.preloadSlide(t+1),this.preloadSlide(t-1)),this.updateNavigationClasses(),this.activeSlide=s}},{key:\"preloadSlide\",value:function(e){var t=this;if(e<0||e>this.elements.length-1)return!1;if(I(this.elements[e]))return!1;var i=this.slidesContainer.querySelectorAll(\".gslide\")[e];if(c(i,\"loaded\"))return!1;var n=this.elements[e],s=n.type,l={index:e,slide:i,slideNode:i,slideConfig:n.slideConfig,slideIndex:e,trigger:n.node,player:null};this.trigger(\"slide_before_load\",l),\"video\"===s||\"external\"===s?setTimeout((function(){n.instance.setContent(i,(function(){t.trigger(\"slide_after_load\",l)}))}),200):n.instance.setContent(i,(function(){t.trigger(\"slide_after_load\",l)}))}},{key:\"prevSlide\",value:function(){this.goToSlide(this.index-1)}},{key:\"nextSlide\",value:function(){this.goToSlide(this.index+1)}},{key:\"goToSlide\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.prevActiveSlide=this.activeSlide,this.prevActiveSlideIndex=this.index,!this.loop()&&(e<0||e>this.elements.length-1))return!1;e<0?e=this.elements.length-1:e>=this.elements.length&&(e=0),this.showSlide(e)}},{key:\"insertSlide\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1;t<0&&(t=this.elements.length);var i=new $(e,this,t),n=i.getConfig(),s=l({},n),o=i.create(),r=this.elements.length-1;s.index=t,s.node=!1,s.instance=i,s.slideConfig=n,this.elements.splice(t,0,s);var a=null,h=null;if(this.slidesContainer){if(t>r)this.slidesContainer.appendChild(o);else{var d=this.slidesContainer.querySelectorAll(\".gslide\")[t];this.slidesContainer.insertBefore(o,d)}(this.settings.preload&&0==this.index&&0==t||this.index-1==t||this.index+1==t)&&this.preloadSlide(t),0===this.index&&0===t&&(this.index=1),this.updateNavigationClasses(),a=this.slidesContainer.querySelectorAll(\".gslide\")[t],h=this.getSlidePlayerInstance(t),s.slideNode=a}this.trigger(\"slide_inserted\",{index:t,slide:a,slideNode:a,slideConfig:n,slideIndex:t,trigger:null,player:h}),T(this.settings.slideInserted)&&this.settings.slideInserted({index:t,slide:a,player:h})}},{key:\"removeSlide\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;if(e<0||e>this.elements.length-1)return!1;var t=this.slidesContainer&&this.slidesContainer.querySelectorAll(\".gslide\")[e];t&&(this.getActiveSlideIndex()==e&&(e==this.elements.length-1?this.prevSlide():this.nextSlide()),t.parentNode.removeChild(t)),this.elements.splice(e,1),this.trigger(\"slide_removed\",e),T(this.settings.slideRemoved)&&this.settings.slideRemoved(e)}},{key:\"slideAnimateIn\",value:function(e,t){var i=this,n=e.querySelector(\".gslide-media\"),s=e.querySelector(\".gslide-description\"),l={index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,slideNode:this.prevActiveSlide,slideIndex:this.prevActiveSlide,slideConfig:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].slideConfig,trigger:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].node,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},o={index:this.index,slide:this.activeSlide,slideNode:this.activeSlide,slideConfig:this.elements[this.index].slideConfig,slideIndex:this.index,trigger:this.elements[this.index].node,player:this.getSlidePlayerInstance(this.index)};if(n.offsetWidth>0&&s&&(p(s),s.style.display=\"\"),d(e,this.effectsClasses),t)g(e,this.settings.cssEfects[this.settings.openEffect].in,(function(){i.settings.autoplayVideos&&i.slidePlayerPlay(e),i.trigger(\"slide_changed\",{prev:l,current:o}),T(i.settings.afterSlideChange)&&i.settings.afterSlideChange.apply(i,[l,o])}));else{var r=this.settings.slideEffect,a=\"none\"!==r?this.settings.cssEfects[r].in:r;this.prevActiveSlideIndex>this.index&&\"slide\"==this.settings.slideEffect&&(a=this.settings.cssEfects.slideBack.in),g(e,a,(function(){i.settings.autoplayVideos&&i.slidePlayerPlay(e),i.trigger(\"slide_changed\",{prev:l,current:o}),T(i.settings.afterSlideChange)&&i.settings.afterSlideChange.apply(i,[l,o])}))}setTimeout((function(){i.resize(e)}),100),h(e,\"current\")}},{key:\"slideAnimateOut\",value:function(){if(!this.prevActiveSlide)return!1;var e=this.prevActiveSlide;d(e,this.effectsClasses),h(e,\"prev\");var t=this.settings.slideEffect,i=\"none\"!==t?this.settings.cssEfects[t].out:t;this.slidePlayerPause(e),this.trigger(\"slide_before_change\",{prev:{index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,slideNode:this.prevActiveSlide,slideIndex:this.prevActiveSlideIndex,slideConfig:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].slideConfig,trigger:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].node,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},current:{index:this.index,slide:this.activeSlide,slideNode:this.activeSlide,slideIndex:this.index,slideConfig:this.elements[this.index].slideConfig,trigger:this.elements[this.index].node,player:this.getSlidePlayerInstance(this.index)}}),T(this.settings.beforeSlideChange)&&this.settings.beforeSlideChange.apply(this,[{index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},{index:this.index,slide:this.activeSlide,player:this.getSlidePlayerInstance(this.index)}]),this.prevActiveSlideIndex>this.index&&\"slide\"==this.settings.slideEffect&&(i=this.settings.cssEfects.slideBack.out),g(e,i,(function(){var t=e.querySelector(\".ginner-container\"),i=e.querySelector(\".gslide-media\"),n=e.querySelector(\".gslide-description\");t.style.transform=\"\",i.style.transform=\"\",d(i,\"greset\"),i.style.opacity=\"\",n&&(n.style.opacity=\"\"),d(e,\"prev\")}))}},{key:\"getAllPlayers\",value:function(){return this.videoPlayers}},{key:\"getSlidePlayerInstance\",value:function(e){var t=\"gvideo\"+e,i=this.getAllPlayers();return!(!O(i,t)||!i[t])&&i[t]}},{key:\"stopSlideVideo\",value:function(e){if(k(e)){var t=e.querySelector(\".gvideo-wrapper\");t&&(e=t.getAttribute(\"data-index\"))}console.log(\"stopSlideVideo is deprecated, use slidePlayerPause\");var i=this.getSlidePlayerInstance(e);i&&i.playing&&i.pause()}},{key:\"slidePlayerPause\",value:function(e){if(k(e)){var t=e.querySelector(\".gvideo-wrapper\");t&&(e=t.getAttribute(\"data-index\"))}var i=this.getSlidePlayerInstance(e);i&&i.playing&&i.pause()}},{key:\"playSlideVideo\",value:function(e){if(k(e)){var t=e.querySelector(\".gvideo-wrapper\");t&&(e=t.getAttribute(\"data-index\"))}console.log(\"playSlideVideo is deprecated, use slidePlayerPlay\");var i=this.getSlidePlayerInstance(e);i&&!i.playing&&i.play()}},{key:\"slidePlayerPlay\",value:function(e){var t;if(!J||null!==(t=this.settings.plyr.config)&&void 0!==t&&t.muted){if(k(e)){var i=e.querySelector(\".gvideo-wrapper\");i&&(e=i.getAttribute(\"data-index\"))}var n=this.getSlidePlayerInstance(e);n&&!n.playing&&(n.play(),this.settings.autofocusVideos&&n.elements.container.focus())}}},{key:\"setElements\",value:function(e){var t=this;this.settings.elements=!1;var i=[];e&&e.length&&o(e,(function(e,n){var s=new $(e,t,n),o=s.getConfig(),r=l({},o);r.slideConfig=o,r.instance=s,r.index=n,i.push(r)})),this.elements=i,this.lightboxOpen&&(this.slidesContainer.innerHTML=\"\",this.elements.length&&(o(this.elements,(function(){var e=m(t.settings.slideHTML);t.slidesContainer.appendChild(e)})),this.showSlide(0,!0)))}},{key:\"getElementIndex\",value:function(e){var t=!1;return o(this.elements,(function(i,n){if(O(i,\"node\")&&i.node==e)return t=n,!0})),t}},{key:\"getElements\",value:function(){var e=this,t=[];this.elements=this.elements?this.elements:[],!I(this.settings.elements)&&E(this.settings.elements)&&this.settings.elements.length&&o(this.settings.elements,(function(i,n){var s=new $(i,e,n),o=s.getConfig(),r=l({},o);r.node=!1,r.index=n,r.instance=s,r.slideConfig=o,t.push(r)}));var i=!1;return this.getSelector()&&(i=document.querySelectorAll(this.getSelector())),i?(o(i,(function(i,n){var s=new $(i,e,n),o=s.getConfig(),r=l({},o);r.node=i,r.index=n,r.instance=s,r.slideConfig=o,r.gallery=i.getAttribute(\"data-gallery\"),t.push(r)})),t):t}},{key:\"getGalleryElements\",value:function(e,t){return e.filter((function(e){return e.gallery==t}))}},{key:\"getSelector\",value:function(){return!this.settings.elements&&(this.settings.selector&&\"data-\"==this.settings.selector.substring(0,5)?\"*[\".concat(this.settings.selector,\"]\"):this.settings.selector)}},{key:\"getActiveSlide\",value:function(){return this.slidesContainer.querySelectorAll(\".gslide\")[this.index]}},{key:\"getActiveSlideIndex\",value:function(){return this.index}},{key:\"getAnimationClasses\",value:function(){var e=[];for(var t in this.settings.cssEfects)if(this.settings.cssEfects.hasOwnProperty(t)){var i=this.settings.cssEfects[t];e.push(\"g\".concat(i.in)),e.push(\"g\".concat(i.out))}return e.join(\" \")}},{key:\"build\",value:function(){var e=this;if(this.built)return!1;var t=document.body.childNodes,i=[];o(t,(function(e){e.parentNode==document.body&&\"#\"!==e.nodeName.charAt(0)&&e.hasAttribute&&!e.hasAttribute(\"aria-hidden\")&&(i.push(e),e.setAttribute(\"aria-hidden\",\"true\"))}));var n=O(this.settings.svg,\"next\")?this.settings.svg.next:\"\",s=O(this.settings.svg,\"prev\")?this.settings.svg.prev:\"\",l=O(this.settings.svg,\"close\")?this.settings.svg.close:\"\",r=this.settings.lightboxHTML;r=m(r=(r=(r=r.replace(/{nextSVG}/g,n)).replace(/{prevSVG}/g,s)).replace(/{closeSVG}/g,l)),document.body.appendChild(r);var d=document.getElementById(\"glightbox-body\");this.modal=d;var g=d.querySelector(\".gclose\");this.prevButton=d.querySelector(\".gprev\"),this.nextButton=d.querySelector(\".gnext\"),this.overlay=d.querySelector(\".goverlay\"),this.loader=d.querySelector(\".gloader\"),this.slidesContainer=document.getElementById(\"glightbox-slider\"),this.bodyHiddenChildElms=i,this.events={},h(this.modal,\"glightbox-\"+this.settings.skin),this.settings.closeButton&&g&&(this.events.close=a(\"click\",{onElement:g,withCallback:function(t,i){t.preventDefault(),e.close()}})),g&&!this.settings.closeButton&&g.parentNode.removeChild(g),this.nextButton&&(this.events.next=a(\"click\",{onElement:this.nextButton,withCallback:function(t,i){t.preventDefault(),e.nextSlide()}})),this.prevButton&&(this.events.prev=a(\"click\",{onElement:this.prevButton,withCallback:function(t,i){t.preventDefault(),e.prevSlide()}})),this.settings.closeOnOutsideClick&&(this.events.outClose=a(\"click\",{onElement:d,withCallback:function(t,i){e.preventOutsideClick||c(document.body,\"glightbox-mobile\")||u(t.target,\".ginner-container\")||u(t.target,\".gbtn\")||c(t.target,\"gnext\")||c(t.target,\"gprev\")||e.close()}})),o(this.elements,(function(t,i){e.slidesContainer.appendChild(t.instance.create()),t.slideNode=e.slidesContainer.querySelectorAll(\".gslide\")[i]})),K&&h(document.body,\"glightbox-touch\"),this.events.resize=a(\"resize\",{onElement:window,withCallback:function(){e.resize()}}),this.built=!0}},{key:\"resize\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if((e=e||this.activeSlide)&&!c(e,\"zoomed\")){var t=y(),i=e.querySelector(\".gvideo-wrapper\"),n=e.querySelector(\".gslide-image\"),s=this.slideDescription,l=t.width,o=t.height;if(l<=768?h(document.body,\"glightbox-mobile\"):d(document.body,\"glightbox-mobile\"),i||n){var r=!1;if(s&&(c(s,\"description-bottom\")||c(s,\"description-top\"))&&!c(s,\"gabsolute\")&&(r=!0),n)if(l<=768)n.querySelector(\"img\");else if(r){var a=s.offsetHeight,u=n.querySelector(\"img\");u.setAttribute(\"style\",\"max-height: calc(100vh - \".concat(a,\"px)\")),s.setAttribute(\"style\",\"max-width: \".concat(u.offsetWidth,\"px;\"))}if(i){var g=O(this.settings.plyr.config,\"ratio\")?this.settings.plyr.config.ratio:\"\";if(!g){var v=i.clientWidth,f=i.clientHeight,p=v/f;g=\"\".concat(v/p,\":\").concat(f/p)}var m=g.split(\":\"),x=this.settings.videosWidth,b=this.settings.videosWidth,S=(b=M(x)||-1!==x.indexOf(\"px\")?parseInt(x):-1!==x.indexOf(\"vw\")?l*parseInt(x)/100:-1!==x.indexOf(\"vh\")?o*parseInt(x)/100:-1!==x.indexOf(\"%\")?l*parseInt(x)/100:parseInt(i.clientWidth))/(parseInt(m[0])/parseInt(m[1]));if(S=Math.floor(S),r&&(o-=s.offsetHeight),b>l||S>o||ob){var w=i.offsetWidth,T=i.offsetHeight,C=o/T,k={width:w*C,height:T*C};i.parentNode.setAttribute(\"style\",\"max-width: \".concat(k.width,\"px\")),r&&s.setAttribute(\"style\",\"max-width: \".concat(k.width,\"px;\"))}else i.parentNode.style.maxWidth=\"\".concat(x),r&&s.setAttribute(\"style\",\"max-width: \".concat(x,\";\"))}}}}},{key:\"reload\",value:function(){this.init()}},{key:\"updateNavigationClasses\",value:function(){var e=this.loop();d(this.nextButton,\"disabled\"),d(this.prevButton,\"disabled\"),0==this.index&&this.elements.length-1==0?(h(this.prevButton,\"disabled\"),h(this.nextButton,\"disabled\")):0!==this.index||e?this.index!==this.elements.length-1||e||h(this.nextButton,\"disabled\"):h(this.prevButton,\"disabled\")}},{key:\"loop\",value:function(){var e=O(this.settings,\"loopAtEnd\")?this.settings.loopAtEnd:null;return e=O(this.settings,\"loop\")?this.settings.loop:e,e}},{key:\"close\",value:function(){var e=this;if(!this.lightboxOpen){if(this.events){for(var t in this.events)this.events.hasOwnProperty(t)&&this.events[t].destroy();this.events=null}return!1}if(this.closing)return!1;this.closing=!0,this.slidePlayerPause(this.activeSlide),this.fullElementsList&&(this.elements=this.fullElementsList),this.bodyHiddenChildElms.length&&o(this.bodyHiddenChildElms,(function(e){e.removeAttribute(\"aria-hidden\")})),h(this.modal,\"glightbox-closing\"),g(this.overlay,\"none\"==this.settings.openEffect?\"none\":this.settings.cssEfects.fade.out),g(this.activeSlide,this.settings.cssEfects[this.settings.closeEffect].out,(function(){if(e.activeSlide=null,e.prevActiveSlideIndex=null,e.prevActiveSlide=null,e.built=!1,e.events){for(var t in e.events)e.events.hasOwnProperty(t)&&e.events[t].destroy();e.events=null}var i=document.body;d(Q,\"glightbox-open\"),d(i,\"glightbox-open touching gdesc-open glightbox-touch glightbox-mobile gscrollbar-fixer\"),e.modal.parentNode.removeChild(e.modal),e.trigger(\"close\"),T(e.settings.onClose)&&e.settings.onClose();var n=document.querySelector(\".gcss-styles\");n&&n.parentNode.removeChild(n),e.lightboxOpen=!1,e.closing=null}))}},{key:\"destroy\",value:function(){this.close(),this.clearAllEvents(),this.baseEvents&&this.baseEvents.destroy()}},{key:\"on\",value:function(e,t){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e||!T(t))throw new TypeError(\"Event name and callback must be defined\");this.apiEvents.push({evt:e,once:i,callback:t})}},{key:\"once\",value:function(e,t){this.on(e,t,!0)}},{key:\"trigger\",value:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=[];o(this.apiEvents,(function(t,s){var l=t.evt,o=t.once,r=t.callback;l==e&&(r(i),o&&n.push(s))})),n.length&&o(n,(function(e){return t.apiEvents.splice(e,1)}))}},{key:\"clearAllEvents\",value:function(){this.apiEvents.splice(0,this.apiEvents.length)}},{key:\"version\",value:function(){return\"3.1.0\"}}]),e}();return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=new te(e);return t.init(),t}}));", "(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SlimSelect = factory());\n})(this, (function () { 'use strict';\n\n function generateID() {\n return Math.random().toString(36).substring(2, 10);\n }\n function hasClassInTree(element, className) {\n function hasClass(e, c) {\n if (c && e && e.classList && e.classList.contains(c)) {\n return e;\n }\n if (c && e && e.dataset && e.dataset.id && e.dataset.id === className) {\n return e;\n }\n return null;\n }\n function parentByClass(e, c) {\n if (!e || e === document) {\n return null;\n }\n else if (hasClass(e, c)) {\n return e;\n }\n else {\n return parentByClass(e.parentNode, c);\n }\n }\n return hasClass(element, className) || parentByClass(element, className);\n }\n function debounce(func, wait = 50, immediate = false) {\n let timeout;\n return function (...args) {\n const context = self;\n const later = () => {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n const callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n func.apply(context, args);\n }\n };\n }\n function isEqual(a, b) {\n return JSON.stringify(a) === JSON.stringify(b);\n }\n function kebabCase(str) {\n const result = str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match) => '-' + match.toLowerCase());\n return str[0] === str[0].toUpperCase() ? result.substring(1) : result;\n }\n\n class Optgroup {\n constructor(optgroup) {\n this.id = !optgroup.id || optgroup.id === '' ? generateID() : optgroup.id;\n this.label = optgroup.label || '';\n this.selectAll = optgroup.selectAll === undefined ? false : optgroup.selectAll;\n this.selectAllText = optgroup.selectAllText || 'Select All';\n this.closable = optgroup.closable || 'off';\n this.options = [];\n if (optgroup.options) {\n for (const o of optgroup.options) {\n this.options.push(new Option(o));\n }\n }\n }\n }\n class Option {\n constructor(option) {\n this.id = !option.id || option.id === '' ? generateID() : option.id;\n this.value = option.value === undefined ? option.text : option.value;\n this.text = option.text || '';\n this.html = option.html || '';\n this.selected = option.selected !== undefined ? option.selected : false;\n this.display = option.display !== undefined ? option.display : true;\n this.disabled = option.disabled !== undefined ? option.disabled : false;\n this.mandatory = option.mandatory !== undefined ? option.mandatory : false;\n this.placeholder = option.placeholder !== undefined ? option.placeholder : false;\n this.class = option.class || '';\n this.style = option.style || '';\n this.data = option.data || {};\n }\n }\n class Store {\n constructor(type, data) {\n this.selectType = 'single';\n this.data = [];\n this.selectType = type;\n this.setData(data);\n }\n validateDataArray(data) {\n if (!Array.isArray(data)) {\n return new Error('Data must be an array');\n }\n for (let dataObj of data) {\n if (dataObj instanceof Optgroup || 'label' in dataObj) {\n if (!('label' in dataObj)) {\n return new Error('Optgroup must have a label');\n }\n if ('options' in dataObj && dataObj.options) {\n for (let option of dataObj.options) {\n return this.validateOption(option);\n }\n }\n }\n else if (dataObj instanceof Option || 'text' in dataObj) {\n return this.validateOption(dataObj);\n }\n else {\n return new Error('Data object must be a valid optgroup or option');\n }\n }\n return null;\n }\n validateOption(option) {\n if (!('text' in option)) {\n return new Error('Option must have a text');\n }\n return null;\n }\n partialToFullData(data) {\n let dataFinal = [];\n data.forEach((dataObj) => {\n if (dataObj instanceof Optgroup || 'label' in dataObj) {\n let optOptions = [];\n if ('options' in dataObj && dataObj.options) {\n dataObj.options.forEach((option) => {\n optOptions.push(new Option(option));\n });\n }\n if (optOptions.length > 0) {\n dataFinal.push(new Optgroup(dataObj));\n }\n }\n if (dataObj instanceof Option || 'text' in dataObj) {\n dataFinal.push(new Option(dataObj));\n }\n });\n return dataFinal;\n }\n setData(data) {\n this.data = this.partialToFullData(data);\n if (this.selectType === 'single') {\n this.setSelectedBy('value', this.getSelected());\n }\n }\n getData() {\n return this.filter(null, true);\n }\n getDataOptions() {\n return this.filter(null, false);\n }\n addOption(option) {\n this.setData(this.getData().concat(new Option(option)));\n }\n setSelectedBy(selectedType, selectedValues) {\n let firstOption = null;\n let hasSelected = false;\n for (let dataObj of this.data) {\n if (dataObj instanceof Optgroup) {\n for (let option of dataObj.options) {\n if (!firstOption) {\n firstOption = option;\n }\n option.selected = hasSelected ? false : selectedValues.includes(option[selectedType]);\n if (option.selected && this.selectType === 'single') {\n hasSelected = true;\n }\n }\n }\n if (dataObj instanceof Option) {\n if (!firstOption) {\n firstOption = dataObj;\n }\n dataObj.selected = hasSelected ? false : selectedValues.includes(dataObj[selectedType]);\n if (dataObj.selected && this.selectType === 'single') {\n hasSelected = true;\n }\n }\n }\n if (this.selectType === 'single' && firstOption && !hasSelected) {\n firstOption.selected = true;\n }\n }\n getSelected() {\n let selectedOptions = this.getSelectedOptions();\n let selectedValues = [];\n selectedOptions.forEach((option) => {\n selectedValues.push(option.value);\n });\n return selectedValues;\n }\n getSelectedOptions() {\n return this.filter((opt) => {\n return opt.selected;\n }, false);\n }\n getSelectedIDs() {\n let selectedOptions = this.getSelectedOptions();\n let selectedIDs = [];\n selectedOptions.forEach((op) => {\n selectedIDs.push(op.id);\n });\n return selectedIDs;\n }\n getOptgroupByID(id) {\n for (let dataObj of this.data) {\n if (dataObj instanceof Optgroup && dataObj.id === id) {\n return dataObj;\n }\n }\n return null;\n }\n getOptionByID(id) {\n let options = this.filter((opt) => {\n return opt.id === id;\n }, false);\n return options.length ? options[0] : null;\n }\n getSelectType() {\n return this.selectType;\n }\n getFirstOption() {\n let option = null;\n for (let dataObj of this.data) {\n if (dataObj instanceof Optgroup) {\n option = dataObj.options[0];\n }\n else if (dataObj instanceof Option) {\n option = dataObj;\n }\n if (option) {\n break;\n }\n }\n return option;\n }\n search(search, searchFilter) {\n search = search.trim();\n if (search === '') {\n return this.getData();\n }\n return this.filter((opt) => {\n return searchFilter(opt, search);\n }, true);\n }\n filter(filter, includeOptgroup) {\n const dataSearch = [];\n this.data.forEach((dataObj) => {\n if (dataObj instanceof Optgroup) {\n let optOptions = [];\n dataObj.options.forEach((option) => {\n if (!filter || filter(option)) {\n if (!includeOptgroup) {\n dataSearch.push(new Option(option));\n }\n else {\n optOptions.push(new Option(option));\n }\n }\n });\n if (optOptions.length > 0) {\n let optgroup = new Optgroup(dataObj);\n optgroup.options = optOptions;\n dataSearch.push(optgroup);\n }\n }\n if (dataObj instanceof Option) {\n if (!filter || filter(dataObj)) {\n dataSearch.push(new Option(dataObj));\n }\n }\n });\n return dataSearch;\n }\n }\n\n class Render {\n constructor(settings, store, callbacks) {\n this.classes = {\n main: 'ss-main',\n placeholder: 'ss-placeholder',\n values: 'ss-values',\n single: 'ss-single',\n max: 'ss-max',\n value: 'ss-value',\n valueText: 'ss-value-text',\n valueDelete: 'ss-value-delete',\n valueOut: 'ss-value-out',\n deselect: 'ss-deselect',\n deselectPath: 'M10,10 L90,90 M10,90 L90,10',\n arrow: 'ss-arrow',\n arrowClose: 'M10,30 L50,70 L90,30',\n arrowOpen: 'M10,70 L50,30 L90,70',\n content: 'ss-content',\n openAbove: 'ss-open-above',\n openBelow: 'ss-open-below',\n search: 'ss-search',\n searchHighlighter: 'ss-search-highlight',\n searching: 'ss-searching',\n addable: 'ss-addable',\n addablePath: 'M50,10 L50,90 M10,50 L90,50',\n list: 'ss-list',\n optgroup: 'ss-optgroup',\n optgroupLabel: 'ss-optgroup-label',\n optgroupLabelText: 'ss-optgroup-label-text',\n optgroupActions: 'ss-optgroup-actions',\n optgroupSelectAll: 'ss-selectall',\n optgroupSelectAllBox: 'M60,10 L10,10 L10,90 L90,90 L90,50',\n optgroupSelectAllCheck: 'M30,45 L50,70 L90,10',\n optgroupClosable: 'ss-closable',\n option: 'ss-option',\n optionDelete: 'M10,10 L90,90 M10,90 L90,10',\n highlighted: 'ss-highlighted',\n open: 'ss-open',\n close: 'ss-close',\n selected: 'ss-selected',\n error: 'ss-error',\n disabled: 'ss-disabled',\n hide: 'ss-hide',\n };\n this.store = store;\n this.settings = settings;\n this.callbacks = callbacks;\n this.main = this.mainDiv();\n this.content = this.contentDiv();\n this.updateClassStyles();\n this.updateAriaAttributes();\n this.settings.contentLocation.appendChild(this.content.main);\n }\n enable() {\n this.main.main.classList.remove(this.classes.disabled);\n this.content.search.input.disabled = false;\n }\n disable() {\n this.main.main.classList.add(this.classes.disabled);\n this.content.search.input.disabled = true;\n }\n open() {\n this.main.arrow.path.setAttribute('d', this.classes.arrowOpen);\n this.main.main.classList.add(this.settings.openPosition === 'up' ? this.classes.openAbove : this.classes.openBelow);\n this.main.main.setAttribute('aria-expanded', 'true');\n this.moveContent();\n const selectedOptions = this.store.getSelectedOptions();\n if (selectedOptions.length) {\n const selectedId = selectedOptions[selectedOptions.length - 1].id;\n const selectedOption = this.content.list.querySelector('[data-id=\"' + selectedId + '\"]');\n if (selectedOption) {\n this.ensureElementInView(this.content.list, selectedOption);\n }\n }\n }\n close() {\n this.main.main.classList.remove(this.classes.openAbove);\n this.main.main.classList.remove(this.classes.openBelow);\n this.main.main.setAttribute('aria-expanded', 'false');\n this.content.main.classList.remove(this.classes.openAbove);\n this.content.main.classList.remove(this.classes.openBelow);\n this.main.arrow.path.setAttribute('d', this.classes.arrowClose);\n }\n updateClassStyles() {\n this.main.main.className = '';\n this.main.main.removeAttribute('style');\n this.content.main.className = '';\n this.content.main.removeAttribute('style');\n this.main.main.classList.add(this.classes.main);\n this.content.main.classList.add(this.classes.content);\n if (this.settings.style !== '') {\n this.main.main.style.cssText = this.settings.style;\n this.content.main.style.cssText = this.settings.style;\n }\n if (this.settings.class.length) {\n for (const c of this.settings.class) {\n if (c.trim() !== '') {\n this.main.main.classList.add(c.trim());\n this.content.main.classList.add(c.trim());\n }\n }\n }\n if (this.settings.contentPosition === 'relative') {\n this.content.main.classList.add('ss-' + this.settings.contentPosition);\n }\n }\n updateAriaAttributes() {\n this.main.main.role = 'combobox';\n this.main.main.setAttribute('aria-haspopup', 'listbox');\n this.main.main.setAttribute('aria-controls', this.content.main.id);\n this.main.main.setAttribute('aria-expanded', 'false');\n this.content.main.setAttribute('role', 'listbox');\n }\n mainDiv() {\n var _a;\n const main = document.createElement('div');\n main.dataset.id = this.settings.id;\n main.setAttribute('aria-label', this.settings.ariaLabel);\n main.tabIndex = 0;\n main.onkeydown = (e) => {\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowDown':\n this.callbacks.open();\n e.key === 'ArrowDown' ? this.highlight('down') : this.highlight('up');\n return false;\n case 'Tab':\n this.callbacks.close();\n return true;\n case 'Enter':\n case ' ':\n this.callbacks.open();\n const highlighted = this.content.list.querySelector('.' + this.classes.highlighted);\n if (highlighted) {\n highlighted.click();\n }\n return false;\n case 'Escape':\n this.callbacks.close();\n return false;\n }\n return false;\n };\n main.onclick = (e) => {\n if (this.settings.disabled) {\n return;\n }\n this.settings.isOpen ? this.callbacks.close() : this.callbacks.open();\n };\n const values = document.createElement('div');\n values.classList.add(this.classes.values);\n main.appendChild(values);\n const deselect = document.createElement('div');\n deselect.classList.add(this.classes.deselect);\n const selectedOptions = (_a = this.store) === null || _a === void 0 ? void 0 : _a.getSelectedOptions();\n if (!this.settings.allowDeselect || (this.settings.isMultiple && selectedOptions && selectedOptions.length <= 0)) {\n deselect.classList.add(this.classes.hide);\n }\n else {\n deselect.classList.remove(this.classes.hide);\n }\n deselect.onclick = (e) => {\n e.stopPropagation();\n if (this.settings.disabled) {\n return;\n }\n let shouldDelete = true;\n const before = this.store.getSelectedOptions();\n const after = [];\n if (this.callbacks.beforeChange) {\n shouldDelete = this.callbacks.beforeChange(after, before) === true;\n }\n if (shouldDelete) {\n if (this.settings.isMultiple) {\n this.callbacks.setSelected([], false);\n this.updateDeselectAll();\n }\n else {\n const firstOption = this.store.getFirstOption();\n const value = firstOption ? firstOption.value : '';\n this.callbacks.setSelected(value, false);\n }\n if (this.settings.closeOnSelect) {\n this.callbacks.close();\n }\n if (this.callbacks.afterChange) {\n this.callbacks.afterChange(this.store.getSelectedOptions());\n }\n }\n };\n const deselectSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n deselectSvg.setAttribute('viewBox', '0 0 100 100');\n const deselectPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n deselectPath.setAttribute('d', this.classes.deselectPath);\n deselectSvg.appendChild(deselectPath);\n deselect.appendChild(deselectSvg);\n main.appendChild(deselect);\n const arrow = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n arrow.classList.add(this.classes.arrow);\n arrow.setAttribute('viewBox', '0 0 100 100');\n const arrowPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n arrowPath.setAttribute('d', this.classes.arrowClose);\n if (this.settings.alwaysOpen) {\n arrow.classList.add(this.classes.hide);\n }\n arrow.appendChild(arrowPath);\n main.appendChild(arrow);\n return {\n main: main,\n values: values,\n deselect: {\n main: deselect,\n svg: deselectSvg,\n path: deselectPath,\n },\n arrow: {\n main: arrow,\n path: arrowPath,\n },\n };\n }\n mainFocus(eventType) {\n if (eventType !== 'click') {\n this.main.main.focus({ preventScroll: true });\n }\n }\n placeholder() {\n const placeholderOption = this.store.filter((o) => o.placeholder, false);\n let placeholderText = this.settings.placeholderText;\n if (placeholderOption.length) {\n if (placeholderOption[0].html !== '') {\n placeholderText = placeholderOption[0].html;\n }\n else if (placeholderOption[0].text !== '') {\n placeholderText = placeholderOption[0].text;\n }\n }\n const placeholder = document.createElement('div');\n placeholder.classList.add(this.classes.placeholder);\n placeholder.innerHTML = placeholderText;\n return placeholder;\n }\n renderValues() {\n if (!this.settings.isMultiple) {\n this.renderSingleValue();\n return;\n }\n this.renderMultipleValues();\n this.updateDeselectAll();\n }\n renderSingleValue() {\n const selected = this.store.filter((o) => {\n return o.selected && !o.placeholder;\n }, false);\n const selectedSingle = selected.length > 0 ? selected[0] : null;\n if (!selectedSingle) {\n this.main.values.innerHTML = this.placeholder().outerHTML;\n }\n else {\n const singleValue = document.createElement('div');\n singleValue.classList.add(this.classes.single);\n if (selectedSingle.html) {\n singleValue.innerHTML = selectedSingle.html;\n }\n else {\n singleValue.innerText = selectedSingle.text;\n }\n this.main.values.innerHTML = singleValue.outerHTML;\n }\n if (!this.settings.allowDeselect || !selected.length) {\n this.main.deselect.main.classList.add(this.classes.hide);\n }\n else {\n this.main.deselect.main.classList.remove(this.classes.hide);\n }\n }\n renderMultipleValues() {\n let currentNodes = this.main.values.childNodes;\n let selectedOptions = this.store.filter((opt) => {\n return opt.selected && opt.display;\n }, false);\n if (selectedOptions.length === 0) {\n this.main.values.innerHTML = this.placeholder().outerHTML;\n return;\n }\n else {\n const placeholder = this.main.values.querySelector('.' + this.classes.placeholder);\n if (placeholder) {\n placeholder.remove();\n }\n }\n if (selectedOptions.length > this.settings.maxValuesShown) {\n const singleValue = document.createElement('div');\n singleValue.classList.add(this.classes.max);\n singleValue.textContent = this.settings.maxValuesMessage.replace('{number}', selectedOptions.length.toString());\n this.main.values.innerHTML = singleValue.outerHTML;\n return;\n }\n else {\n const maxValuesMessage = this.main.values.querySelector('.' + this.classes.max);\n if (maxValuesMessage) {\n maxValuesMessage.remove();\n }\n }\n let removeNodes = [];\n for (let i = 0; i < currentNodes.length; i++) {\n const node = currentNodes[i];\n const id = node.getAttribute('data-id');\n if (id) {\n const found = selectedOptions.filter((opt) => {\n return opt.id === id;\n }, false);\n if (!found.length) {\n removeNodes.push(node);\n }\n }\n }\n for (const n of removeNodes) {\n n.classList.add(this.classes.valueOut);\n setTimeout(() => {\n if (this.main.values.hasChildNodes() && this.main.values.contains(n)) {\n this.main.values.removeChild(n);\n }\n }, 100);\n }\n currentNodes = this.main.values.childNodes;\n for (let d = 0; d < selectedOptions.length; d++) {\n let shouldAdd = true;\n for (let i = 0; i < currentNodes.length; i++) {\n if (selectedOptions[d].id === String(currentNodes[i].dataset.id)) {\n shouldAdd = false;\n }\n }\n if (shouldAdd) {\n if (this.settings.keepOrder) {\n this.main.values.appendChild(this.multipleValue(selectedOptions[d]));\n }\n else {\n if (currentNodes.length === 0) {\n this.main.values.appendChild(this.multipleValue(selectedOptions[d]));\n }\n else if (d === 0) {\n this.main.values.insertBefore(this.multipleValue(selectedOptions[d]), currentNodes[d]);\n }\n else {\n currentNodes[d - 1].insertAdjacentElement('afterend', this.multipleValue(selectedOptions[d]));\n }\n }\n }\n }\n }\n multipleValue(option) {\n const value = document.createElement('div');\n value.classList.add(this.classes.value);\n value.dataset.id = option.id;\n const text = document.createElement('div');\n text.classList.add(this.classes.valueText);\n text.innerText = option.text;\n value.appendChild(text);\n if (!option.mandatory) {\n const deleteDiv = document.createElement('div');\n deleteDiv.classList.add(this.classes.valueDelete);\n deleteDiv.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (this.settings.disabled) {\n return;\n }\n let shouldDelete = true;\n const before = this.store.getSelectedOptions();\n const after = before.filter((o) => {\n return o.selected && o.id !== option.id;\n }, true);\n if (this.settings.minSelected && after.length < this.settings.minSelected) {\n return;\n }\n if (this.callbacks.beforeChange) {\n shouldDelete = this.callbacks.beforeChange(after, before) === true;\n }\n if (shouldDelete) {\n let selectedValues = [];\n for (const o of after) {\n if (o instanceof Optgroup) {\n for (const c of o.options) {\n selectedValues.push(c.value);\n }\n }\n if (o instanceof Option) {\n selectedValues.push(o.value);\n }\n }\n this.callbacks.setSelected(selectedValues, false);\n if (this.settings.closeOnSelect) {\n this.callbacks.close();\n }\n if (this.callbacks.afterChange) {\n this.callbacks.afterChange(after);\n }\n this.updateDeselectAll();\n }\n };\n const deleteSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n deleteSvg.setAttribute('viewBox', '0 0 100 100');\n const deletePath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n deletePath.setAttribute('d', this.classes.optionDelete);\n deleteSvg.appendChild(deletePath);\n deleteDiv.appendChild(deleteSvg);\n value.appendChild(deleteDiv);\n }\n return value;\n }\n contentDiv() {\n const main = document.createElement('div');\n main.dataset.id = this.settings.id;\n const search = this.searchDiv();\n main.appendChild(search.main);\n const list = this.listDiv();\n main.appendChild(list);\n return {\n main: main,\n search: search,\n list: list,\n };\n }\n moveContent() {\n if (this.settings.contentPosition === 'relative') {\n this.moveContentBelow();\n return;\n }\n if (this.settings.openPosition === 'down') {\n this.moveContentBelow();\n return;\n }\n else if (this.settings.openPosition === 'up') {\n this.moveContentAbove();\n return;\n }\n if (this.putContent() === 'up') {\n this.moveContentAbove();\n }\n else {\n this.moveContentBelow();\n }\n }\n searchDiv() {\n const main = document.createElement('div');\n const input = document.createElement('input');\n const addable = document.createElement('div');\n main.classList.add(this.classes.search);\n const searchReturn = {\n main,\n input,\n };\n if (!this.settings.showSearch) {\n main.classList.add(this.classes.hide);\n input.readOnly = true;\n }\n input.type = 'search';\n input.placeholder = this.settings.searchPlaceholder;\n input.tabIndex = -1;\n input.setAttribute('aria-label', this.settings.searchPlaceholder);\n input.setAttribute('autocapitalize', 'off');\n input.setAttribute('autocomplete', 'off');\n input.setAttribute('autocorrect', 'off');\n input.oninput = debounce((e) => {\n this.callbacks.search(e.target.value);\n }, 100);\n input.onkeydown = (e) => {\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowDown':\n e.key === 'ArrowDown' ? this.highlight('down') : this.highlight('up');\n return false;\n case 'Tab':\n this.callbacks.close();\n return true;\n case 'Escape':\n this.callbacks.close();\n return false;\n case 'Enter':\n case ' ':\n if (this.callbacks.addable && e.ctrlKey) {\n addable.click();\n return false;\n }\n else {\n const highlighted = this.content.list.querySelector('.' + this.classes.highlighted);\n if (highlighted) {\n highlighted.click();\n return false;\n }\n }\n return true;\n }\n return true;\n };\n main.appendChild(input);\n if (this.callbacks.addable) {\n addable.classList.add(this.classes.addable);\n const plus = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n plus.setAttribute('viewBox', '0 0 100 100');\n const plusPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n plusPath.setAttribute('d', this.classes.addablePath);\n plus.appendChild(plusPath);\n addable.appendChild(plus);\n addable.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!this.callbacks.addable) {\n return;\n }\n const inputValue = this.content.search.input.value.trim();\n if (inputValue === '') {\n this.content.search.input.focus();\n return;\n }\n const runFinish = (oo) => {\n let newOption = new Option(oo);\n this.callbacks.addOption(newOption);\n if (this.settings.isMultiple) {\n let values = this.store.getSelected();\n values.push(newOption.value);\n this.callbacks.setSelected(values, true);\n }\n else {\n this.callbacks.setSelected([newOption.value], true);\n }\n this.callbacks.search('');\n if (this.settings.closeOnSelect) {\n setTimeout(() => {\n this.callbacks.close();\n }, 100);\n }\n };\n const addableValue = this.callbacks.addable(inputValue);\n if (addableValue === false || addableValue === undefined || addableValue === null) {\n return;\n }\n if (addableValue instanceof Promise) {\n addableValue.then((value) => {\n if (typeof value === 'string') {\n runFinish({\n text: value,\n value: value,\n });\n }\n else {\n runFinish(value);\n }\n });\n }\n else if (typeof addableValue === 'string') {\n runFinish({\n text: addableValue,\n value: addableValue,\n });\n }\n else {\n runFinish(addableValue);\n }\n return;\n };\n main.appendChild(addable);\n searchReturn.addable = {\n main: addable,\n svg: plus,\n path: plusPath,\n };\n }\n return searchReturn;\n }\n searchFocus() {\n this.content.search.input.focus();\n }\n getOptions(notPlaceholder = false, notDisabled = false, notHidden = false) {\n let query = '.' + this.classes.option;\n if (notPlaceholder) {\n query += ':not(.' + this.classes.placeholder + ')';\n }\n if (notDisabled) {\n query += ':not(.' + this.classes.disabled + ')';\n }\n if (notHidden) {\n query += ':not(.' + this.classes.hide + ')';\n }\n return Array.from(this.content.list.querySelectorAll(query));\n }\n highlight(dir) {\n const options = this.getOptions(true, true, true);\n if (options.length === 0) {\n return;\n }\n if (options.length === 1) {\n if (!options[0].classList.contains(this.classes.highlighted)) {\n options[0].classList.add(this.classes.highlighted);\n return;\n }\n }\n let highlighted = false;\n for (const o of options) {\n if (o.classList.contains(this.classes.highlighted)) {\n highlighted = true;\n }\n }\n if (!highlighted) {\n for (const o of options) {\n if (o.classList.contains(this.classes.selected)) {\n o.classList.add(this.classes.highlighted);\n break;\n }\n }\n }\n for (let i = 0; i < options.length; i++) {\n if (options[i].classList.contains(this.classes.highlighted)) {\n const prevOption = options[i];\n prevOption.classList.remove(this.classes.highlighted);\n const prevParent = prevOption.parentElement;\n if (prevParent && prevParent.classList.contains(this.classes.open)) {\n const optgroupLabel = prevParent.querySelector('.' + this.classes.optgroupLabel);\n if (optgroupLabel) {\n optgroupLabel.click();\n }\n }\n let selectOption = options[dir === 'down' ? (i + 1 < options.length ? i + 1 : 0) : i - 1 >= 0 ? i - 1 : options.length - 1];\n selectOption.classList.add(this.classes.highlighted);\n this.ensureElementInView(this.content.list, selectOption);\n const selectParent = selectOption.parentElement;\n if (selectParent && selectParent.classList.contains(this.classes.close)) {\n const optgroupLabel = selectParent.querySelector('.' + this.classes.optgroupLabel);\n if (optgroupLabel) {\n optgroupLabel.click();\n }\n }\n return;\n }\n }\n options[dir === 'down' ? 0 : options.length - 1].classList.add(this.classes.highlighted);\n this.ensureElementInView(this.content.list, options[dir === 'down' ? 0 : options.length - 1]);\n }\n listDiv() {\n const options = document.createElement('div');\n options.classList.add(this.classes.list);\n return options;\n }\n renderError(error) {\n this.content.list.innerHTML = '';\n const errorDiv = document.createElement('div');\n errorDiv.classList.add(this.classes.error);\n errorDiv.textContent = error;\n this.content.list.appendChild(errorDiv);\n }\n renderSearching() {\n this.content.list.innerHTML = '';\n const searchingDiv = document.createElement('div');\n searchingDiv.classList.add(this.classes.searching);\n searchingDiv.textContent = this.settings.searchingText;\n this.content.list.appendChild(searchingDiv);\n }\n renderOptions(data) {\n this.content.list.innerHTML = '';\n if (data.length === 0) {\n const noResults = document.createElement('div');\n noResults.classList.add(this.classes.search);\n noResults.innerHTML = this.settings.searchText;\n this.content.list.appendChild(noResults);\n return;\n }\n for (const d of data) {\n if (d instanceof Optgroup) {\n const optgroupEl = document.createElement('div');\n optgroupEl.classList.add(this.classes.optgroup);\n const optgroupLabel = document.createElement('div');\n optgroupLabel.classList.add(this.classes.optgroupLabel);\n optgroupEl.appendChild(optgroupLabel);\n const optgroupLabelText = document.createElement('div');\n optgroupLabelText.classList.add(this.classes.optgroupLabelText);\n optgroupLabelText.textContent = d.label;\n optgroupLabel.appendChild(optgroupLabelText);\n const optgroupActions = document.createElement('div');\n optgroupActions.classList.add(this.classes.optgroupActions);\n optgroupLabel.appendChild(optgroupActions);\n if (this.settings.isMultiple && d.selectAll) {\n const selectAll = document.createElement('div');\n selectAll.classList.add(this.classes.optgroupSelectAll);\n let allSelected = true;\n for (const o of d.options) {\n if (!o.selected) {\n allSelected = false;\n break;\n }\n }\n if (allSelected) {\n selectAll.classList.add(this.classes.selected);\n }\n const selectAllText = document.createElement('span');\n selectAllText.textContent = d.selectAllText;\n selectAll.appendChild(selectAllText);\n const selectAllSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n selectAllSvg.setAttribute('viewBox', '0 0 100 100');\n selectAll.appendChild(selectAllSvg);\n const selectAllBox = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n selectAllBox.setAttribute('d', this.classes.optgroupSelectAllBox);\n selectAllSvg.appendChild(selectAllBox);\n const selectAllCheck = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n selectAllCheck.setAttribute('d', this.classes.optgroupSelectAllCheck);\n selectAllSvg.appendChild(selectAllCheck);\n selectAll.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const currentSelected = this.store.getSelected();\n if (allSelected) {\n const newSelected = currentSelected.filter((s) => {\n for (const o of d.options) {\n if (s === o.value) {\n return false;\n }\n }\n return true;\n });\n this.callbacks.setSelected(newSelected, true);\n return;\n }\n else {\n const newSelected = currentSelected.concat(d.options.map((o) => o.value));\n for (const o of d.options) {\n if (!this.store.getOptionByID(o.id)) {\n this.callbacks.addOption(o);\n }\n }\n this.callbacks.setSelected(newSelected, true);\n return;\n }\n });\n optgroupActions.appendChild(selectAll);\n }\n if (d.closable !== 'off') {\n const optgroupClosable = document.createElement('div');\n optgroupClosable.classList.add(this.classes.optgroupClosable);\n const optgroupClosableSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n optgroupClosableSvg.setAttribute('viewBox', '0 0 100 100');\n optgroupClosableSvg.classList.add(this.classes.arrow);\n optgroupClosable.appendChild(optgroupClosableSvg);\n const optgroupClosableArrow = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n optgroupClosableSvg.appendChild(optgroupClosableArrow);\n if (d.options.some((o) => o.selected) || this.content.search.input.value.trim() !== '') {\n optgroupClosable.classList.add(this.classes.open);\n optgroupClosableArrow.setAttribute('d', this.classes.arrowOpen);\n }\n else if (d.closable === 'open') {\n optgroupEl.classList.add(this.classes.open);\n optgroupClosableArrow.setAttribute('d', this.classes.arrowOpen);\n }\n else if (d.closable === 'close') {\n optgroupEl.classList.add(this.classes.close);\n optgroupClosableArrow.setAttribute('d', this.classes.arrowClose);\n }\n optgroupLabel.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (optgroupEl.classList.contains(this.classes.close)) {\n optgroupEl.classList.remove(this.classes.close);\n optgroupEl.classList.add(this.classes.open);\n optgroupClosableArrow.setAttribute('d', this.classes.arrowOpen);\n }\n else {\n optgroupEl.classList.remove(this.classes.open);\n optgroupEl.classList.add(this.classes.close);\n optgroupClosableArrow.setAttribute('d', this.classes.arrowClose);\n }\n });\n optgroupActions.appendChild(optgroupClosable);\n }\n optgroupEl.appendChild(optgroupLabel);\n for (const o of d.options) {\n optgroupEl.appendChild(this.option(o));\n }\n this.content.list.appendChild(optgroupEl);\n }\n if (d instanceof Option) {\n this.content.list.appendChild(this.option(d));\n }\n }\n }\n option(option) {\n if (option.placeholder) {\n const placeholder = document.createElement('div');\n placeholder.classList.add(this.classes.option);\n placeholder.classList.add(this.classes.hide);\n return placeholder;\n }\n const optionEl = document.createElement('div');\n optionEl.dataset.id = option.id;\n optionEl.id = option.id;\n optionEl.classList.add(this.classes.option);\n optionEl.setAttribute('role', 'option');\n if (option.class) {\n option.class.split(' ').forEach((dataClass) => {\n optionEl.classList.add(dataClass);\n });\n }\n if (option.style) {\n optionEl.style.cssText = option.style;\n }\n if (this.settings.searchHighlight && this.content.search.input.value.trim() !== '') {\n optionEl.innerHTML = this.highlightText(option.html !== '' ? option.html : option.text, this.content.search.input.value, this.classes.searchHighlighter);\n }\n else if (option.html !== '') {\n optionEl.innerHTML = option.html;\n }\n else {\n optionEl.textContent = option.text;\n }\n if (this.settings.showOptionTooltips && optionEl.textContent) {\n optionEl.setAttribute('title', optionEl.textContent);\n }\n if (!option.display) {\n optionEl.classList.add(this.classes.hide);\n }\n if (option.disabled) {\n optionEl.classList.add(this.classes.disabled);\n }\n if (option.selected && this.settings.hideSelected) {\n optionEl.classList.add(this.classes.hide);\n }\n if (option.selected) {\n optionEl.classList.add(this.classes.selected);\n optionEl.setAttribute('aria-selected', 'true');\n this.main.main.setAttribute('aria-activedescendant', optionEl.id);\n }\n else {\n optionEl.classList.remove(this.classes.selected);\n optionEl.setAttribute('aria-selected', 'false');\n }\n optionEl.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const selectedOptions = this.store.getSelected();\n const element = e.currentTarget;\n const elementID = String(element.dataset.id);\n if (option.disabled || (option.selected && !this.settings.allowDeselect)) {\n return;\n }\n if ((this.settings.isMultiple && this.settings.maxSelected <= selectedOptions.length && !option.selected) ||\n (this.settings.isMultiple && this.settings.minSelected >= selectedOptions.length && option.selected)) {\n return;\n }\n let shouldUpdate = false;\n const before = this.store.getSelectedOptions();\n let after = [];\n if (this.settings.isMultiple) {\n if (option.selected) {\n after = before.filter((o) => o.id !== elementID);\n }\n else {\n after = before.concat(option);\n }\n }\n if (!this.settings.isMultiple) {\n if (option.selected) {\n after = [];\n }\n else {\n after = [option];\n }\n }\n if (!this.callbacks.beforeChange) {\n shouldUpdate = true;\n }\n if (this.callbacks.beforeChange) {\n if (this.callbacks.beforeChange(after, before) === false) {\n shouldUpdate = false;\n }\n else {\n shouldUpdate = true;\n }\n }\n if (shouldUpdate) {\n if (!this.store.getOptionByID(elementID)) {\n this.callbacks.addOption(option);\n }\n this.callbacks.setSelected(after.map((o) => o.value), false);\n if (this.settings.closeOnSelect) {\n this.callbacks.close();\n }\n if (this.callbacks.afterChange) {\n this.callbacks.afterChange(after);\n }\n }\n });\n return optionEl;\n }\n destroy() {\n this.main.main.remove();\n this.content.main.remove();\n }\n highlightText(str, search, className) {\n let completedString = str;\n const regex = new RegExp('(' + search.trim() + ')(?![^<]*>[^<>]*${originalTextFoundByRegex}`);\n return completedString;\n }\n moveContentAbove() {\n const mainHeight = this.main.main.offsetHeight;\n const contentHeight = this.content.main.offsetHeight;\n this.main.main.classList.remove(this.classes.openBelow);\n this.main.main.classList.add(this.classes.openAbove);\n this.content.main.classList.remove(this.classes.openBelow);\n this.content.main.classList.add(this.classes.openAbove);\n const containerRect = this.main.main.getBoundingClientRect();\n this.content.main.style.margin = '-' + (mainHeight + contentHeight - 1) + 'px 0px 0px 0px';\n this.content.main.style.top = containerRect.top + containerRect.height + window.scrollY + 'px';\n this.content.main.style.left = containerRect.left + window.scrollX + 'px';\n this.content.main.style.width = containerRect.width + 'px';\n }\n moveContentBelow() {\n this.main.main.classList.remove(this.classes.openAbove);\n this.main.main.classList.add(this.classes.openBelow);\n this.content.main.classList.remove(this.classes.openAbove);\n this.content.main.classList.add(this.classes.openBelow);\n const containerRect = this.main.main.getBoundingClientRect();\n this.content.main.style.margin = '-1px 0px 0px 0px';\n if (this.settings.contentPosition !== 'relative') {\n this.content.main.style.top = containerRect.top + containerRect.height + window.scrollY + 'px';\n this.content.main.style.left = containerRect.left + window.scrollX + 'px';\n this.content.main.style.width = containerRect.width + 'px';\n }\n }\n ensureElementInView(container, element) {\n const cTop = container.scrollTop + container.offsetTop;\n const cBottom = cTop + container.clientHeight;\n const eTop = element.offsetTop;\n const eBottom = eTop + element.clientHeight;\n if (eTop < cTop) {\n container.scrollTop -= cTop - eTop;\n }\n else if (eBottom > cBottom) {\n container.scrollTop += eBottom - cBottom;\n }\n }\n putContent() {\n const mainHeight = this.main.main.offsetHeight;\n const mainRect = this.main.main.getBoundingClientRect();\n const contentHeight = this.content.main.offsetHeight;\n const spaceBelow = window.innerHeight - (mainRect.top + mainHeight);\n if (spaceBelow <= contentHeight) {\n if (mainRect.top > contentHeight) {\n return 'up';\n }\n else {\n return 'down';\n }\n }\n return 'down';\n }\n updateDeselectAll() {\n if (!this.store || !this.settings) {\n return;\n }\n const selected = this.store.getSelectedOptions();\n const hasSelectedItems = selected && selected.length > 0;\n const isMultiple = this.settings.isMultiple;\n const allowDeselect = this.settings.allowDeselect;\n const deselectButton = this.main.deselect.main;\n const hideClass = this.classes.hide;\n if (allowDeselect && !(isMultiple && !hasSelectedItems)) {\n deselectButton.classList.remove(hideClass);\n }\n else {\n deselectButton.classList.add(hideClass);\n }\n }\n }\n\n class Select {\n constructor(select) {\n this.listen = false;\n this.observer = null;\n this.select = select;\n this.valueChange = this.valueChange.bind(this);\n this.select.addEventListener('change', this.valueChange, {\n passive: true,\n });\n this.observer = new MutationObserver(this.observeCall.bind(this));\n this.changeListen(true);\n }\n enable() {\n this.select.disabled = false;\n }\n disable() {\n this.select.disabled = true;\n }\n hideUI() {\n this.select.tabIndex = -1;\n this.select.style.display = 'none';\n this.select.setAttribute('aria-hidden', 'true');\n }\n showUI() {\n this.select.removeAttribute('tabindex');\n this.select.style.display = '';\n this.select.removeAttribute('aria-hidden');\n }\n changeListen(listen) {\n this.listen = listen;\n if (listen) {\n if (this.observer) {\n this.observer.observe(this.select, {\n subtree: true,\n childList: true,\n attributes: true,\n });\n }\n }\n if (!listen) {\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n }\n valueChange(ev) {\n if (this.listen && this.onValueChange) {\n this.onValueChange(this.getSelectedValues());\n }\n return true;\n }\n observeCall(mutations) {\n if (!this.listen) {\n return;\n }\n let classChanged = false;\n let disabledChanged = false;\n let optgroupOptionChanged = false;\n for (const m of mutations) {\n if (m.target === this.select) {\n if (m.attributeName === 'disabled') {\n disabledChanged = true;\n }\n if (m.attributeName === 'class') {\n classChanged = true;\n }\n }\n if (m.target.nodeName === 'OPTGROUP' || m.target.nodeName === 'OPTION') {\n optgroupOptionChanged = true;\n }\n }\n if (classChanged && this.onClassChange) {\n this.onClassChange(this.select.className.split(' '));\n }\n if (disabledChanged && this.onDisabledChange) {\n this.changeListen(false);\n this.onDisabledChange(this.select.disabled);\n this.changeListen(true);\n }\n if (optgroupOptionChanged && this.onOptionsChange) {\n this.changeListen(false);\n this.onOptionsChange(this.getData());\n this.changeListen(true);\n }\n }\n getData() {\n let data = [];\n const nodes = this.select.childNodes;\n for (const n of nodes) {\n if (n.nodeName === 'OPTGROUP') {\n data.push(this.getDataFromOptgroup(n));\n }\n if (n.nodeName === 'OPTION') {\n data.push(this.getDataFromOption(n));\n }\n }\n return data;\n }\n getDataFromOptgroup(optgroup) {\n let data = {\n id: optgroup.id,\n label: optgroup.label,\n selectAll: optgroup.dataset ? optgroup.dataset.selectall === 'true' : false,\n selectAllText: optgroup.dataset ? optgroup.dataset.selectalltext : 'Select all',\n closable: optgroup.dataset ? optgroup.dataset.closable : 'off',\n options: [],\n };\n const options = optgroup.childNodes;\n for (const o of options) {\n if (o.nodeName === 'OPTION') {\n data.options.push(this.getDataFromOption(o));\n }\n }\n return data;\n }\n getDataFromOption(option) {\n return {\n id: option.id,\n value: option.value,\n text: option.text,\n html: option.dataset && option.dataset.html ? option.dataset.html : '',\n selected: option.selected,\n display: option.style.display === 'none' ? false : true,\n disabled: option.disabled,\n mandatory: option.dataset ? option.dataset.mandatory === 'true' : false,\n placeholder: option.dataset.placeholder === 'true',\n class: option.className,\n style: option.style.cssText,\n data: option.dataset,\n };\n }\n getSelectedValues() {\n let values = [];\n const options = this.select.childNodes;\n for (const o of options) {\n if (o.nodeName === 'OPTGROUP') {\n const optgroupOptions = o.childNodes;\n for (const oo of optgroupOptions) {\n if (oo.nodeName === 'OPTION') {\n const option = oo;\n if (option.selected) {\n values.push(option.value);\n }\n }\n }\n }\n if (o.nodeName === 'OPTION') {\n const option = o;\n if (option.selected) {\n values.push(option.value);\n }\n }\n }\n return values;\n }\n setSelected(value) {\n this.changeListen(false);\n const options = this.select.childNodes;\n for (const o of options) {\n if (o.nodeName === 'OPTGROUP') {\n const optgroup = o;\n const optgroupOptions = optgroup.childNodes;\n for (const oo of optgroupOptions) {\n if (oo.nodeName === 'OPTION') {\n const option = oo;\n option.selected = value.includes(option.value);\n }\n }\n }\n if (o.nodeName === 'OPTION') {\n const option = o;\n option.selected = value.includes(option.value);\n }\n }\n this.changeListen(true);\n }\n updateSelect(id, style, classes) {\n this.changeListen(false);\n if (id) {\n this.select.dataset.id = id;\n }\n if (style) {\n this.select.style.cssText = style;\n }\n if (classes) {\n this.select.className = '';\n classes.forEach((c) => {\n if (c.trim() !== '') {\n this.select.classList.add(c.trim());\n }\n });\n }\n this.changeListen(true);\n }\n updateOptions(data) {\n this.changeListen(false);\n this.select.innerHTML = '';\n for (const d of data) {\n if (d instanceof Optgroup) {\n this.select.appendChild(this.createOptgroup(d));\n }\n if (d instanceof Option) {\n this.select.appendChild(this.createOption(d));\n }\n }\n this.select.dispatchEvent(new Event('change'));\n this.changeListen(true);\n }\n createOptgroup(optgroup) {\n const optgroupEl = document.createElement('optgroup');\n optgroupEl.id = optgroup.id;\n optgroupEl.label = optgroup.label;\n if (optgroup.selectAll) {\n optgroupEl.dataset.selectAll = 'true';\n }\n if (optgroup.closable !== 'off') {\n optgroupEl.dataset.closable = optgroup.closable;\n }\n if (optgroup.options) {\n for (const o of optgroup.options) {\n optgroupEl.appendChild(this.createOption(o));\n }\n }\n return optgroupEl;\n }\n createOption(info) {\n const optionEl = document.createElement('option');\n optionEl.id = info.id;\n optionEl.value = info.value;\n optionEl.innerHTML = info.text;\n if (info.html !== '') {\n optionEl.setAttribute('data-html', info.html);\n }\n if (info.selected) {\n optionEl.selected = info.selected;\n }\n if (info.disabled) {\n optionEl.disabled = true;\n }\n if (info.display === false) {\n optionEl.style.display = 'none';\n }\n if (info.placeholder) {\n optionEl.setAttribute('data-placeholder', 'true');\n }\n if (info.mandatory) {\n optionEl.setAttribute('data-mandatory', 'true');\n }\n if (info.class) {\n info.class.split(' ').forEach((optionClass) => {\n optionEl.classList.add(optionClass);\n });\n }\n if (info.data && typeof info.data === 'object') {\n Object.keys(info.data).forEach((key) => {\n optionEl.setAttribute('data-' + kebabCase(key), info.data[key]);\n });\n }\n return optionEl;\n }\n destroy() {\n this.changeListen(false);\n this.select.removeEventListener('change', this.valueChange);\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n delete this.select.dataset.id;\n this.showUI();\n }\n }\n\n class Settings {\n constructor(settings) {\n this.id = '';\n this.style = '';\n this.class = [];\n this.isMultiple = false;\n this.isOpen = false;\n this.isFullOpen = false;\n this.intervalMove = null;\n if (!settings) {\n settings = {};\n }\n this.id = 'ss-' + generateID();\n this.style = settings.style || '';\n this.class = settings.class || [];\n this.disabled = settings.disabled !== undefined ? settings.disabled : false;\n this.alwaysOpen = settings.alwaysOpen !== undefined ? settings.alwaysOpen : false;\n this.showSearch = settings.showSearch !== undefined ? settings.showSearch : true;\n this.ariaLabel = settings.ariaLabel || 'Combobox';\n this.searchPlaceholder = settings.searchPlaceholder || 'Search';\n this.searchText = settings.searchText || 'No Results';\n this.searchingText = settings.searchingText || 'Searching...';\n this.searchHighlight = settings.searchHighlight !== undefined ? settings.searchHighlight : false;\n this.closeOnSelect = settings.closeOnSelect !== undefined ? settings.closeOnSelect : true;\n this.contentLocation = settings.contentLocation || document.body;\n this.contentPosition = settings.contentPosition || 'absolute';\n this.openPosition = settings.openPosition || 'auto';\n this.placeholderText = settings.placeholderText !== undefined ? settings.placeholderText : 'Select Value';\n this.allowDeselect = settings.allowDeselect !== undefined ? settings.allowDeselect : false;\n this.hideSelected = settings.hideSelected !== undefined ? settings.hideSelected : false;\n this.keepOrder = settings.keepOrder !== undefined ? settings.keepOrder : false;\n this.showOptionTooltips = settings.showOptionTooltips !== undefined ? settings.showOptionTooltips : false;\n this.minSelected = settings.minSelected || 0;\n this.maxSelected = settings.maxSelected || 1000;\n this.timeoutDelay = settings.timeoutDelay || 200;\n this.maxValuesShown = settings.maxValuesShown || 20;\n this.maxValuesMessage = settings.maxValuesMessage || '{number} selected';\n }\n }\n\n class SlimSelect {\n constructor(config) {\n var _a;\n this.events = {\n search: undefined,\n searchFilter: (opt, search) => {\n return opt.text.toLowerCase().indexOf(search.toLowerCase()) !== -1;\n },\n addable: undefined,\n beforeChange: undefined,\n afterChange: undefined,\n beforeOpen: undefined,\n afterOpen: undefined,\n beforeClose: undefined,\n afterClose: undefined,\n };\n this.windowResize = debounce(() => {\n if (!this.settings.isOpen && !this.settings.isFullOpen) {\n return;\n }\n this.render.moveContent();\n });\n this.windowScroll = debounce(() => {\n if (!this.settings.isOpen && !this.settings.isFullOpen) {\n return;\n }\n this.render.moveContent();\n });\n this.documentClick = (e) => {\n if (!this.settings.isOpen) {\n return;\n }\n if (e.target && !hasClassInTree(e.target, this.settings.id)) {\n this.close(e.type);\n }\n };\n this.windowVisibilityChange = () => {\n if (document.hidden) {\n this.close();\n }\n };\n this.selectEl = (typeof config.select === 'string' ? document.querySelector(config.select) : config.select);\n if (!this.selectEl) {\n if (config.events && config.events.error) {\n config.events.error(new Error('Could not find select element'));\n }\n return;\n }\n if (this.selectEl.tagName !== 'SELECT') {\n if (config.events && config.events.error) {\n config.events.error(new Error('Element isnt of type select'));\n }\n return;\n }\n if (this.selectEl.dataset.ssid) {\n this.destroy();\n }\n this.settings = new Settings(config.settings);\n const debounceEvents = ['afterChange', 'beforeOpen', 'afterOpen', 'beforeClose', 'afterClose'];\n for (const key in config.events) {\n if (!config.events.hasOwnProperty(key)) {\n continue;\n }\n if (debounceEvents.indexOf(key) !== -1) {\n this.events[key] = debounce(config.events[key], 100);\n }\n else {\n this.events[key] = config.events[key];\n }\n }\n this.settings.disabled = ((_a = config.settings) === null || _a === void 0 ? void 0 : _a.disabled) ? config.settings.disabled : this.selectEl.disabled;\n this.settings.isMultiple = this.selectEl.multiple;\n this.settings.style = this.selectEl.style.cssText;\n this.settings.class = this.selectEl.className.split(' ');\n this.select = new Select(this.selectEl);\n this.select.updateSelect(this.settings.id, this.settings.style, this.settings.class);\n this.select.hideUI();\n this.select.onValueChange = (values) => {\n this.setSelected(values);\n };\n this.select.onClassChange = (classes) => {\n this.settings.class = classes;\n this.render.updateClassStyles();\n };\n this.select.onDisabledChange = (disabled) => {\n if (disabled) {\n this.disable();\n }\n else {\n this.enable();\n }\n };\n this.select.onOptionsChange = (data) => {\n this.setData(data);\n };\n this.store = new Store(this.settings.isMultiple ? 'multiple' : 'single', config.data ? config.data : this.select.getData());\n if (config.data) {\n this.select.updateOptions(this.store.getData());\n }\n const renderCallbacks = {\n open: this.open.bind(this),\n close: this.close.bind(this),\n addable: this.events.addable ? this.events.addable : undefined,\n setSelected: this.setSelected.bind(this),\n addOption: this.addOption.bind(this),\n search: this.search.bind(this),\n beforeChange: this.events.beforeChange,\n afterChange: this.events.afterChange,\n };\n this.render = new Render(this.settings, this.store, renderCallbacks);\n this.render.renderValues();\n this.render.renderOptions(this.store.getData());\n const selectAriaLabel = this.selectEl.getAttribute('aria-label');\n const selectAriaLabelledBy = this.selectEl.getAttribute('aria-labelledby');\n if (selectAriaLabel) {\n this.render.main.main.setAttribute('aria-label', selectAriaLabel);\n }\n else if (selectAriaLabelledBy) {\n this.render.main.main.setAttribute('aria-labelledby', selectAriaLabelledBy);\n }\n if (this.selectEl.parentNode) {\n this.selectEl.parentNode.insertBefore(this.render.main.main, this.selectEl.nextSibling);\n }\n window.addEventListener('resize', this.windowResize, false);\n if (this.settings.openPosition === 'auto') {\n window.addEventListener('scroll', this.windowScroll, false);\n }\n document.addEventListener('visibilitychange', this.windowVisibilityChange);\n if (this.settings.disabled) {\n this.disable();\n }\n if (this.settings.alwaysOpen) {\n this.open();\n }\n this.selectEl.slim = this;\n }\n enable() {\n this.settings.disabled = false;\n this.select.enable();\n this.render.enable();\n }\n disable() {\n this.settings.disabled = true;\n this.select.disable();\n this.render.disable();\n }\n getData() {\n return this.store.getData();\n }\n setData(data) {\n const selected = this.store.getSelected();\n const err = this.store.validateDataArray(data);\n if (err) {\n if (this.events.error) {\n this.events.error(err);\n }\n return;\n }\n this.store.setData(data);\n const dataClean = this.store.getData();\n this.select.updateOptions(dataClean);\n this.render.renderValues();\n this.render.renderOptions(dataClean);\n if (this.events.afterChange && !isEqual(selected, this.store.getSelected())) {\n this.events.afterChange(this.store.getSelectedOptions());\n }\n }\n getSelected() {\n return this.store.getSelected();\n }\n setSelected(value, runAfterChange = true) {\n const selected = this.store.getSelected();\n this.store.setSelectedBy('value', Array.isArray(value) ? value : [value]);\n const data = this.store.getData();\n this.select.updateOptions(data);\n this.render.renderValues();\n if (this.render.content.search.input.value !== '') {\n this.search(this.render.content.search.input.value);\n }\n else {\n this.render.renderOptions(data);\n }\n if (runAfterChange && this.events.afterChange && !isEqual(selected, this.store.getSelected())) {\n this.events.afterChange(this.store.getSelectedOptions());\n }\n }\n addOption(option) {\n const selected = this.store.getSelected();\n if (!this.store.getDataOptions().some((o) => { var _a; return o.value === ((_a = option.value) !== null && _a !== void 0 ? _a : option.text); })) {\n this.store.addOption(option);\n }\n const data = this.store.getData();\n this.select.updateOptions(data);\n this.render.renderValues();\n this.render.renderOptions(data);\n if (this.events.afterChange && !isEqual(selected, this.store.getSelected())) {\n this.events.afterChange(this.store.getSelectedOptions());\n }\n }\n open() {\n if (this.settings.disabled || this.settings.isOpen) {\n return;\n }\n if (this.events.beforeOpen) {\n this.events.beforeOpen();\n }\n this.render.open();\n if (this.settings.showSearch) {\n this.render.searchFocus();\n }\n this.settings.isOpen = true;\n setTimeout(() => {\n if (this.events.afterOpen) {\n this.events.afterOpen();\n }\n if (this.settings.isOpen) {\n this.settings.isFullOpen = true;\n }\n document.addEventListener('click', this.documentClick);\n }, this.settings.timeoutDelay);\n if (this.settings.contentPosition === 'absolute') {\n if (this.settings.intervalMove) {\n clearInterval(this.settings.intervalMove);\n }\n this.settings.intervalMove = setInterval(this.render.moveContent.bind(this.render), 500);\n }\n }\n close(eventType = null) {\n if (!this.settings.isOpen || this.settings.alwaysOpen) {\n return;\n }\n if (this.events.beforeClose) {\n this.events.beforeClose();\n }\n this.render.close();\n if (this.render.content.search.input.value !== '') {\n this.search('');\n }\n this.render.mainFocus(eventType);\n this.settings.isOpen = false;\n this.settings.isFullOpen = false;\n setTimeout(() => {\n if (this.events.afterClose) {\n this.events.afterClose();\n }\n document.removeEventListener('click', this.documentClick);\n }, this.settings.timeoutDelay);\n if (this.settings.intervalMove) {\n clearInterval(this.settings.intervalMove);\n }\n }\n search(value) {\n if (this.render.content.search.input.value !== value) {\n this.render.content.search.input.value = value;\n }\n if (!this.events.search) {\n this.render.renderOptions(value === '' ? this.store.getData() : this.store.search(value, this.events.searchFilter));\n return;\n }\n this.render.renderSearching();\n const searchResp = this.events.search(value, this.store.getSelectedOptions());\n if (searchResp instanceof Promise) {\n searchResp\n .then((data) => {\n this.render.renderOptions(this.store.partialToFullData(data));\n })\n .catch((err) => {\n this.render.renderError(typeof err === 'string' ? err : err.message);\n });\n return;\n }\n else if (Array.isArray(searchResp)) {\n this.render.renderOptions(this.store.partialToFullData(searchResp));\n }\n else {\n this.render.renderError('Search event must return a promise or an array of data');\n }\n }\n destroy() {\n document.removeEventListener('click', this.documentClick);\n window.removeEventListener('resize', this.windowResize, false);\n if (this.settings.openPosition === 'auto') {\n window.removeEventListener('scroll', this.windowScroll, false);\n }\n document.removeEventListener('visibilitychange', this.windowVisibilityChange);\n this.store.setData([]);\n this.render.destroy();\n this.select.destroy();\n }\n }\n\n return SlimSelect;\n\n}));\n", "/*\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 [``](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 = '';\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 = '';\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 , the browser generates a click on its\r\n\t\t//